From 20076ad0b895ab43a3dab52c731fe28f8f6daaea Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Wed, 30 Sep 2009 21:14:53 +0000 Subject: [PATCH] Tagged v1.5.3 release --- AUTHORS | 84 + COPYING | 354 + Changelog | 562 ++ INSTALL | 45 + NEWS | 4 + README | 34 + TODO | 2 + configure | 1573 +++++ doc/qbittorrent.1 | 28 + qBittorrent.kdevelop | 199 + qbittorrent.pro | 6 + qbittorrent.qc | 19 + qcm/libboost.qcm | 56 + qcm/libcurl.qcm | 61 + qcm/libmagick.qcm | 76 + qcm/libtorrent-rasterbar.qcm | 29 + qcm/libzzip.qcm | 71 + qcm/qt4.qcm | 20 + src/DLListDelegate.h | 116 + src/FeedDownloader.h | 480 ++ src/FeedDownloader.ui | 546 ++ src/FinishedListDelegate.h | 98 + src/FinishedTorrents.cpp | 640 ++ src/FinishedTorrents.h | 104 + src/GUI.cpp | 1669 +++++ src/GUI.h | 213 + src/Icons/downarrow.png | Bin 0 -> 722 bytes src/Icons/flags/brazil.png | Bin 0 -> 799 bytes src/Icons/flags/bulgaria.png | Bin 0 -> 200 bytes src/Icons/flags/china.png | Bin 0 -> 329 bytes src/Icons/flags/czech.png | Bin 0 -> 455 bytes src/Icons/flags/denmark.png | Bin 0 -> 270 bytes src/Icons/flags/finland.png | Bin 0 -> 290 bytes src/Icons/flags/france.png | Bin 0 -> 160 bytes src/Icons/flags/germany.png | Bin 0 -> 195 bytes src/Icons/flags/greece.png | Bin 0 -> 465 bytes src/Icons/flags/hungary.png | Bin 0 -> 172 bytes src/Icons/flags/italy.png | Bin 0 -> 171 bytes src/Icons/flags/japan.png | Bin 0 -> 324 bytes src/Icons/flags/netherlands.png | Bin 0 -> 195 bytes src/Icons/flags/norway.png | Bin 0 -> 464 bytes src/Icons/flags/poland.png | Bin 0 -> 212 bytes src/Icons/flags/portugal.png | Bin 0 -> 566 bytes src/Icons/flags/romania.png | Bin 0 -> 160 bytes src/Icons/flags/russia.png | Bin 0 -> 197 bytes src/Icons/flags/slovakia.png | Bin 0 -> 525 bytes src/Icons/flags/south_korea.png | Bin 0 -> 1173 bytes src/Icons/flags/spain.png | Bin 0 -> 416 bytes src/Icons/flags/spain_catalunya.png | Bin 0 -> 236 bytes src/Icons/flags/sweden.png | Bin 0 -> 332 bytes src/Icons/flags/taiwan.png | Bin 0 -> 333 bytes src/Icons/flags/turkey.png | Bin 0 -> 516 bytes src/Icons/flags/ukraine.png | Bin 0 -> 198 bytes src/Icons/flags/united_kingdom.png | Bin 0 -> 1205 bytes src/Icons/loading.png | Bin 0 -> 248 bytes src/Icons/locale.png | Bin 0 -> 1319 bytes src/Icons/magnet.png | Bin 0 -> 7199 bytes .../oxygen/application-x-kgetlist-no.png | Bin 0 -> 743 bytes src/Icons/oxygen/application-x-kgetlist.png | Bin 0 -> 659 bytes src/Icons/oxygen/browse.png | Bin 0 -> 796 bytes src/Icons/oxygen/bt_settings.png | Bin 0 -> 3254 bytes src/Icons/oxygen/bug.png | Bin 0 -> 733 bytes src/Icons/oxygen/button_cancel.png | Bin 0 -> 1333 bytes src/Icons/oxygen/button_ok.png | Bin 0 -> 1076 bytes src/Icons/oxygen/connection.png | Bin 0 -> 1267 bytes src/Icons/oxygen/document-new.png | Bin 0 -> 873 bytes src/Icons/oxygen/download.png | Bin 0 -> 1705 bytes src/Icons/oxygen/edit-clear.png | Bin 0 -> 2073 bytes src/Icons/oxygen/edit-copy.png | Bin 0 -> 860 bytes src/Icons/oxygen/edit-cut.png | Bin 0 -> 892 bytes src/Icons/oxygen/edit-find.png | Bin 0 -> 627 bytes src/Icons/oxygen/edit-paste.png | Bin 0 -> 937 bytes src/Icons/oxygen/edit_clear.png | Bin 0 -> 575 bytes src/Icons/oxygen/encrypted.png | Bin 0 -> 750 bytes src/Icons/oxygen/file.png | Bin 0 -> 704 bytes src/Icons/oxygen/filter.png | Bin 0 -> 885 bytes src/Icons/oxygen/folder-new.png | Bin 0 -> 923 bytes src/Icons/oxygen/folder.png | Bin 0 -> 449 bytes src/Icons/oxygen/gear.png | Bin 0 -> 1403 bytes src/Icons/oxygen/list-add.png | Bin 0 -> 907 bytes src/Icons/oxygen/list-remove.png | Bin 0 -> 498 bytes src/Icons/oxygen/log.png | Bin 0 -> 541 bytes src/Icons/oxygen/mail-folder-inbox.png | Bin 0 -> 739 bytes src/Icons/oxygen/preferences-desktop.png | Bin 0 -> 2245 bytes src/Icons/oxygen/proxy.png | Bin 0 -> 1056 bytes src/Icons/oxygen/remove.png | Bin 0 -> 1270 bytes src/Icons/oxygen/subscribe.png | Bin 0 -> 1611 bytes src/Icons/oxygen/subscribe16.png | Bin 0 -> 752 bytes src/Icons/oxygen/tab-close.png | Bin 0 -> 1349 bytes src/Icons/oxygen/time.png | Bin 0 -> 856 bytes src/Icons/oxygen/unavailable.png | Bin 0 -> 813 bytes src/Icons/oxygen/unsubscribe.png | Bin 0 -> 1694 bytes src/Icons/oxygen/unsubscribe16.png | Bin 0 -> 765 bytes src/Icons/oxygen/view-refresh.png | Bin 0 -> 2182 bytes src/Icons/oxygen/wallet.png | Bin 0 -> 1255 bytes src/Icons/oxygen/webui.png | Bin 0 -> 1577 bytes src/Icons/qBittorrent.desktop | 35 + src/Icons/rss16.png | Bin 0 -> 607 bytes src/Icons/rss32.png | Bin 0 -> 1331 bytes src/Icons/skin/connected.png | Bin 0 -> 1412 bytes src/Icons/skin/decrease.png | Bin 0 -> 5174 bytes src/Icons/skin/delete.png | Bin 0 -> 2350 bytes src/Icons/skin/delete_all.png | Bin 0 -> 2492 bytes src/Icons/skin/delete_perm.png | Bin 0 -> 2665 bytes src/Icons/skin/downloading.png | Bin 0 -> 463 bytes src/Icons/skin/exit.png | Bin 0 -> 2380 bytes src/Icons/skin/firewalled.png | Bin 0 -> 1488 bytes src/Icons/skin/increase.png | Bin 0 -> 5193 bytes src/Icons/skin/info.png | Bin 0 -> 2211 bytes src/Icons/skin/mascot.png | Bin 0 -> 22693 bytes src/Icons/skin/new.png | Bin 0 -> 2242 bytes src/Icons/skin/open.png | Bin 0 -> 2730 bytes src/Icons/skin/pause.png | Bin 0 -> 2131 bytes src/Icons/skin/pause_all.png | Bin 0 -> 2353 bytes src/Icons/skin/paused.png | Bin 0 -> 257 bytes src/Icons/skin/play.png | Bin 0 -> 2391 bytes src/Icons/skin/play_all.png | Bin 0 -> 2487 bytes src/Icons/skin/preview.png | Bin 0 -> 2649 bytes src/Icons/skin/properties.png | Bin 0 -> 2452 bytes src/Icons/skin/qb_question.png | Bin 0 -> 2468 bytes src/Icons/skin/qbittorrent16.png | Bin 0 -> 965 bytes src/Icons/skin/qbittorrent22.png | Bin 0 -> 1444 bytes src/Icons/skin/qbittorrent32.png | Bin 0 -> 2615 bytes src/Icons/skin/queued.png | Bin 0 -> 493 bytes src/Icons/skin/seeding.png | Bin 0 -> 427 bytes src/Icons/skin/settings.png | Bin 0 -> 2483 bytes src/Icons/skin/splash.png | Bin 0 -> 77629 bytes src/Icons/skin/stalled.png | Bin 0 -> 315 bytes src/Icons/skin/tabs.gif | Bin 0 -> 2060 bytes src/Icons/skin/url.png | Bin 0 -> 2509 bytes src/Icons/sphere.png | Bin 0 -> 337 bytes src/Icons/sphere2.png | Bin 0 -> 379 bytes src/Icons/uparrow.png | Bin 0 -> 787 bytes src/Icons/url.png | Bin 0 -> 722 bytes src/MainWindow.ui | 275 + src/PreviewListDelegate.h | 88 + src/PropListDelegate.h | 235 + src/SearchListDelegate.h | 75 + src/SearchTab.cpp | 150 + src/SearchTab.h | 75 + src/TrackersAdditionDlg.h | 62 + src/about.ui | 422 ++ src/about_imp.h | 445 ++ src/addTorrentDialog.ui | 291 + src/allocationDlg.h | 188 + src/arborescence.h | 270 + src/bandwidth_limit.ui | 113 + src/bittorrent.cpp | 1766 +++++ src/bittorrent.h | 198 + src/console.ui | 58 + src/console_imp.h | 59 + src/createtorrent.ui | 562 ++ src/createtorrent_imp.cpp | 277 + src/createtorrent_imp.h | 103 + src/download.ui | 193 + src/downloadFromURL.ui | 158 + src/downloadFromURLImp.h | 91 + src/downloadThread.cpp | 243 + src/downloadThread.h | 94 + src/downloadingTorrents.cpp | 779 +++ src/downloadingTorrents.h | 108 + src/engineSelect.ui | 125 + src/engineSelectDlg.cpp | 628 ++ src/engineSelectDlg.h | 84 + src/eventmanager.cpp | 105 + src/eventmanager.h | 61 + src/feedList.h | 208 + src/filterParserThread.h | 405 ++ src/httpconnection.cpp | 256 + src/httpconnection.h | 82 + src/httprequestparser.cpp | 148 + src/httprequestparser.h | 62 + src/httpresponsegenerator.cpp | 82 + src/httpresponsegenerator.h | 50 + src/httpserver.cpp | 111 + src/httpserver.h | 65 + src/ico.cpp | 462 ++ src/ico.h | 52 + src/icons.qrc | 111 + src/json.h | 106 + src/lang.qrc | 31 + src/lang/qbittorrent_bg.qm | Bin 0 -> 67919 bytes src/lang/qbittorrent_bg.ts | 5650 ++++++++++++++++ src/lang/qbittorrent_ca.qm | Bin 0 -> 17731 bytes src/lang/qbittorrent_ca.ts | 5103 ++++++++++++++ src/lang/qbittorrent_cs.qm | Bin 0 -> 67626 bytes src/lang/qbittorrent_cs.ts | 3960 +++++++++++ src/lang/qbittorrent_da.qm | Bin 0 -> 20145 bytes src/lang/qbittorrent_da.ts | 4577 +++++++++++++ src/lang/qbittorrent_de.qm | Bin 0 -> 58267 bytes src/lang/qbittorrent_de.ts | 5669 ++++++++++++++++ src/lang/qbittorrent_el.qm | Bin 0 -> 71511 bytes src/lang/qbittorrent_el.ts | 5749 ++++++++++++++++ src/lang/qbittorrent_en.qm | 1 + src/lang/qbittorrent_en.ts | 3531 ++++++++++ src/lang/qbittorrent_es.qm | Bin 0 -> 50214 bytes src/lang/qbittorrent_es.ts | 5663 ++++++++++++++++ src/lang/qbittorrent_fi.qm | Bin 0 -> 66881 bytes src/lang/qbittorrent_fi.ts | 5073 ++++++++++++++ src/lang/qbittorrent_fr.qm | Bin 0 -> 72295 bytes src/lang/qbittorrent_fr.ts | 5860 +++++++++++++++++ src/lang/qbittorrent_hu.qm | Bin 0 -> 66147 bytes src/lang/qbittorrent_hu.ts | 4697 +++++++++++++ src/lang/qbittorrent_it.qm | Bin 0 -> 70441 bytes src/lang/qbittorrent_it.ts | 5374 +++++++++++++++ src/lang/qbittorrent_ja.qm | Bin 0 -> 38110 bytes src/lang/qbittorrent_ja.ts | 4856 ++++++++++++++ src/lang/qbittorrent_ko.qm | Bin 0 -> 56626 bytes src/lang/qbittorrent_ko.ts | 5680 ++++++++++++++++ src/lang/qbittorrent_nb.qm | Bin 0 -> 20358 bytes src/lang/qbittorrent_nb.ts | 4931 ++++++++++++++ src/lang/qbittorrent_nl.qm | Bin 0 -> 67809 bytes src/lang/qbittorrent_nl.ts | 4826 ++++++++++++++ src/lang/qbittorrent_pl.qm | Bin 0 -> 49880 bytes src/lang/qbittorrent_pl.ts | 4939 ++++++++++++++ src/lang/qbittorrent_pt.qm | Bin 0 -> 69373 bytes src/lang/qbittorrent_pt.ts | 4807 ++++++++++++++ src/lang/qbittorrent_pt_BR.qm | Bin 0 -> 69373 bytes src/lang/qbittorrent_pt_BR.ts | 4807 ++++++++++++++ src/lang/qbittorrent_ro.qm | Bin 0 -> 68454 bytes src/lang/qbittorrent_ro.ts | 4643 +++++++++++++ src/lang/qbittorrent_ru.qm | Bin 0 -> 69416 bytes src/lang/qbittorrent_ru.ts | 4853 ++++++++++++++ src/lang/qbittorrent_sk.qm | Bin 0 -> 69210 bytes src/lang/qbittorrent_sk.ts | 4822 ++++++++++++++ src/lang/qbittorrent_sv.qm | Bin 0 -> 68214 bytes src/lang/qbittorrent_sv.ts | 3055 +++++++++ src/lang/qbittorrent_tr.qm | Bin 0 -> 67544 bytes src/lang/qbittorrent_tr.ts | 4806 ++++++++++++++ src/lang/qbittorrent_uk.qm | Bin 0 -> 45276 bytes src/lang/qbittorrent_uk.ts | 4770 ++++++++++++++ src/lang/qbittorrent_zh.qm | Bin 0 -> 51126 bytes src/lang/qbittorrent_zh.ts | 5101 ++++++++++++++ src/lang/qbittorrent_zh_TW.qm | Bin 0 -> 52452 bytes src/lang/qbittorrent_zh_TW.ts | 3170 +++++++++ src/login.ui | 299 + src/main.cpp | 229 + src/menuicons/128x128/apps/qbittorrent.png | Bin 0 -> 21783 bytes src/menuicons/16x16/apps/qbittorrent.png | Bin 0 -> 954 bytes src/menuicons/192x192/apps/qbittorrent.png | Bin 0 -> 38579 bytes src/menuicons/22x22/apps/qbittorrent.png | Bin 0 -> 1456 bytes src/menuicons/24x24/apps/qbittorrent.png | Bin 0 -> 1682 bytes src/menuicons/32x32/apps/qbittorrent.png | Bin 0 -> 2531 bytes src/menuicons/36x36/apps/qbittorrent.png | Bin 0 -> 3032 bytes src/menuicons/48x48/apps/qbittorrent.png | Bin 0 -> 4784 bytes src/menuicons/64x64/apps/qbittorrent.png | Bin 0 -> 7729 bytes src/menuicons/72x72/apps/qbittorrent.png | Bin 0 -> 9397 bytes src/menuicons/96x96/apps/qbittorrent.png | Bin 0 -> 14592 bytes src/misc.h | 347 + src/options.ui | 2668 ++++++++ src/options_imp.cpp | 1417 ++++ src/options_imp.h | 185 + src/pluginSource.h | 65 + src/pluginSource.ui | 52 + src/preview.ui | 149 + src/previewSelect.h | 139 + src/properties.ui | 1080 +++ src/properties_imp.cpp | 739 +++ src/properties_imp.h | 109 + src/qgnomelook.h | 96 + src/qrealarray.cpp | 33 + src/qrealarray.h | 41 + src/qtorrenthandle.cpp | 461 ++ src/qtorrenthandle.h | 146 + src/realprogressbar.cpp | 116 + src/realprogressbar.h | 79 + src/realprogressbarthread.cpp | 170 + src/realprogressbarthread.h | 79 + src/rss.cpp | 658 ++ src/rss.h | 514 ++ src/rss.ui | 288 + src/rss_imp.cpp | 620 ++ src/rss_imp.h | 88 + src/search.qrc | 18 + src/search.ui | 197 + src/searchEngine.cpp | 533 ++ src/searchEngine.h | 104 + src/search_engine/__init__.py | 0 src/search_engine/engines/__init__.py | 0 src/search_engine/engines/btjunkie.png | Bin 0 -> 622 bytes src/search_engine/engines/btjunkie.py | 116 + src/search_engine/engines/isohunt.png | Bin 0 -> 633 bytes src/search_engine/engines/isohunt.py | 64 + src/search_engine/engines/mininova.png | Bin 0 -> 365 bytes src/search_engine/engines/mininova.py | 114 + src/search_engine/engines/piratebay.png | Bin 0 -> 609 bytes src/search_engine/engines/piratebay.py | 111 + src/search_engine/engines/torrentreactor.png | Bin 0 -> 529 bytes src/search_engine/engines/torrentreactor.py | 105 + src/search_engine/engines/versions.txt | 5 + src/search_engine/helpers.py | 78 + src/search_engine/nova2.py | 157 + src/search_engine/nova2dl.py | 60 + src/search_engine/novaprinter.py | 63 + src/seeding.ui | 159 + src/src.pro | 233 + src/stacktrace.h | 94 + src/supportedEngines.h | 175 + src/torrentAddition.h | 462 ++ src/torrentPersistentData.h | 378 ++ src/trackerLogin.h | 77 + src/trackersAdd.ui | 73 + src/update_qrc_files.py | 88 + src/webui.qrc | 23 + src/webui/about.html | 380 ++ src/webui/css/dynamicTable.css | 43 + src/webui/css/mocha.css | 1030 +++ src/webui/css/mootabs1.2.css | 92 + src/webui/css/style.css | 122 + src/webui/download.html | 17 + src/webui/index.html | 113 + src/webui/scripts/client.js | 191 + src/webui/scripts/download.js | 34 + src/webui/scripts/dynamicTable.js | 234 + src/webui/scripts/excanvas-compressed.js | 19 + src/webui/scripts/mocha-init.js | 162 + src/webui/scripts/mocha.js | 4593 +++++++++++++ src/webui/scripts/mootabs1.2.js | 223 + src/webui/scripts/mootools-1.2-core-yc.js | 349 + src/webui/scripts/mootools-1.2-more.js | 153 + src/webui/scripts/progressbar.js | 89 + src/webui/upload.html | 29 + src/webui/uploadframe.html | 28 + 323 files changed, 170964 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 Changelog create mode 100644 INSTALL create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100755 configure create mode 100644 doc/qbittorrent.1 create mode 100644 qBittorrent.kdevelop create mode 100644 qbittorrent.pro create mode 100644 qbittorrent.qc create mode 100644 qcm/libboost.qcm create mode 100644 qcm/libcurl.qcm create mode 100644 qcm/libmagick.qcm create mode 100644 qcm/libtorrent-rasterbar.qcm create mode 100644 qcm/libzzip.qcm create mode 100644 qcm/qt4.qcm create mode 100644 src/DLListDelegate.h create mode 100644 src/FeedDownloader.h create mode 100644 src/FeedDownloader.ui create mode 100644 src/FinishedListDelegate.h create mode 100644 src/FinishedTorrents.cpp create mode 100644 src/FinishedTorrents.h create mode 100644 src/GUI.cpp create mode 100644 src/GUI.h create mode 100644 src/Icons/downarrow.png create mode 100644 src/Icons/flags/brazil.png create mode 100644 src/Icons/flags/bulgaria.png create mode 100644 src/Icons/flags/china.png create mode 100644 src/Icons/flags/czech.png create mode 100644 src/Icons/flags/denmark.png create mode 100644 src/Icons/flags/finland.png create mode 100644 src/Icons/flags/france.png create mode 100644 src/Icons/flags/germany.png create mode 100644 src/Icons/flags/greece.png create mode 100644 src/Icons/flags/hungary.png create mode 100644 src/Icons/flags/italy.png create mode 100644 src/Icons/flags/japan.png create mode 100644 src/Icons/flags/netherlands.png create mode 100644 src/Icons/flags/norway.png create mode 100644 src/Icons/flags/poland.png create mode 100644 src/Icons/flags/portugal.png create mode 100644 src/Icons/flags/romania.png create mode 100644 src/Icons/flags/russia.png create mode 100644 src/Icons/flags/slovakia.png create mode 100644 src/Icons/flags/south_korea.png create mode 100644 src/Icons/flags/spain.png create mode 100644 src/Icons/flags/spain_catalunya.png create mode 100644 src/Icons/flags/sweden.png create mode 100644 src/Icons/flags/taiwan.png create mode 100644 src/Icons/flags/turkey.png create mode 100644 src/Icons/flags/ukraine.png create mode 100644 src/Icons/flags/united_kingdom.png create mode 100644 src/Icons/loading.png create mode 100644 src/Icons/locale.png create mode 100644 src/Icons/magnet.png create mode 100644 src/Icons/oxygen/application-x-kgetlist-no.png create mode 100644 src/Icons/oxygen/application-x-kgetlist.png create mode 100644 src/Icons/oxygen/browse.png create mode 100644 src/Icons/oxygen/bt_settings.png create mode 100644 src/Icons/oxygen/bug.png create mode 100644 src/Icons/oxygen/button_cancel.png create mode 100644 src/Icons/oxygen/button_ok.png create mode 100644 src/Icons/oxygen/connection.png create mode 100644 src/Icons/oxygen/document-new.png create mode 100644 src/Icons/oxygen/download.png create mode 100644 src/Icons/oxygen/edit-clear.png create mode 100644 src/Icons/oxygen/edit-copy.png create mode 100644 src/Icons/oxygen/edit-cut.png create mode 100644 src/Icons/oxygen/edit-find.png create mode 100644 src/Icons/oxygen/edit-paste.png create mode 100644 src/Icons/oxygen/edit_clear.png create mode 100644 src/Icons/oxygen/encrypted.png create mode 100644 src/Icons/oxygen/file.png create mode 100644 src/Icons/oxygen/filter.png create mode 100644 src/Icons/oxygen/folder-new.png create mode 100644 src/Icons/oxygen/folder.png create mode 100644 src/Icons/oxygen/gear.png create mode 100644 src/Icons/oxygen/list-add.png create mode 100644 src/Icons/oxygen/list-remove.png create mode 100644 src/Icons/oxygen/log.png create mode 100644 src/Icons/oxygen/mail-folder-inbox.png create mode 100644 src/Icons/oxygen/preferences-desktop.png create mode 100644 src/Icons/oxygen/proxy.png create mode 100755 src/Icons/oxygen/remove.png create mode 100644 src/Icons/oxygen/subscribe.png create mode 100644 src/Icons/oxygen/subscribe16.png create mode 100644 src/Icons/oxygen/tab-close.png create mode 100644 src/Icons/oxygen/time.png create mode 100644 src/Icons/oxygen/unavailable.png create mode 100644 src/Icons/oxygen/unsubscribe.png create mode 100644 src/Icons/oxygen/unsubscribe16.png create mode 100644 src/Icons/oxygen/view-refresh.png create mode 100644 src/Icons/oxygen/wallet.png create mode 100644 src/Icons/oxygen/webui.png create mode 100644 src/Icons/qBittorrent.desktop create mode 100644 src/Icons/rss16.png create mode 100644 src/Icons/rss32.png create mode 100644 src/Icons/skin/connected.png create mode 100644 src/Icons/skin/decrease.png create mode 100644 src/Icons/skin/delete.png create mode 100644 src/Icons/skin/delete_all.png create mode 100644 src/Icons/skin/delete_perm.png create mode 100644 src/Icons/skin/downloading.png create mode 100644 src/Icons/skin/exit.png create mode 100644 src/Icons/skin/firewalled.png create mode 100644 src/Icons/skin/increase.png create mode 100644 src/Icons/skin/info.png create mode 100644 src/Icons/skin/mascot.png create mode 100644 src/Icons/skin/new.png create mode 100644 src/Icons/skin/open.png create mode 100644 src/Icons/skin/pause.png create mode 100644 src/Icons/skin/pause_all.png create mode 100644 src/Icons/skin/paused.png create mode 100644 src/Icons/skin/play.png create mode 100644 src/Icons/skin/play_all.png create mode 100644 src/Icons/skin/preview.png create mode 100644 src/Icons/skin/properties.png create mode 100644 src/Icons/skin/qb_question.png create mode 100644 src/Icons/skin/qbittorrent16.png create mode 100644 src/Icons/skin/qbittorrent22.png create mode 100644 src/Icons/skin/qbittorrent32.png create mode 100644 src/Icons/skin/queued.png create mode 100644 src/Icons/skin/seeding.png create mode 100644 src/Icons/skin/settings.png create mode 100644 src/Icons/skin/splash.png create mode 100644 src/Icons/skin/stalled.png create mode 100644 src/Icons/skin/tabs.gif create mode 100644 src/Icons/skin/url.png create mode 100644 src/Icons/sphere.png create mode 100644 src/Icons/sphere2.png create mode 100644 src/Icons/uparrow.png create mode 100644 src/Icons/url.png create mode 100644 src/MainWindow.ui create mode 100644 src/PreviewListDelegate.h create mode 100644 src/PropListDelegate.h create mode 100644 src/SearchListDelegate.h create mode 100644 src/SearchTab.cpp create mode 100644 src/SearchTab.h create mode 100644 src/TrackersAdditionDlg.h create mode 100644 src/about.ui create mode 100644 src/about_imp.h create mode 100644 src/addTorrentDialog.ui create mode 100644 src/allocationDlg.h create mode 100644 src/arborescence.h create mode 100644 src/bandwidth_limit.ui create mode 100644 src/bittorrent.cpp create mode 100644 src/bittorrent.h create mode 100644 src/console.ui create mode 100644 src/console_imp.h create mode 100644 src/createtorrent.ui create mode 100644 src/createtorrent_imp.cpp create mode 100644 src/createtorrent_imp.h create mode 100644 src/download.ui create mode 100644 src/downloadFromURL.ui create mode 100644 src/downloadFromURLImp.h create mode 100644 src/downloadThread.cpp create mode 100644 src/downloadThread.h create mode 100644 src/downloadingTorrents.cpp create mode 100644 src/downloadingTorrents.h create mode 100644 src/engineSelect.ui create mode 100644 src/engineSelectDlg.cpp create mode 100644 src/engineSelectDlg.h create mode 100644 src/eventmanager.cpp create mode 100644 src/eventmanager.h create mode 100644 src/feedList.h create mode 100644 src/filterParserThread.h create mode 100644 src/httpconnection.cpp create mode 100644 src/httpconnection.h create mode 100644 src/httprequestparser.cpp create mode 100644 src/httprequestparser.h create mode 100644 src/httpresponsegenerator.cpp create mode 100644 src/httpresponsegenerator.h create mode 100644 src/httpserver.cpp create mode 100644 src/httpserver.h create mode 100644 src/ico.cpp create mode 100644 src/ico.h create mode 100644 src/icons.qrc create mode 100644 src/json.h create mode 100644 src/lang.qrc create mode 100644 src/lang/qbittorrent_bg.qm create mode 100644 src/lang/qbittorrent_bg.ts create mode 100644 src/lang/qbittorrent_ca.qm create mode 100644 src/lang/qbittorrent_ca.ts create mode 100644 src/lang/qbittorrent_cs.qm create mode 100644 src/lang/qbittorrent_cs.ts create mode 100644 src/lang/qbittorrent_da.qm create mode 100644 src/lang/qbittorrent_da.ts create mode 100644 src/lang/qbittorrent_de.qm create mode 100644 src/lang/qbittorrent_de.ts create mode 100644 src/lang/qbittorrent_el.qm create mode 100644 src/lang/qbittorrent_el.ts create mode 100644 src/lang/qbittorrent_en.qm create mode 100644 src/lang/qbittorrent_en.ts create mode 100644 src/lang/qbittorrent_es.qm create mode 100644 src/lang/qbittorrent_es.ts create mode 100644 src/lang/qbittorrent_fi.qm create mode 100644 src/lang/qbittorrent_fi.ts create mode 100644 src/lang/qbittorrent_fr.qm create mode 100644 src/lang/qbittorrent_fr.ts create mode 100644 src/lang/qbittorrent_hu.qm create mode 100644 src/lang/qbittorrent_hu.ts create mode 100644 src/lang/qbittorrent_it.qm create mode 100644 src/lang/qbittorrent_it.ts create mode 100644 src/lang/qbittorrent_ja.qm create mode 100644 src/lang/qbittorrent_ja.ts create mode 100644 src/lang/qbittorrent_ko.qm create mode 100644 src/lang/qbittorrent_ko.ts create mode 100644 src/lang/qbittorrent_nb.qm create mode 100644 src/lang/qbittorrent_nb.ts create mode 100644 src/lang/qbittorrent_nl.qm create mode 100644 src/lang/qbittorrent_nl.ts create mode 100644 src/lang/qbittorrent_pl.qm create mode 100644 src/lang/qbittorrent_pl.ts create mode 100644 src/lang/qbittorrent_pt.qm create mode 100644 src/lang/qbittorrent_pt.ts create mode 100644 src/lang/qbittorrent_pt_BR.qm create mode 100644 src/lang/qbittorrent_pt_BR.ts create mode 100644 src/lang/qbittorrent_ro.qm create mode 100644 src/lang/qbittorrent_ro.ts create mode 100644 src/lang/qbittorrent_ru.qm create mode 100644 src/lang/qbittorrent_ru.ts create mode 100644 src/lang/qbittorrent_sk.qm create mode 100644 src/lang/qbittorrent_sk.ts create mode 100644 src/lang/qbittorrent_sv.qm create mode 100644 src/lang/qbittorrent_sv.ts create mode 100644 src/lang/qbittorrent_tr.qm create mode 100644 src/lang/qbittorrent_tr.ts create mode 100644 src/lang/qbittorrent_uk.qm create mode 100644 src/lang/qbittorrent_uk.ts create mode 100644 src/lang/qbittorrent_zh.qm create mode 100644 src/lang/qbittorrent_zh.ts create mode 100644 src/lang/qbittorrent_zh_TW.qm create mode 100644 src/lang/qbittorrent_zh_TW.ts create mode 100644 src/login.ui create mode 100644 src/main.cpp create mode 100644 src/menuicons/128x128/apps/qbittorrent.png create mode 100644 src/menuicons/16x16/apps/qbittorrent.png create mode 100644 src/menuicons/192x192/apps/qbittorrent.png create mode 100644 src/menuicons/22x22/apps/qbittorrent.png create mode 100644 src/menuicons/24x24/apps/qbittorrent.png create mode 100644 src/menuicons/32x32/apps/qbittorrent.png create mode 100644 src/menuicons/36x36/apps/qbittorrent.png create mode 100644 src/menuicons/48x48/apps/qbittorrent.png create mode 100644 src/menuicons/64x64/apps/qbittorrent.png create mode 100644 src/menuicons/72x72/apps/qbittorrent.png create mode 100644 src/menuicons/96x96/apps/qbittorrent.png create mode 100644 src/misc.h create mode 100644 src/options.ui create mode 100644 src/options_imp.cpp create mode 100644 src/options_imp.h create mode 100644 src/pluginSource.h create mode 100644 src/pluginSource.ui create mode 100644 src/preview.ui create mode 100644 src/previewSelect.h create mode 100644 src/properties.ui create mode 100644 src/properties_imp.cpp create mode 100644 src/properties_imp.h create mode 100644 src/qgnomelook.h create mode 100644 src/qrealarray.cpp create mode 100644 src/qrealarray.h create mode 100644 src/qtorrenthandle.cpp create mode 100644 src/qtorrenthandle.h create mode 100644 src/realprogressbar.cpp create mode 100644 src/realprogressbar.h create mode 100644 src/realprogressbarthread.cpp create mode 100644 src/realprogressbarthread.h create mode 100644 src/rss.cpp create mode 100644 src/rss.h create mode 100644 src/rss.ui create mode 100644 src/rss_imp.cpp create mode 100644 src/rss_imp.h create mode 100644 src/search.qrc create mode 100644 src/search.ui create mode 100644 src/searchEngine.cpp create mode 100644 src/searchEngine.h create mode 100644 src/search_engine/__init__.py create mode 100644 src/search_engine/engines/__init__.py create mode 100644 src/search_engine/engines/btjunkie.png create mode 100644 src/search_engine/engines/btjunkie.py create mode 100644 src/search_engine/engines/isohunt.png create mode 100644 src/search_engine/engines/isohunt.py create mode 100644 src/search_engine/engines/mininova.png create mode 100644 src/search_engine/engines/mininova.py create mode 100644 src/search_engine/engines/piratebay.png create mode 100644 src/search_engine/engines/piratebay.py create mode 100644 src/search_engine/engines/torrentreactor.png create mode 100644 src/search_engine/engines/torrentreactor.py create mode 100644 src/search_engine/engines/versions.txt create mode 100644 src/search_engine/helpers.py create mode 100755 src/search_engine/nova2.py create mode 100755 src/search_engine/nova2dl.py create mode 100644 src/search_engine/novaprinter.py create mode 100644 src/seeding.ui create mode 100644 src/src.pro create mode 100644 src/stacktrace.h create mode 100644 src/supportedEngines.h create mode 100644 src/torrentAddition.h create mode 100644 src/torrentPersistentData.h create mode 100644 src/trackerLogin.h create mode 100644 src/trackersAdd.ui create mode 100755 src/update_qrc_files.py create mode 100644 src/webui.qrc create mode 100644 src/webui/about.html create mode 100644 src/webui/css/dynamicTable.css create mode 100644 src/webui/css/mocha.css create mode 100644 src/webui/css/mootabs1.2.css create mode 100644 src/webui/css/style.css create mode 100644 src/webui/download.html create mode 100644 src/webui/index.html create mode 100644 src/webui/scripts/client.js create mode 100644 src/webui/scripts/download.js create mode 100644 src/webui/scripts/dynamicTable.js create mode 100644 src/webui/scripts/excanvas-compressed.js create mode 100644 src/webui/scripts/mocha-init.js create mode 100644 src/webui/scripts/mocha.js create mode 100644 src/webui/scripts/mootabs1.2.js create mode 100644 src/webui/scripts/mootools-1.2-core-yc.js create mode 100644 src/webui/scripts/mootools-1.2-more.js create mode 100644 src/webui/scripts/progressbar.js create mode 100644 src/webui/upload.html create mode 100644 src/webui/uploadframe.html diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..cb876facd --- /dev/null +++ b/AUTHORS @@ -0,0 +1,84 @@ +Author: +* Christophe Dumez + +Contributors: +* Arnaud Demaizière +* Ishan Arora +* Grigis Gaëtan + +Code from other projects: +* files src/ico.cpp src/ico.h + copyright: Malte Starostik + license: LGPL + +Images Authors: +* files: src/Icons/*.png + copyright: Gnome Icon Theme + license: GPLv2 + url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme + +* files: src/oxygen/*.png + copyright: Oxygen Icon Theme (KDE) + license: LGPL + url: http://www.oxygen-icons.org + +* files: src/Icons/flags/*.png + copyright: Open Clip Art Library + license: Creative Commons Public Domain Dedication + url: http://www.openclipart.org + +* files: src/Icons/skin/*.png + files: src/menuicons/YYxYY/*.png + copyright: Mateusz Tobola + license: GPLv2 + +* file: src/Icons/skin/tabs.gif + copyright: Greg Houston + license: MIT + +* file: src/search_engine/engines/btjunkie.png + copyright: Downloaded from btjunkie.org + +* file: src/search_engine/engines/isohunt.png + copyright: Downloaded from isohunt.com + +* file: src/search_engine/engines/mininova.png + copyright: Downloaded from mininova.org + +* file: src/search_engine/engines/piratebay.png + copyright: Downloaded from thepiratebay.org + +* file: src/search_engine/engines/torrentreactor.png + copyright: Downloaded from torrentreactor.net + +Translations authors: +* files: src/lang/*.ts + copyright: + - Brazilian: Nick Marinho (nickmarinho@gmail.com) + - Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net) + - Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net) + - Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com) + - Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com) + - Czech: Jirka Vilim (web@tets.cz) + - Danish: Mathias Nielsen (comoneo@gmail.com) + - Dutch: Joost Schipper (heavyjoost@users.sourceforge.net) + - English: Christophe Dumez (chris@qbittorrent.org) + - Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net) + - French: Christophe Dumez (chris@qbittorrent.org) + - German: Niels Hoffmann (zentralmaschine@users.sourceforge.net) + - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) + - Hungarian: Majoros Péter (majoros.j.p@t-online.hu) + - Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com) + - Japanese: Nardog (nardog@e2umail.com) + - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net) + - Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net) + - Polish: Jarek Smieja (ajep9691@wp.pl) + - Portuguese: Nick Marinho (nickmarinho@gmail.com) + - Romanian: Obada Denis (obadadenis@users.sourceforge.net) + - Russian: Nick Khazov (m2k3d0n at users.sourceforge.net) + - Slovak: helix84 + - Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) + - Swedish: Daniel Nylander (po@danielnylander.se) + - Turkish: Erdem Bingöl (erdem84@gmail.com) + - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) + license: GPLv2 diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..148c0b5eb --- /dev/null +++ b/COPYING @@ -0,0 +1,354 @@ +qBittorrent is licensed under the GNU General Public License version 2 with the +addition of the following special exception: + +In addition, as a special exception, the copyright holders give permission to +link this program with the OpenSSL project's "OpenSSL" library (or with +modified versions of it that use the same license as the "OpenSSL" library), +and distribute the linked executables. 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), 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. + +---------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Changelog b/Changelog new file mode 100644 index 000000000..ff4480139 --- /dev/null +++ b/Changelog @@ -0,0 +1,562 @@ +* Wed Sep 30 2009 - Christophe Dumez - v1.5.3 + - BUGFIX: Fix a possible crash when pausing then deleting a torrent quickly + - BUGFIX: Fix a race condition in folder scanning and torrent downloader + - BUGFIX: Hide download url column in search results + - BUGFIX: Fix a crash when scanned directory does not exist + - BUGFIX: Fix compilation on Mac OS + - BUGFIX: Added a command line parameter to disable splash screen + - BUGFIX: Ignore permanent deletion button when no torrent is selected + - BUGFIX: When a selected torrent is deleted, select next suitable torrent + +* Sun Sep 20 2009 - Christophe Dumez - v1.5.2 + - BUGFIX: Some torrents were pausing for no reason + - I18N: Updated Korean translation + +* Thu Sep 7 2009 - Christophe Dumez - v1.5.1 + - BUGFIX: Fix crash in torrent addition dialog when save path does not exist (closes #425227) + - BUGFIX: Fix downloading from URL (broken in v1.5.0) + - BUGFIX: Pause torrents in error state + +* Thu Sep 3 2009 - Christophe Dumez - v1.5.0 + - FEATURE: Added Magnet URI support + - FEATURE: Search engine supports category-based requests + - FEATURE: Make use of torrent enclosure in RSS feeds for direct download + - FEATURE: Implemented a RSS feed downloader with filter support + - FEATURE: Save old RSS item to hard disk to remember them on start up + - FEATURE: Display free disk space in torrent addition dialog + - FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL + - FEATURE: RSS feeds URLs can now be copied to clipboard + - FEATURE: RSS feeds can now be grouped into folders + - FEATURE: Added "Unread" item to RSS feed list to display all unread news + - FEATURE: If a torrent contains a torrent file, process downloaded torrent file too + - FEATURE: A random listening port can be chosen automatically + - BUGFIX: torrent resume code rewrited + - BUGFIX: Fixed uTorrent spoofing code + - BUGFIX: Greatly improved column sorting code + - BUGFIX: Possibility to create trackerless torrents + - BUGFIX: Better item coloring in torrent content filtering dialog + - COSMETIC: Redesigned search tab to improve usability + - COSMETIC: Redesigned RSS tab to improve usability + - COSMETIC: Improved tracker errors readability + +* Sun Aug 21 2009 - Christophe Dumez - v1.4.1 + - BUGFIX: Fix problems when changing save path (if using temporary download folder) + - BUGFIX: Display real save path instead of the temporary one in torrent properties + - BUGFIX: Catching invalid_handle exception to avoid rare crashes + - BUGFIX: Fixed popup menu position in RSS feeds list + - BUGFIX: Don't save RSS feed state if it could not be updated + +* Thu Aug 13 2009 - Christophe Dumez - v1.4.0 + - FEATURE: Display swarm information in lists + - FEATURE: Allow to define temporary download folder + - FEATURE: Display total amount of uploaded data in finished list + - FEATURE: Resizing a column in a search results tab affects all tabs + - FEATURE: Search results tab columns are now remembered upon startup + - FEATURE: Added right click menu in search engine to clear completion history + - FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent + - FEATURE: Updated spoofing code to avoid trackers ban + - BUGFIX: Provide more helpful explanation when an I/O error occured + - BUGFIX: Stop enforcing UTF-8 and use system locale instead + - COSMETIC: Redesigned program preferences + - COSMETIC: Updated icons set + +* Fri Jul 24 2009 - Christophe DUMEZ - 1.3.5 + - BUGFIX: Made IP filter parser more robust + - BUGFIX: Fixed torrent creation tool + - BUGFIX: Fixed possible overflow in progress calculation in arborescence.h + - BUGFIX: Save properties window size, position, columns width and restore them + - BUGFIX: Set a minimum default width for NAME column in properties + - BUGFIX: Remember visual indexes of columns in transfer lists + +* Sun Jul 12 2009 - Christophe DUMEZ - v1.3.4 + - BUGFIX: Fixed IP filter file parsing on 64bits + - BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog + - BUGFIX: Fixed a little bug in search engine plugins helper file + - BUGFIX: Fixed compilation problems with Qt 4.3 + - BUGFIX: Percentages no longer disapear with default cleanlooks style + - BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds) + - BUGFIX: Fixed memory leak in search engine + - BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences + - BUGFIX: Display a ratio of 0.0 if total_upload and total_download are both 0 + - BUGFIX: Remove last separator in top tool bar + - BUGFIX: Tuned lists properties to make sure display is correct + - COSMETIC: Display date as well as time in log window + +* Sun Apr 5 2009 - Christophe Dumez - v1.3.3 + - BUGFIX: Fixed Web UI torrent upload form + - BUGFIX: Fixed unicode support in search engine + - BUGFIX: Fixed search engine bug that prevented a torrent from appearing more than once among all tabs + - LICENSE: Added an exception to the license regarding OpenSSL. + - I18N: Updated Finnish translation + +* Sat Mar 7 2009 - Christophe Dumez - v1.3.2 + - BUGFIX: Fix top toolbar disabling + - BUGFIX: Fix building with Qt 4.5 + - BUGFIX: RSS items read status is now remembered upon restart + +* Mon Jan 26 2009 - Christophe Dumez - v1.3.1 + - BUGFIX: Torrents paused due to an I/O error were displayed as queued + - BUGFIX: qBittorrent now prints backtrace in terminal when segfaulting + - BUGFIX: Fixed files progress display in torrent properties + - BUGFIX: Improved torrent ratio calculation + - BUGFIX: Fixed possible crash when parsing filter file + - BUGFIX: Made some code optimization + - BUGFIX: Fixed download/upload speed decrease problems + - I18N: Updated Finnish, Bulgarian and Greek translations + +* Fri Jan 9 2009 - Christophe Dumez - v1.3.0 + - FEATURE: Based on libtorrent-rasterbar v0.14.2 + - FEATURE: Improved ratio calculation system + - FEATURE: Torrent creation code cleanup + - FEATURE: Allow to set maximum number of active seeds (queueing) + - FEATURE: Now seeds priorities are handled automatically by libtorrent-rasterbar (queueing) + - FEATURE: Code cleanup and optimization (save memory and cpu) + - FEATURE: ETA calculation now relies on average speed over all sessions + - FEATURE: Allow to force rechecking torrents + - FEATURE: Added support for 2 new extensions (uTorrent metadata and smart ban plugin) + - FEATURE: Allow to change the save path of torrents after addition + - FEATURE: Got rid of libmagick++ dependency + - FEATURE: Updated Web interface to MochaUI v0.9.5 + - FEATURE: Added notification in WebUI when qBittorrent is not reachable + - FEATURE: Rewrote folder scanning code (Now uses a filesystem watcher) + - FEATURE: Added torrent deletion from hard drive function in Web UI + - FEATURE: Added queueing priority actions in Web UI + - FEATURE: Display progress using progress bars in Web UI + - BUGFIX: Made usage of fastresume data more reliable + - BUGFIX: qBittorrent shutdown is now faster + - BUGFIX: Fixed several memory leaks + - BUGFIX: WebUI is now working with IE7 + - BUGFIX: Fixed spacing problem in toolbar when toggling its visibility + - BUGFIX: Fixed some compilation and Qt4 warnings + - BUGFIX: Do not use an addition dialog for torrents from folder scanning + - BUGFIX: Catch SIGTERM to exit cleanly (e.g. computer shutdown) + - BUGFIX: Improved proxy support code + - BUGFIX: Fixed systray icon tooltip on Windows + - BUGFIX: Proxy settings are now saved even if disabled + +* Sun Nov 9 2008 - Christophe Dumez - v1.2.1 + - BUGFIX: Fixed possible crash when deleting a torrent permanently + - BUGFIX: Queued_for_checking torrents were not displayed as checking in seeding list + - BUGFIX: Speed up startup time when having a lot of torrents + +* Wed Oct 29th 2008 - Christophe Dumez - v1.2.0 + - FEATURE: Torrent queueing system (with priorities) + - FEATURE: The number of DHT nodes is displayed + - FEATURE: RSS can now be disabled from program preferences + - FEATURE: Added collapse/expand all buttons in addition and properties dialogs + - FEATURE: Can have different proxies for Bittorrent and search engine + - FEATURE: Allow multiple item selection in Web UI transfer list + - FEATURE: Moved uploads to a separate list in Web UI + - BUGFIX: Totally rewritten Web UI list refresh system (fixed memory leak) + - BUGFIX: Disable ETA calculation when ETA column is hidden + - BUGFIX: Removed "disconnected" connection state, detection was far from perfect + - BUGFIX: Torrents are no longer starting from scratch when changing default save path (when torrent addition dialog is disabled) + - BUGFIX: Single instance code is now more reliable on Qt >= 4.4 + - COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar + - COSMETIC: RSS Tab is now hidden as a default + - COSMETIC: Allow to hide or display top toolbar + - COSMETIC: Log is now in a separate dialog + +* Sun Sept 14 2008 - Christophe Dumez - v1.1.4 + - FEATURE: DHT is no longer used as fallback only + - FEATURE: Ported WebUI to Mootools v1.2 + - BUGFIX: Fixed 'start seeding after torrent creation' feature + - BUGFIX: Fixed compilation with boost v1.36 + - BUGFIX: Some code optimization + - BUGFIX: Fixed memory leak in Web UI + - BUGFIX: Fixed problems with column sorting + - BUGFIX: Improved code for pausing torrents on startup + - BUGFIX: Torrent addition dialog is now disabled for downloads from WebUI + - BUGFIX: Give focus to input field in WebUI download dialog + +* Tue Aug 26 2008 - Christophe Dumez - v1.1.3 + - BUGFIX: Fixed ratio saving for seeding torrents + - I18N: Added czech and traditional chinese translations + +* Sun Aug 17 2008 - Christophe Dumez - v1.1.2 + - BUGFIX: Fixed progress calculation + - BUGFIX: Fixed finished torrent detection + +* Fri Aug 01 2008 - Christophe Dumez - v1.1.1 + - BUGFIX: Fixed bad resource file for icons + +* Fri Aug 01 2008 - Christophe Dumez - v1.1.0 + - FEATURE: Web interface to control qbittorrent (Ishan Arora) + - FEATURE: Can spoof Azureus peer id to avoid ban + - FEATURE: Allow to hide/show some columns in download and seeding lists + - FEATURE: Option to start qBittorrent minimized in systray + - FEATURE: Multi-tab support in search engine (Grigis Gaëtan) + - FEATURE: Allow to define double-click actions in torrents lists + - FEATURE: Allow to open torrent destination folder + - FEATURE: Real progress bar in torrent properties that displays downloaded pieces + - FEATURE: Allow to buy downloads using ShareMonkey + - FEATURE: Display if UPnP/NAT-PMP was successful or not + - FEATURE: Threadified torrent creation + - FEATURE: Improved eMule DAT ip filter parser + - FEATURE: Added support for PeerGuardian p2p filters (text) + - FEATURE: Added support for PeerGuardian p2b filters (binary) + - FEATURE: Allow to customize folder scan interval + - FEATURE: Allow to add several trackers at once + - BUGFIX: Allow to run one instance of qBittorrent per user + - BUGFIX: Do not display seeds number in seeding list (always 0) + - BUGFIX: Threadified IP filter file parser to avoid GUI freeze + - BUGFIX: Ask if we want to redownload if content was deleted from hard drive + - BUGFIX: Added missing copyright/licensing information for some files + - BUGFIX: qBittorrent is no longer conflicting with rTorrent (libtorrent renamed to libtorrent-rasterbar) + - COSMETIC: Do not display progress bar in seeding list (always 100%) + - COSMETIC: Added a progress bar for torrent creation + - COSMETIC: Display tracker errors in a cleaner way + - COSMETIC: Display "unpaused/total_torrent" in download/upload tabs + - COSMETIC: Allow to resize RSS column + - COSMETIC: Global UP/DL speeds and ratio are displayed above tabs + - COSMETIC: Use infinity symbol for ETA when time is infinite + +* Fri Apr 11 2008 - Christophe Dumez - v1.0.0 + - FEATURE: Based on new libtorrent v0.13 + - FEATURE: Added UPnP / NAT-PMP port forwarding support + - FEATURE: Added encryption support (compatible with Azureus) + - FEATURE: Bittorrent FAST extension support + - FEATURE: Added RSS support + - FEATURE: Support files prioritizing in a torrent + - FEATURE: Brand new search engine plugins system + - FEATURE: Filtered files don't appear on hard disk anymore + - FEATURE: Finished torrents are now moved to another tab for seeding + - FEATURE: Display more infos about the torrent in its properties + - FEATURE: Allow the user to edit torrents' trackers + - FEATURE: Allow user to change qBT's style (Plastique, Cleanlooks, Motif, CDE, MacOSX, WinXP) + - FEATURE: Allow the user to disable system tray integration + - FEATURE: Search engine is now using one thread per website for faster results + - FEATURE: Improved a lot the torrent creation module + - FEATURE: Allow to set upload/download limit per torrent (right click) + - FEATURE: Ask for exit confirmation only if download list is not empty + - FEATURE: Allow to use a proxy for trackers / web seeds / peers / DHT connections + - FEATURE: Supports SOCKS5 proxies as well as HTTP ones + - FEATURE: Better systems integration (buttons, dialogs...) + - FEATURE: Filtered files are not allocated on the hard-drive anymore (sparse file support) + - FEATURE: IPs blocked by filter are now logged in GUI + - FEATURE: Added a way to link against static libtorrent (useful for deb packages) + - FEATURE: Allow to set global upload/download limits from tray icon menu + - FEATURE: IPv6 is now fully supported + - FEATURE: Real torrent share ratio is now displayed in transfer list + - FEATURE: Added keyboard shortcuts for main actions (see wiki) + - FEATURE: Added a popup menu to set priority for multiple files at once + - FEATURE: Improved a lot downloading from urls (using libcommoncpp2 instead of libcurl) + - FEATURE: A search request can now be terminated by another + - FEATURE: User is now warned when fast resume data was rejected + - FEATURE: Url seeds are now displayed in torrent properties and are editable + - FEATURE: Allow to drag 'n drop urls on the main window + - FEATURE: Improved search engine (multipage support in all plugins) + - FEATURE: Added BTJunkie search engine plugin + - FEATURE: Added an option to force full disk allocation for all torrents + - FEATURE: Added an option to add torrents in paused state + - FEATURE: Added an option to set the max number of connections per torrent + - FEATURE: Added an option to set the max number of uploads per torrent + - FEATURE: Added an option to automatically delete torrents when they reach a given ratio (>= 1.0) + - FEATURE: Added an option to display current transfer speeds in title bar + - FEATURE: Torrent content is now displayed as a tree + - I18N: Added Hungarian translation + - I18N: Added Brazilian translation + - BUGFIX: Progress of paused torrents is now correct on restart + - BUGFIX: Progress column gets sorted on restart it is was during last execution + - BUGFIX: Made ETA more reliable using stats instead of instant values + - BUGFIX: Remove torrent from hard drive used to delete parent folder if empty + - BUGFIX: Fixed a crash when filtering all the files in a torrent + - BUGFIX: Reload torrent only when necessary (properties) + - BUGFIX: qBittorrent is not exiting anymore when a dialog is closed and main window is hidden + - BUGFIX: Search plugin update is not making the GUI freeze anymore (moved to a thread) + - BUGFIX: DHT settings were not saved correctly + - BUGFIX: Workaround to build on Fedora system (pkg-config problem) + - BUGFIX: search plugin update - do not display only last version changelog + - BUGFIX: Search plugin update - fixed missing new lines in changelog + - BUGFIX: The number of search results was not reset when clicking on 'Clear' button + - BUGFIX: Update torrent progress when its content changed (filtered files) + - BUGFIX: Improved the way menu icons are installed to avoid problems on some systems + - BUGFIX: Improved incremental download + - BUGFIX: Improved unicode support + - BUGFIX: Made torrent deletion from hard-drive safer + - BUGFIX: Prevent downloadFromUrl flooding + - BUGFIX: ETA was wrong for torrents with filtered files + - BUGFIX: Fixed drag'n drop on non-KDE systems + - BUGFIX: Removed build dependency on Python + - BUGFIX: Catching DHT exception in case there is a problem + - COSMETIC: Redesigned torrent properties a little + - COSMETIC: Totally redesigned program preferences + - COSMETIC: Display more logs messages concerning features + - COSMETIC: Improved lists renderers + - COSMETIC: Use a different icon for torrents being checked and for connecting ones + - COSMETIC: Improved some icons + - COSMETIC: Improved systray tooltip style + +* Mon May 07 2007 - Christophe Dumez - v0.9.3 + - BUGFIX: Fixed pause toggle on double-click in download list + - BUGFIX: The torrent size displayed now only takes unfiltered files into account + - BUGFIX: Fixed compiling errors with libtorrent svn (future v0.13 with UPnP enabled) + - BUGFIX: Remember sorted column in download list on restart + - BUGFIX: Small fix in the german translation + - BUGFIX: Some fixes in slovak translation + +* Tue Apr 10 2007 - Christophe Dumez - v0.9.2 + - BUGFIX: Window can now stay maximized on exit + - BUGFIX: Use PKGCONFIG again for configuring libtorrent + - BUGFIX: Allow to compile with libtorrent v0.11 + - BUGFIX: Disabled main window context menu (annoying) + - I18N: Added Japanese translation + - I18N: Updated Turkish translation + +* Wed Apr 04 2007 - Christophe Dumez - v0.9.1 + - BUGFIX: A lot of fixes in configure file + +* Sun Apr 01 2007 - Christophe Dumez - v0.9.0 + - FEATURE: Based on libtorrent v0.12 + - FEATURE: Based on Qt4.2 + - FEATURE: Brand new trayicon from Qt4.2 + - FEATURE: Support uTorrent Peer Exchange (PeX - exchanges peers between clients) + - FEATURE: Added a menu action to visit qBittorrent website + - FEATURE: Added a menu action to report a bug in qBittorrent + - FEATURE: Improved the way parameters are passed between qBT instances (socket) + - FEATURE: User is warned when hard drive becomes full and downloads are paused + - FEATURE: Number of complete/incomplete sources are now displayed in download list for each torrent + - FEATURE: Implemented close to systray + - FEATURE: Added Autocompletion to search engine + - FEATURE: Splitted BT & GUI parts (huge code rewriting & optimization) + - FEATURE: New parameters for configure file to point to custom locations for libtorrent/libcurl + - FEATURE: Update application style according to the system (WindowsXP, MacOS, X11) + - BUGFIX: Two torrents can now have the same name although they are different (use their hash) + - BUGFIX: Fixed download from url that would fail sometimes + - BUGFIX: Save directory was reset to default when filtering files in torrent + - BUGFIX: Force a refresh of download list when the window is shown (avoid delay) + - BUGFIX: Fixed deletion from hard drive (failed for non-empty folders) + - BUGFIX: qBittorrent now identifies its version correctly on the network + - BUGFIX: Preventing GUI from freezing when deleting a download permanently + - BUGFIX: Fixed directory scanning (stop trying to download the same files several times) + - BUGFIX: Fixed bad loading of scan dir in option (widgets still disabled) + - BUGFIX: Threads are now stopped cleanly before their destruction + - BUGFIX: Create Options object only when necessary (to save memory) + - BUGFIX: Let libtorrent store the torrent handles (save memory) + - BUGFIX: Set DHT Port only when DHT is enabled + - BUGFIX: Made ipfilter.dat parser less sensitive to errors + - BUGFIX: Bring main window to foreground when asking for exit confirmation + - I18N: Added Danish translation + - I18N: Better internationalization thanks to dynamic text support + - COSMETIC: Replaced OSD messages by Qt4.2 systray messages + +* Tue Nov 28 2006 - Christophe Dumez - v0.8.0 + - FEATURE: Added a torrent addition dialog + - FEATURE: Allow user to change DHT port + - FEATURE: Added an action to remove files from download list and hard drive too + - FEATURE: Rewritten intensively options code + - FEATURE: Remember GUI settings in a cleaner way on restart + - I18N: Added Finnish translation + - I18N: Improved Italian translation a lot + - BUGFIX: Enabled debug with Qt 4.2.1 too because Trolltech didn't fix their bug yet + - BUGFIX: Fixed layout in torrent properties + - BUGFIX: Made right click menu work for multiple selection in DL list + - BUGFIX: Fixed utf-8 support in paths and filenames + - BUGFIX: Could only listen on the first IP of the given range + - COSMETIC: Connection status in toolBar is not clickable anymore + - COSMETIC: Displaying save path in torrent properties window + - COSMETIC: Reworked options window a little + - COSMETIC: Remember mainwindow position during last execution + +* Mon Oct 16 2006 - Christophe Dumez - v0.7.1 + - I18N: Updated French, Polish, Dutch, Swedish, Slovak translations + - BUGFIX: Fixed Seeds/Leechers display in torrent properties + - BUGFIX: Fixed finished torrent state on restart + - BUGFIX: Fixed trayicon with Qt 4.2 + - BUGFIX: Enabling debug when Qt 4.2.0 is detected (because of a bug in this Qt) + - BUGFIX: Fixed new lines in log widget with Qt 4.2 + - BUGFIX: Display errors to stderr instead of stdout + - BUGFIX: Forgot to catch invalid_handle exception thrown by libtorrent + - BUGFIX: Close torrents properties windows when they are deleted + - BUGFIX: Fixed prefix in Makefile + +* Fri Oct 13 2006 - Christophe Dumez - v0.7.0 + - FEATURE: Based on new libtorrent v0.11 (a lot of bugfixes, new features) + - FEATURE: Added DHT (Trackerless - Decentralized BT) support + - FEATURE: Audio/Video File previewing while downloading + - FEATURE: Added support for incremental download (slower but great for previewing) + - FEATURE: Added Tracker authentication support + - FEATURE: Defined qBittorrent fingerprint so that it doesn't use libtorrent fingerprint anymore + - FEATURE: Display an explicit error message when a download from url fails + - FEATURE: Allow the download multiple torrents from urls at once + - FEATURE: New context menu on main window (Add, Start all, Pause all, Exit...) + - FEATURE: Now supports one new search engines (MegaNova) + - FEATURE: Rewritten search engine plugin (by fab31) + - FEATURE: Rewritten parts of the download/search lists to improve performance + - FEATURE: Individual share ratio is now displayed in each torrent properties. + - FEATURE: Tuned default settings to improve download speed + - FEATURE: Downloading from an URL will retry 10 times if too many users. + - FEATURE: Now remembers filtered pieces in a torrent on restart + - FEATURE: Now updating pieces progress in real time in torrent properties + - I18N: Added Norwegian translation + - BUGFIX: Fixed a memory leak when pressing OK in torrent properties + - BUGFIX: Improved code so that GUI never freeze during downloading from an url + - BUGFIX: Forgot to remove torrent file from scanned directory when "Clear Finished torrents" is enabled + - BUGFIX: Fixed multiple selection in torrent content tab + - BUGFIX: Improved configure file (detects libboost-thread) + - BUGFIX: Fixed trayicon on some window managers (Gnome, XFCE) + - BUGFIX: Always set maximum limit for connection depending on system + - BUGFIX: Fixed Memory leaks in search engine + - BUGFIX: Remove torrent file from scanned directory if it is already in download list + - BUGFIX: Fixed possible segfault on loading due to columns size loading + - BUGFIX: Fixed problems that could happen with delete selection action + - BUGFIX: Fixed an arithmetic exception that could happen in ETA calculation + - BUGFIX: Fixed Isohunt search engine + - BUGFIX: Fixed download from URL function (was buggy) + - BUGFIX: Fixed download button in search engine + - BUGFIX: Fixed selective download + - BUGFIX: Fixed memory leaks in torrent properties + - BUGFIX: Fixed tooltip behaviour for trayicon + - BUGFIX: Fixed Ipfilter.dat loading + - BUGFIX: Not loading options every time we display options anymore + - COSMETIC: Now displaying the number of downloads in tab title + - COSMETIC: Redesigned download from url dialog + - COSMETIC: Added a message to warn user that we started download from an url + - COSMETIC: Renamed main tab from "Downloads" to "Transfers" + - COSMETIC: Improved icons + - COSMETIC: Resized flags in localization settings + - COSMETIC: Improved trayicon image + +* Fri Aug 24 2006 - Christophe Dumez - v0.6.1 + - BUGFIX: Fixed possible segfaults when using context menus + - BUGFIX: Cleanup up context menus code + - BUGFIX: Use best gzip compressing for man page + +* Wed Aug 22 2006 - Christophe Dumez - v0.6.0 + - FEATURE: Rewritten the download list from scratch (more flexible) + - FEATURE: Rewritten the search results list from scratch (more flexible) + - FEATURE: Rewritten the torrent properties list from scratch (more flexible) + - FEATURE: Improved and cleaned up search engine code + - FEATURE: Search results are now displayed in real time (not sequentially) + - FEATURE: Added two command lines parameters (--version, --help) + - FEATURE: Added a popup menu for download list + - FEATURE: Double-click on an item now toggles the paused state of a download + - FEATURE: Improved code to be more portable (Windows & MacOS versions should arrive soon) + - FEATURE: Allow to toggle selected state of a file within a torrent using double-click + - FEATURE: Remember columns width in download and search results lists + - BUGFIX: Don't use pkg-config for libcurl anymore (easier to compile) + - BUGFIX: Fixed ETA calculation when downloading while connecting + - BUGFIX: Download progress is now displayed correctly during first seconds of execution (was 0% before) + - BUGFIX: Code cleanup & optimization + - BUGFIX: Fixed sorting in download list + - BUGFIX: Fixed sorting in search results list + - BUGFIX: Fixed Parameters passing between instances + - BUGFIX: Fixed missing icon for clear action in infoBar popup menu + - BUGFIX: Fixed truncated lines in search results + - BUGFIX: Don't refresh download list when user is in search tab (save CPU) + - BUGFIX: Don't update Progress/DL Speed/ETA for finished downloads (save CPU) + - BUGFIX: Save selected search engines only when they have changed (faster program exit) + - COSMETIC: Increased icon size in toolbar from 24px to 32px + - COSMETIC: Display a progress bar to visualize each download progress + - COSMETIC: Size of each result in search are displayed in user friendly units + - COSMETIC: Display a progress bar to visualize each file progress within a torrent + - COSMETIC: Renamed 'ratio' to 'Session ratio' (makes more sense) + - COSMETIC: Improved layout of torrent properties window when maximized + - COSMETIC: Now number of search results is updated in real time + - COSMETIC: Remember last window size + - COSMETIC: Improved splash screen look + - COSMETIC: Improved default width of columns in download and search results lists + +* Wed Aug 2 2006 - Christophe Dumez - v0.5.0 + - FEATURE: Improved "Download from url" feature (now supports https, ftp & redirections) + - FEATURE: Added a torrent creation tool + - FEATURE: Display progress for each file within a torrent + - FEATURE: Based on new libtorrent v0.10 (lot of improvements) + - FEATURE: Now possible to clear log textbox (popup menu) + - FEATURE: Added two search engines (isohunt, torrentreactor) + - FEATURE: Now Display share ratio on main window + - FEATURE: Use OSD (On Screen Display) when a download or a search is finished + - FEATURE: Allow only one instance of qBittorrent (and add new parameters to download list) + - FEATURE: Remember last selected search engines in search tab + - FEATURE: Improved search engines status output (Aborted, timed out, finished, no results) + - FEATURE: qBittorrent can now update search plugin from qbittorrent.org + - I18N: Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages + - BUGFIX: Fixed ThePirateBay parser for search engine (website had changed) + - BUGFIX: Fixed filenames for results from ThePirateBay search engine + - BUGFIX: Fixed unicode support for ThePirateBay search engine + - BUGFIX: Now search results are sorted by seeds + - BUGFIX: Overwrite nova.py search plugin only if it is outdated + - BUGFIX: Fixed possible division by 0 in ETA calculation + - BUGFIX: Improved ETA calculation precision + - BUGFIX: Fixed default tab in options + - BUGFIX: When saving options, reconnect only when listening ports changed + - COSMETIC: qBittorrent has now its own new logo + - COSMETIC: Display status "downloading" if DL Speed > 0 (even when tracker is down) + - COSMETIC: Added a splashscreen + - COSMETIC: qBittorrent has new cute icons + - COSMETIC: Display number of results in search tab + - COSMETIC: Added icons for each item in download list according to its state + - COSMETIC: Redesigned Locale settings + - COSMETIC: Fixed search engines names width (were cut on the right) + - COSMETIC: Moved search engines to the left of the window (better ui) + +* Fri Jun 23 2006 - Christophe Dumez - v0.4.1 + - Not counting "protocol chatter" in UP/DL speed anymore + - Download speed is now 0 when download is finished + - Paused torrents remain paused when qbittorrent is re-started + - Added option "go to systray when minimizing" + - Added option "Clear finished downloads on exit" + - Added option "Ask user for confirmation on exit" + - Added "Stalled" status for downloads (colored in orange, paused are in red and finished in green) + - Fixed Search window layout on maximizing + - Fixed a bug that caused upload limit not to be always applied + - Added Bulgarian translation + - Updated Translations + - Code optimization + +* Tue Jun 13 2006 - Christophe Dumez - v0.4.0 + - Added a search engine (supports Mininova & thepiratebay websites) + - Fixed critical bug: some options were not applied correctly to BT session + - Possibility to download a torrent file from an URL + - Added confirmation dialog on qbittorrent exit + - Enabled sorting in Download list + - Added Ukrainian translation + - Support urls as program parameters + - Added more actions to trayicon menu + - Fixed exception catching when retrieving fastresume data + - use Binary prefix standards from IEC 60027-2 for units (B, KiB, MiB, GiB, TiB) + - Iconification to systray when minimizing + - Code Cleanup & optimization + +* Tue Jun 06 2006 - Christophe Dumez - v0.3.1 + - Fixed toolbar layout (spacing) + - Added Russian translation + - Resume also finished files on startup (for seeding) + - Added colors corresponding to download state + - Fixed a segfault when deleting a download (if no scan dir is set) + +* Mon Jun 05 2006 - Christophe Dumez - v0.3 + - Fixed auto-resume (worked only once) + - Fixed BT_Backup dir creation on first startup (thanks Peter) + - Now min port and max port are inverted if (min port > max port) + - Fixed memory leaks + - Added qbittorrent man page + - Allow to disable max connections limit (default is disabled) + - Disable upload limit by default + - Added Menu Entry with icon (thanks Peter) + - Restructured directory, now Makefile is in main directory (not src/) + - Updated README / INSTALL + +* Fri Jun 02 2006 - Christophe Dumez - v0.2.3 + - Fixed ports checking function (user couldn't type the value he wanted) + - qBittorrent does not remove .torrent file from scanned directory anymore + - Check tracker errors list size and clear it if it becomes too big. + - Small cosmetic change + +* Wed May 31 2006 - Christophe Dumez - v0.2.2 + - Fixed missing icons + +* Thu May 25 2006 - Christophe Dumez - v0.2.1 + - Fixed "make install" rule + - Disabled debug mode + +* Thu May 25 2006 - Christophe Dumez - v0.2 + - Fixed a compatibility problem with some versions of qmake + - Added translations : Greek, Swedish + - Fixed Polish translation selection + - Fixed come warning because of two unexisting slots + - Improved "Apply" button behaviour in options + - Windows are now resizable + +* Tue May 16 2006 - Christophe Dumez - v0.1 + - Initial release (lack features & still need a lot of improvements) diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..02de8cff5 --- /dev/null +++ b/INSTALL @@ -0,0 +1,45 @@ +qBittorrent - A BitTorrent client in C++ / Qt4 +------------------------------------------ + +*** Necessary if qt3 is default on your system *** +export QTDIR=/usr/include/qt4 +export PATH=$QTDIR/bin:$PATH +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib +*** End *** + +./configure +make && make install +qbittorrent + +will install and execute qBittorrent hopefully without any problems. + +Dependencies: +- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) + Qt >= 4.4.0 is advised + +- libtorrent-rasterbar by Arvid Norberg (>= v0.14.0 REQUIRED) + -> http://www.qbittorrent.org/download.php (advised) + -> http://www.libtorrent.net + Be careful: another library (the one used by rTorrent) uses a similar name. + +- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization + +- libcurl + +- python >= 2.3 (needed by search engine) + +- libmagick++ (advised, not required) + * Needed for favicons support (RSS / Search plugins) + +- libzzip (advised, not required) + * Needed for zip support (Search plugins) + +NOTE FOR NON-KDE USERS: +- qt4-qtconfig package is advised when using other systems than KDE. + You can also change qBittorrent style to Cleanlooks (GNOME like) + +DOCUMENTATION: +Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org. + +------------------------------------------ +Christophe Dumez diff --git a/NEWS b/NEWS new file mode 100644 index 000000000..96b13e5a6 --- /dev/null +++ b/NEWS @@ -0,0 +1,4 @@ +See Changelog + +******************************************* +Christophe dumez - chris@qbittorrent.org diff --git a/README b/README new file mode 100644 index 000000000..3576c70e5 --- /dev/null +++ b/README @@ -0,0 +1,34 @@ +qBittorrent - A BitTorrent client in Qt4 +------------------------------------------ + +Description: +******************************** +qBittorrent is a bittorrent client programmed in C++ / Qt4 that uses +libtorrent (sometimes called rblibtorrent) by Arvid Norberg. + +It aims to be a good alternative to all other bittorrent clients +out there. qBittorrent is fast, stable and provides unicode +support as well as many features. + +Installation: +******************************** +For installation, follow the instructions from INSTALL file, but simple: + +./configure +make && make install +qbittorrent + +will install and execute qBittorrent hopefully without any problem. + +For more information please visit: +http://www.qbittorrent.org + +Please report any bug (or feature request) to: +http://bugs.qbittorrent.org + +You can also meet me (chris-qBT) on IRC: +#qbittorrent on irc.freenode.net + +------------------------------------------ +Christophe Dumez + diff --git a/TODO b/TODO new file mode 100644 index 000000000..c79698771 --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +See https://blueprints.launchpad.net/qbittorrent/ + diff --git a/configure b/configure new file mode 100755 index 000000000..d54b18557 --- /dev/null +++ b/configure @@ -0,0 +1,1573 @@ +#!/bin/sh +# +# Generated by qconf 1.4 ( http://delta.affinix.com/qconf/ ) +# + +show_usage() { +cat </dev/null` + if echo $WHICH | grep 'shell built-in command' >/dev/null 2>&1; then + WHICH=which + elif [ -z "$WHICH" ]; then + if which which >/dev/null 2>&1; then + WHICH=which + else + for a in /usr/ucb /usr/bin /bin /usr/local/bin; do + if [ -x $a/which ]; then + WHICH=$a/which + break; + fi + done + fi + fi + + if [ -z "$WHICH" ]; then + OLD_IFS=$IFS + IFS=: + for a in $PATH; do + if [ -x $a/$1 ]; then + echo "$a/$1" + IFS=$OLD_IFS + export IFS + HOME=$OLD_HOME + export HOME + return 0 + fi + done + IFS=$OLD_IFS + export IFS + else + a=`"$WHICH" "$1" 2>/dev/null` + if [ ! -z "$a" -a -x "$a" ]; then + echo "$a" + HOME=$OLD_HOME + export HOME + return 0 + fi + fi + HOME=$OLD_HOME + export HOME + return 1 +} +WHICH=which_command + +# find a make command +if [ -z "$MAKE" ]; then + MAKE= + for mk in gmake make; do + if $WHICH $mk >/dev/null 2>&1; then + MAKE=`$WHICH $mk` + break + fi + done + if [ -z "$MAKE" ]; then + echo "You don't seem to have 'make' or 'gmake' in your PATH." + echo "Cannot proceed." + exit 1 + fi +fi + +show_qt_info() { + printf "Be sure you have a proper Qt 4.0 build environment set up. This means not\n" + printf "just Qt, but also a C++ compiler, a make tool, and any other packages\n" + printf "necessary for compiling C++ programs.\n" + printf "\n" + printf "If you are certain everything is installed, then it could be that Qt 4 is not\n" + printf "being recognized or that a different version of Qt is being detected by\n" + printf "mistake (for example, this could happen if \$QTDIR is pointing to a Qt 3\n" + printf "installation). At least one of the following conditions must be satisfied:\n" + printf "\n" + printf " 1) --qtdir is set to the location of Qt\n" + printf " 2) \$QTDIR is set to the location of Qt\n" + printf " 3) QtCore is in the pkg-config database\n" + printf " 4) qmake is in the \$PATH\n" + printf "\n" + printf "This script will use the first one it finds to be true, checked in the above\n" + printf "order. #3 and #4 are the recommended options. #1 and #2 are mainly for\n" + printf "overriding the system configuration.\n" + printf "\n" +} + +while [ $# -gt 0 ]; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --prefix=*) + PREFIX=$optarg + shift + ;; + + --bindir=*) + BINDIR=$optarg + shift + ;; + + --datadir=*) + DATADIR=$optarg + shift + ;; + + --qtdir=*) + EX_QTDIR=$optarg + shift + ;; + + --with-libboost-inc=*) + QC_WITH_LIBBOOST_INC=$optarg + shift + ;; + + --with-libcurl-inc=*) + QC_WITH_LIBCURL_INC=$optarg + shift + ;; + + --with-libcurl-lib=*) + QC_WITH_LIBCURL_LIB=$optarg + shift + ;; + + --disable-libzzip) + QC_DISABLE_libzzip="Y" + shift + ;; + + --with-libzzip-inc=*) + QC_WITH_LIBZZIP_INC=$optarg + shift + ;; + + --with-libzzip-lib=*) + QC_WITH_LIBZZIP_LIB=$optarg + shift + ;; + + --verbose) + QC_VERBOSE="Y" + shift + ;; + --help) show_usage; exit ;; + *) show_usage; exit ;; + esac +done + +PREFIX=${PREFIX:-/usr/local} +BINDIR=${BINDIR:-$PREFIX/bin} +DATADIR=${DATADIR:-$PREFIX/share} + +echo "Configuring qbittorrent ..." + +if [ "$QC_VERBOSE" = "Y" ]; then +echo +echo PREFIX=$PREFIX +echo BINDIR=$BINDIR +echo DATADIR=$DATADIR +echo EX_QTDIR=$EX_QTDIR +echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC +echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC +echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB +echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip +echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC +echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB +echo +fi + +printf "Verifying Qt 4 build environment ... " + +# run qmake -v and check version +qmake_check_v4() { + if [ -x "$1" ]; then + if echo `$1 -v 2>&1` | grep "Qt version 4\." >/dev/null 2>&1; then + return 0 + elif [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: $1 not for Qt 4" + fi + fi + return 1 +} + +if [ "$QC_VERBOSE" = "Y" ]; then + echo +fi + +qm="" +names="qmake-qt4 qmake4 qmake" + +# qt4 check: --qtdir +if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then + for n in $names; do + qstr=$EX_QTDIR/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via --qtdir" +fi + +# qt4 check: QTDIR +if [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then + for n in $names; do + qstr=$QTDIR/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via \$QTDIR" +fi + +# qt4 check: pkg-config +if [ -z "$qm" ]; then + str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null` + if [ ! -z "$str" ]; then + for n in $names; do + qstr=$str/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done + fi +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via pkg-config" +fi + +# qt4 check: PATH +if [ -z "$qm" ]; then + for n in $names; do + qstr=`$WHICH $n 2>/dev/null` + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via \$PATH" +fi + +if [ -z "$qm" ]; then + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + printf "\n" + printf "Reason: Unable to find the 'qmake' tool for Qt 4.\n" + printf "\n" + show_qt_info + exit 1; +fi +if [ "$QC_VERBOSE" = "Y" ]; then + echo qmake found in $qm +fi + +gen_files() { +cat >$1/modules.cpp <= 4.3 +-----END QCMOD----- +*/ +class qc_qt4 : public ConfObj +{ +public: + qc_qt4(Conf *c) : ConfObj(c) {} + QString name() const { return "Qt >= 4.3"; } + QString shortname() const { return "Qt 4.3"; } + bool exec() + { + if(QT_VERSION >= 0x040400) { + conf->addDefine("QT_4_4"); + } + return(QT_VERSION >= 0x040300); + + } +}; +#line 1 "libtorrent-rasterbar.qcm" +/* +-----BEGIN QCMOD----- +name: libtorrent-rasterbar +-----END QCMOD----- +*/ +// see Conf::findPkgConfig +class qc_libtorrent_rasterbar : public ConfObj +{ +public: + qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} + QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; } + QString shortname() const { return "libtorrent-rasterbar"; } + bool exec(){ + QStringList incs; + QString req_ver = "0.14.0"; + QString adv_ver = "0.14.4"; + QString version, libs, other; + VersionMode mode = VersionMin; + if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other)) + return false; + for(int n = 0; n < incs.count(); ++n) + conf->addIncludePath(incs[n]); + if(!libs.isEmpty()) + conf->addLib(libs); + if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other)) + printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toUtf8().data(), adv_ver.toUtf8().data()); + return true; + } +}; +#line 1 "libboost.qcm" +/* +-----BEGIN QCMOD----- +name: libboost +arg: with-libboost-inc=[path], Path to libboost include files +-----END QCMOD----- +*/ +class qc_libboost : public ConfObj +{ +public: + qc_libboost(Conf *c) : ConfObj(c) {} + QString name() const { return "libboost"; } + QString shortname() const { return "libboost"; } + bool exec(){ + QString s; + s = conf->getenv("QC_WITH_LIBBOOST_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "boost/format.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/thread.hpp")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "boost/format.hpp")){ + found = true; + break; + } + } + if(!found) { + return false; + } + if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/thread.hpp")) { + return false; + } + } + conf->addIncludePath(s); + return true; + } +}; +#line 1 "libcurl.qcm" +/* +-----BEGIN QCMOD----- +name: libcommoncpp2 +arg: with-libcurl-inc=[path], Path to libcurl include files +arg: with-libcurl-lib=[path], Path to libcurl library files +-----END QCMOD----- +*/ +class qc_libcurl : public ConfObj +{ +public: + qc_libcurl(Conf *c) : ConfObj(c) {} + QString name() const { return "libcurl"; } + QString shortname() const { return "libcurl"; } + bool exec(){ + QString s; + s = conf->getenv("QC_WITH_LIBCURL_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "curl/curl.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "curl/curl.h")){ + found = true; + break; + } + } + if(!found) { + return false; + } + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBCURL_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("/libcurl.so"))) + return false; + conf->addLib(QString("-L") + s); + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/lib64/"; + sl << "/usr/local/lib/"; + sl << "/usr/local/lib64/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libcurl.so"))){ + found = true; + break; + } + } + if(!found) return false; + conf->addLib(QString("-L") + s); + } + return true; + } +}; +#line 1 "libzzip.qcm" +/* +-----BEGIN QCMOD----- +name: libzzip +arg: with-libzzip-inc=[path], Path to libzzip++ include files +arg: with-libzzip-lib=[path], Path to libzzip++ library files +-----END QCMOD----- +*/ +#include +class qc_libzzip : public ConfObj +{ +public: + qc_libzzip(Conf *c) : ConfObj(c) {} + QString name() const { return "Zzip library (libzzip)"; } + QString shortname() const { return "libzzip"; } + QString checkString() const { + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return ""; + return ConfObj::checkString(); + } + bool exec(){ + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return false; + QString s; + s = conf->getenv("QC_WITH_LIBZZIP_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "zzip/zzip.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "zzip/zzip.h")){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBZZIP_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("/libzzip.so"))){ + return false; + } + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/lib64/"; + sl << "/usr/local/lib/"; + sl << "/usr/local/lib64/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libzzip.so"))){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addLib(QString("-L") + s); + conf->addLib("-lzzip"); + conf->addDefine("HAVE_ZZIP"); + return true; + } +}; + +EOT +cat >$1/modules_new.cpp <required = true; + o->disabled = false; + o = new qc_libtorrent_rasterbar(conf); + o->required = true; + o->disabled = false; + o = new qc_libboost(conf); + o->required = true; + o->disabled = false; + o = new qc_libcurl(conf); + o->required = true; + o->disabled = false; + o = new qc_libzzip(conf); + o->required = false; + o->disabled = false; + +EOT +cat >$1/conf4.h < + +class Conf; + +enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny }; + +// ConfObj +// +// Subclass ConfObj to create a new configuration module. +class ConfObj +{ +public: + Conf *conf; + bool required; + bool disabled; + bool success; + + ConfObj(Conf *c); + virtual ~ConfObj(); + + // long or descriptive name of what is being checked/performed + // example: "KDE >= 3.3" + virtual QString name() const = 0; + + // short name + // example: "kde" + virtual QString shortname() const = 0; + + // string to display during check + // default: "Checking for [name] ..." + virtual QString checkString() const; + + // string to display after check + // default: "yes" or "no", based on result of exec() + virtual QString resultString() const; + + // this is where the checking code goes + virtual bool exec() = 0; +}; + +// Conf +// +// Interact with this class from your ConfObj to perform detection +// operations and to output configuration parameters. +class Conf +{ +public: + bool debug_enabled; + QString qmake_path; + QString maketool; + + QString DEFINES; + QString INCLUDEPATH; + QString LIBS; + QString extra; + + QList list; + QMap vars; + + Conf(); + ~Conf(); + + QString getenv(const QString &var); + QString qvar(const QString &s); + + bool exec(); + + void debug(const QString &s); + + QString expandIncludes(const QString &inc); + QString expandLibs(const QString &lib); + + int doCommand(const QString &s, QByteArray *out = 0); + int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0); + + bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0); + bool checkHeader(const QString &path, const QString &h); + bool findHeader(const QString &h, const QStringList &ext, QString *inc); + bool checkLibrary(const QString &path, const QString &name); + bool findLibrary(const QString &name, QString *lib); + QString findProgram(const QString &prog); + bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs); + bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags); + bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags); + + void addDefine(const QString &str); + void addLib(const QString &str); + void addIncludePath(const QString &str); + void addExtra(const QString &str); + +private: + bool first_debug; + + friend class ConfObj; + void added(ConfObj *o); +}; + +#endif + +EOT +cat >$1/conf4.cpp < +#include + +class MocTestObject : public QObject +{ + Q_OBJECT +public: + MocTestObject() {} +}; + +QString qc_getenv(const QString &var) +{ + char *p = ::getenv(var.toLatin1().data()); + if(!p) + return QString(); + return QString(p); +} + +QStringList qc_pathlist() +{ + QStringList list; + QString path = qc_getenv("PATH"); + if(!path.isEmpty()) + list = path.split(':', QString::SkipEmptyParts); + return list; +} + +QString qc_findprogram(const QString &prog) +{ + QString out; + QStringList list = qc_pathlist(); + for(int n = 0; n < list.count(); ++n) + { + QFileInfo fi(list[n] + '/' + prog); + if(fi.exists() && fi.isExecutable()) + { + out = fi.filePath(); + break; + } + } + return out; +} + +QString qc_findself(const QString &argv0) +{ + if(argv0.contains('/')) + return argv0; + else + return qc_findprogram(argv0); +} + +int qc_runcommand(const QString &command, QByteArray *out, bool showOutput) +{ + QString fullcmd = command; + if(!showOutput) + fullcmd += " 2>/dev/null"; + FILE *f = popen(fullcmd.toLatin1().data(), "r"); + if(!f) + return -1; + if(out) + out->clear(); + while(1) + { + char c = (char)fgetc(f); + if(feof(f)) + break; + if(out) + out->append(c); + if(showOutput) + fputc(c, stdout); + } + int ret = pclose(f); + if(ret == -1) + return -1; + return ret; +} + +int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput) +{ + QString fullcmd = prog; + QString argstr = args.join(" "); + if(!argstr.isEmpty()) + fullcmd += QString(" ") + argstr; + return qc_runcommand(fullcmd, out, showOutput); + + // TODO: use QProcess once it is fixed + /* + QProcess process; + if(showOutput) + process.setReadChannelMode(ForwardedChannels); + process.start(prog, args); + process.waitForFinished(-1); + return process.exitCode(); + */ +} + +bool qc_removedir(const QString &dirPath) +{ + QDir dir(dirPath); + if(!dir.exists()) + return false; + QStringList list = dir.entryList(); + foreach(QString s, list) + { + if(s == "." || s == "..") + continue; + QFileInfo fi(dir.filePath(s)); + if(fi.isDir()) + { + if(!qc_removedir(fi.filePath())) + return false; + } + else + { + if(!dir.remove(s)) + return false; + } + } + QString dirName = dir.dirName(); + if(!dir.cdUp()) + return false; + if(!dir.rmdir(dirName)) + return false; + return true; +} + +void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags) +{ + incs->clear(); + otherflags->clear(); + + QStringList cflagsList = cflags.split(" "); + for(int n = 0; n < cflagsList.count(); ++n) + { + QString str = cflagsList[n]; + if(str.startsWith("-I")) + { + // we want everything except the leading "-I" + incs->append(str.remove(0, 2)); + } + else + { + // we want whatever is left + otherflags->append(str); + } + } +} + +QString qc_escapeArg(const QString &str) +{ + QString out; + for(int n = 0; n < (int)str.length(); ++n) { + if(str[n] == '-') + out += '_'; + else + out += str[n]; + } + return out; +} + +//---------------------------------------------------------------------------- +// ConfObj +//---------------------------------------------------------------------------- +ConfObj::ConfObj(Conf *c) +{ + conf = c; + conf->added(this); + required = false; + disabled = false; + success = false; +} + +ConfObj::~ConfObj() +{ +} + +QString ConfObj::checkString() const +{ + return QString("Checking for %1 ...").arg(name()); +} + +QString ConfObj::resultString() const +{ + if(success) + return "yes"; + else + return "no"; +} + +//---------------------------------------------------------------------------- +// qc_internal_pkgconfig +//---------------------------------------------------------------------------- +class qc_internal_pkgconfig : public ConfObj +{ +public: + QString pkgname, desc; + VersionMode mode; + QString req_ver; + + qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c) + { + pkgname = _name; + desc = _desc; + mode = _mode; + req_ver = _req_ver; + } + + QString name() const { return desc; } + QString shortname() const { return pkgname; } + + bool exec() + { + QStringList incs; + QString version, libs, other; + if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other)) + return false; + + for(int n = 0; n < incs.count(); ++n) + conf->addIncludePath(incs[n]); + if(!libs.isEmpty()) + conf->addLib(libs); + //if(!other.isEmpty()) + // conf->addExtra(QString("QMAKE_CFLAGS += %1\n").arg(other)); + return true; + } +}; + +//---------------------------------------------------------------------------- +// Conf +//---------------------------------------------------------------------------- +Conf::Conf() +{ + // TODO: no more vars? + //vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC)); + //vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR)); + //vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB)); + //vars.insert("QMAKE_CC", CC); + + debug_enabled = false; +} + +Conf::~Conf() +{ + qDeleteAll(list); +} + +void Conf::added(ConfObj *o) +{ + list.append(o); +} + +QString Conf::getenv(const QString &var) +{ + return qc_getenv(var); +} + +void Conf::debug(const QString &s) +{ + if(debug_enabled) + { + if(first_debug) + printf("\n"); + first_debug = false; + printf(" * %s\n", qPrintable(s)); + } +} + +bool Conf::exec() +{ + for(int n = 0; n < list.count(); ++n) + { + ConfObj *o = list[n]; + + // if this was a disabled-by-default option, check if it was enabled + if(o->disabled) + { + QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname()); + if(getenv(v) != "Y") + continue; + } + // and the opposite? + else + { + QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname()); + if(getenv(v) == "Y") + continue; + } + + bool output = true; + QString check = o->checkString(); + if(check.isEmpty()) + output = false; + + if(output) + { + printf("%s", check.toLatin1().data()); + fflush(stdout); + } + + first_debug = true; + bool ok = o->exec(); + o->success = ok; + + if(output) + { + QString result = o->resultString(); + if(!first_debug) + printf(" -> %s\n", result.toLatin1().data()); + else + printf(" %s\n", result.toLatin1().data()); + } + + if(!ok && o->required) + { + printf("\nError: need %s!\n", o->name().toLatin1().data()); + return false; + } + } + return true; +} + +QString Conf::qvar(const QString &s) +{ + return vars.value(s); +} + +QString Conf::expandIncludes(const QString &inc) +{ + return QString("-I") + inc; +} + +QString Conf::expandLibs(const QString &lib) +{ + return QString("-L") + lib; +} + +int Conf::doCommand(const QString &s, QByteArray *out) +{ + debug(QString("[%1]").arg(s)); + int r = qc_runcommand(s, out, debug_enabled); + debug(QString("returned: %1").arg(r)); + return r; +} + +int Conf::doCommand(const QString &prog, const QStringList &args, QByteArray *out) +{ + QString fullcmd = prog; + QString argstr = args.join(" "); + if(!argstr.isEmpty()) + fullcmd += QString(" ") + argstr; + debug(QString("[%1]").arg(fullcmd)); + int r = qc_runprogram(prog, args, out, debug_enabled); + debug(QString("returned: %1").arg(r)); + return r; +} + +bool Conf::doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode) +{ + QDir tmp(".qconftemp"); + if(!tmp.mkdir("atest")) + { + debug("unable to create atest dir"); + return false; + } + QDir dir(tmp.filePath("atest")); + if(!dir.exists()) + { + debug("atest dir does not exist"); + return false; + } + + QString fname = dir.filePath("atest.cpp"); + QString out = "atest"; + QFile f(fname); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + debug("unable to open atest.cpp for writing"); + return false; + } + if(f.write(filedata.toLatin1()) == -1) + { + debug("error writing to atest.cpp"); + return false; + } + f.close(); + + debug(QString("Wrote atest.cpp:\n%1").arg(filedata)); + + QString pro = QString( + "CONFIG += console\n" + "CONFIG -= qt app_bundle\n" + "SOURCES += atest.cpp\n"); + QString inc = incs.join(" "); + if(!inc.isEmpty()) + pro += "INCLUDEPATH += " + inc + '\n'; + if(!libs.isEmpty()) + pro += "LIBS += " + libs + '\n'; + pro += proextra; + + fname = dir.filePath("atest.pro"); + f.setFileName(fname); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + debug("unable to open atest.pro for writing"); + return false; + } + if(f.write(pro.toLatin1()) == -1) + { + debug("error writing to atest.pro"); + return false; + } + f.close(); + + debug(QString("Wrote atest.pro:\n%1").arg(pro)); + + QString oldpath = QDir::currentPath(); + QDir::setCurrent(dir.path()); + + bool ok = false; + int r = doCommand(qmake_path, QStringList() << "atest.pro"); + if(r == 0) + { + r = doCommand(maketool, QStringList()); + if(r == 0) + { + ok = true; + if(retcode) + *retcode = doCommand(QString("./") + out, QStringList()); + } + r = doCommand(maketool, QStringList() << "distclean"); + if(r != 0) + debug("error during atest distclean"); + } + + QDir::setCurrent(oldpath); + + // cleanup + //dir.remove("atest.pro"); + //dir.remove("atest.cpp"); + //tmp.rmdir("atest"); + + // remove whole dir since distclean doesn't always work + qc_removedir(tmp.filePath("atest")); + + if(!ok) + return false; + return true; +} + +bool Conf::checkHeader(const QString &path, const QString &h) +{ + QFileInfo fi(path + '/' + h); + if(fi.exists()) + return true; + return false; +} + +bool Conf::findHeader(const QString &h, const QStringList &ext, QString *inc) +{ + if(checkHeader("/usr/include", h)) + { + *inc = ""; + return true; + } + QStringList dirs; + dirs += "/usr/local/include"; + dirs += ext; + for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it) + { + if(checkHeader(*it, h)) + { + *inc = *it; + return true; + } + } + return false; +} + +bool Conf::checkLibrary(const QString &path, const QString &name) +{ + QString str = + //"#include \n" + "int main()\n" + "{\n" + //" printf(\"library checker running\\\\n\");\n" + " return 0;\n" + "}\n"; + + QString libs; + if(!path.isEmpty()) + libs += QString("-L") + path + ' '; + libs += QString("-l") + name; + if(!doCompileAndLink(str, QStringList(), libs, QString())) + return false; + return true; +} + +bool Conf::findLibrary(const QString &name, QString *lib) +{ + if(checkLibrary("", name)) + { + *lib = ""; + return true; + } + if(checkLibrary("/usr/local/lib", name)) + { + *lib = "/usr/local/lib"; + return true; + } + return false; +} + +QString Conf::findProgram(const QString &prog) +{ + return qc_findprogram(prog); +} + +bool Conf::findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs) +{ + QString inc, lib; + QString s; + + s = getenv(incvar); + if(!s.isEmpty()) { + if(!checkHeader(s, incname)) + return false; + inc = s; + } + else { + if(!findHeader(incname, QStringList(), &s)) + return false; + inc = s; + } + + s = getenv(libvar); + if(!s.isEmpty()) { + if(!checkLibrary(s, libname)) + return false; + lib = s; + } + else { + if(!findLibrary(libname, &s)) + return false; + lib = s; + } + + QString lib_out; + if(!lib.isEmpty()) + lib_out += QString("-L") + s; + lib_out += QString("-l") + libname; + + *incpath = inc; + *libs = lib_out; + return true; +} + +bool Conf::findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags) +{ + QStringList args; + QByteArray out; + int ret; + + args += "--version"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString version_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += "--libs"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString libs_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += "--cflags"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString cflags = QString::fromLatin1(out).trimmed(); + + QStringList incs_out, otherflags_out; + qc_splitcflags(cflags, &incs_out, &otherflags_out); + + *version = version_out; + *incs = incs_out; + *libs = libs_out; + *otherflags = otherflags_out.join(" "); + return true; +} + +bool Conf::findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags) +{ + QStringList args; + QByteArray out; + int ret; + + args += name; + args += "--exists"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + if(mode != VersionAny) + { + args.clear(); + args += name; + if(mode == VersionMin) + args += QString("--atleast-version=%1").arg(req_version); + else if(mode == VersionMax) + args += QString("--max-version=%1").arg(req_version); + else + args += QString("--exact-version=%1").arg(req_version); + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + } + + args.clear(); + args += name; + args += "--modversion"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString version_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += name; + args += "--libs"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString libs_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += name; + args += "--cflags"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString cflags = QString::fromLatin1(out).trimmed(); + + QStringList incs_out, otherflags_out; + qc_splitcflags(cflags, &incs_out, &otherflags_out); + + *version = version_out; + *incs = incs_out; + *libs = libs_out; + *otherflags = otherflags_out.join(" "); + return true; +} + +void Conf::addDefine(const QString &str) +{ + if(DEFINES.isEmpty()) + DEFINES = str; + else + DEFINES += QString(" ") + str; + debug(QString("DEFINES += %1").arg(str)); +} + +void Conf::addLib(const QString &str) +{ + if(LIBS.isEmpty()) + LIBS = str; + else + LIBS += QString(" ") + str; + debug(QString("LIBS += %1").arg(str)); +} + +void Conf::addIncludePath(const QString &str) +{ + if(INCLUDEPATH.isEmpty()) + INCLUDEPATH = str; + else + INCLUDEPATH += QString(" ") + str; + debug(QString("INCLUDEPATH += %1").arg(str)); +} + +void Conf::addExtra(const QString &str) +{ + extra += str + '\n'; + debug(QString("extra += %1").arg(str)); +} + +//---------------------------------------------------------------------------- +// main +//---------------------------------------------------------------------------- +#include "conf4.moc" + +#ifdef HAVE_MODULES +# include"modules.cpp" +#endif + +int main() +{ + Conf *conf = new Conf; + ConfObj *o; + o = 0; +#ifdef HAVE_MODULES +# include"modules_new.cpp" +#endif + + conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false; + if(conf->debug_enabled) + printf(" -> ok\n"); + else + printf("ok\n"); + + QString confCommand = qc_getenv("QC_COMMAND"); + QString proName = qc_getenv("QC_PROFILE"); + conf->qmake_path = qc_getenv("QC_QMAKE"); + conf->maketool = qc_getenv("QC_MAKETOOL"); + + if(conf->debug_enabled) + printf("conf command: [%s]\n", qPrintable(confCommand)); + + QString confPath = qc_findself(confCommand); + if(confPath.isEmpty()) + { + printf("Error: cannot find myself; rerun with an absolute path\n"); + return 1; + } + + QString srcdir = QFileInfo(confPath).absolutePath(); + QString builddir = QDir::current().absolutePath(); + QString proPath = QDir(srcdir).filePath(proName); + + if(conf->debug_enabled) + { + printf("conf path: [%s]\n", qPrintable(confPath)); + printf("srcdir: [%s]\n", qPrintable(srcdir)); + printf("builddir: [%s]\n", qPrintable(builddir)); + printf("profile: [%s]\n", qPrintable(proPath)); + printf("qmake path: [%s]\n", qPrintable(conf->qmake_path)); + printf("make tool: [%s]\n", qPrintable(conf->maketool)); + printf("\n"); + } + + bool success = false; + if(conf->exec()) + { + QFile f("conf.pri"); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + printf("Error writing %s\n", qPrintable(f.fileName())); + return 1; + } + + QString str; + str += "# qconf\n\n"; + + QString var; + var = qc_getenv("PREFIX"); + if(!var.isEmpty()) + str += QString("PREFIX = %1\n").arg(var); + var = qc_getenv("BINDIR"); + if(!var.isEmpty()) + str += QString("BINDIR = %1\n").arg(var); + var = qc_getenv("INCDIR"); + if(!var.isEmpty()) + str += QString("INCDIR = %1\n").arg(var); + var = qc_getenv("LIBDIR"); + if(!var.isEmpty()) + str += QString("LIBDIR = %1\n").arg(var); + var = qc_getenv("DATADIR"); + if(!var.isEmpty()) + str += QString("DATADIR = %1\n").arg(var); + str += '\n'; + + if(qc_getenv("QC_STATIC") == "Y") + str += "CONFIG += staticlib\n"; + + // TODO: don't need this? + //str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\n'; + + if(!conf->DEFINES.isEmpty()) + str += "DEFINES += " + conf->DEFINES + '\n'; + if(!conf->INCLUDEPATH.isEmpty()) + str += "INCLUDEPATH += " + conf->INCLUDEPATH + '\n'; + if(!conf->LIBS.isEmpty()) + str += "LIBS += " + conf->LIBS + '\n'; + if(!conf->extra.isEmpty()) + str += conf->extra; + str += '\n'; + + QByteArray cs = str.toLatin1(); + f.write(cs); + f.close(); + success = true; + } + QString qmake_path = conf->qmake_path; + delete conf; + + if(!success) + return 1; + + // run qmake on the project file + int ret = qc_runprogram(qmake_path, QStringList() << proPath, 0, true); + if(ret != 0) + return 1; + + return 0; +} + +EOT +cat >$1/conf4.pro </dev/null + $MAKE clean >/dev/null 2>&1 + $MAKE >../conf.log 2>&1 +) + +if [ "$?" != "0" ]; then + rm -rf .qconftemp + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + printf "\n" + printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n" + printf "\n" + show_qt_info + if [ "$QC_VERBOSE" = "Y" ]; then + echo "conf.log:" + cat conf.log + fi + exit 1; +fi + +QC_COMMAND=$0 +export QC_COMMAND +QC_PROFILE=qbittorrent.pro +export QC_PROFILE +QC_QMAKE=$qm +export QC_QMAKE +QC_MAKETOOL=$MAKE +export QC_MAKETOOL +.qconftemp/conf +ret="$?" +if [ "$ret" = "1" ]; then + rm -rf .qconftemp + echo + exit 1; +else + if [ "$ret" != "0" ]; then + rm -rf .qconftemp + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + echo + echo "Reason: Unexpected error launching 'conf'" + echo + exit 1; + fi +fi +rm -rf .qconftemp + +echo +echo "Good, your configure finished. Now run $MAKE." +echo diff --git a/doc/qbittorrent.1 b/doc/qbittorrent.1 new file mode 100644 index 000000000..094a7a4e4 --- /dev/null +++ b/doc/qbittorrent.1 @@ -0,0 +1,28 @@ +.\" This manpage has been automatically generated by docbook2man +.\" from a DocBook document. This tool can be found at: +.\" . +.TH "QBITTORRENT" "1" "September 1st 2007" "Bittorrent client written in C++ / Qt4" "" + +.SH NAME +qBittorrent \- a Bittorrent client written in C++ / Qt4 +.SH SYNOPSIS + +\fBqbittorrent\fR [FILE | URL] [FILE | URL...] + +\fBqbittorrent\fR \-\-help + +\fBqbittorrent\fR \-\-version +.PP +.SH "DESCRIPTION" + +\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4, +using the \fBrblibtorrent\fR library by Arvid Norberg. qBittorrent aims +to be a good alternative to all other bittorrent clients out there. qBittorrent +is fast, stable, light, it supports unicode and it provides a good integrated search engine. +It also comes with UPnP port forwarding / NAT-PMP, encryption (Azureus compatible), FAST extension (mainline) and PeX support (utorrent compatible). + +Please report any problem to http://bugs.qbittorrent.org +.PP +.SH "AUTHOR" + +Christophe Dumez diff --git a/qBittorrent.kdevelop b/qBittorrent.kdevelop new file mode 100644 index 000000000..1e56cdee4 --- /dev/null +++ b/qBittorrent.kdevelop @@ -0,0 +1,199 @@ + + + + Christophe Dumez + chris@qbittorrent.org + 1.0.0 + KDevTrollProject + C++ + + Qt + + qBittorrent + + . + false + + + kdevsubversion + + + + + + + + false + false + + + *.o,*.lo,CVS + false + false + + + + + bash + bash_bugs + clanlib + w3c-dom-level2-html + fortran_bugs_gcc + gnome1 + gnustep + gtk + gtk_bugs + haskell + haskell_bugs_ghc + java_bugs_gcc + java_bugs_sun + kde2book + opengl + pascal_bugs_fp + php + php_bugs + perl + perl_bugs + python + python_bugs + qt-kdev3 + ruby + ruby_bugs + sdl + stl + w3c-svg + sw + w3c-uaag10 + wxwidgets_bugs + + + KDE Libraries (Doxygen) + + + + + + + + + + true + false + false + + + false + true + 10 + + + + + 4 + true + 4 + ExternalDesigner + /usr/lib/qt4 + /usr/bin/qmake + /usr/bin/designer + + + + automatic_%2Fhome%2Fishanarora%2Fprojects%2Fqbittorrent + + + true + true + true + 250 + 400 + 250 + false + 0 + true + true + false + std=_GLIBCXX_STD;__gnu_cxx=std + true + true + true + true + true + true + true + false + .; + + + get + set + m_,_ + theValue + true + true + + + false + true + Vertical + + + + + + + + + + + + + src + + + executable + /home/ishanarora/projects/qbittorrent/src/qbittorrent + + + /home/ishanarora/projects/qbittorrent + true + false + true + false + false + + + + true + false + 1 + false + + 0 + + + + 2 + false + true + + + + + .h + .cpp + + + + + /home/ishanarora/projects/qbittorrent/tags + + + + + + + + + + diff --git a/qbittorrent.pro b/qbittorrent.pro new file mode 100644 index 000000000..71cd4c84d --- /dev/null +++ b/qbittorrent.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs + +include(conf.pri) + +SUBDIRS += src + diff --git a/qbittorrent.qc b/qbittorrent.qc new file mode 100644 index 000000000..ffb74fe12 --- /dev/null +++ b/qbittorrent.qc @@ -0,0 +1,19 @@ + + qbittorrent + qbittorrent.pro + qcm + + + + + + + + + + + + + + + diff --git a/qcm/libboost.qcm b/qcm/libboost.qcm new file mode 100644 index 000000000..e4fcbecb8 --- /dev/null +++ b/qcm/libboost.qcm @@ -0,0 +1,56 @@ +/* +-----BEGIN QCMOD----- +name: libboost +arg: with-libboost-inc=[path], Path to libboost include files +-----END QCMOD----- +*/ +class qc_libboost : public ConfObj +{ +public: + qc_libboost(Conf *c) : ConfObj(c) {} + QString name() const { return "libboost"; } + QString shortname() const { return "libboost"; } + bool exec(){ + QString s; + s = conf->getenv("QC_WITH_LIBBOOST_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "boost/format.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/thread.hpp")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "boost/format.hpp")){ + found = true; + break; + } + } + if(!found) { + return false; + } + if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) { + return false; + } + if(!conf->checkHeader(s, "boost/thread.hpp")) { + return false; + } + } + conf->addIncludePath(s); + return true; + } +}; diff --git a/qcm/libcurl.qcm b/qcm/libcurl.qcm new file mode 100644 index 000000000..b3af39b4a --- /dev/null +++ b/qcm/libcurl.qcm @@ -0,0 +1,61 @@ +/* +-----BEGIN QCMOD----- +name: libcommoncpp2 +arg: with-libcurl-inc=[path], Path to libcurl include files +arg: with-libcurl-lib=[path], Path to libcurl library files +-----END QCMOD----- +*/ +class qc_libcurl : public ConfObj +{ +public: + qc_libcurl(Conf *c) : ConfObj(c) {} + QString name() const { return "libcurl"; } + QString shortname() const { return "libcurl"; } + bool exec(){ + QString s; + s = conf->getenv("QC_WITH_LIBCURL_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "curl/curl.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "curl/curl.h")){ + found = true; + break; + } + } + if(!found) { + return false; + } + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBCURL_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("/libcurl.so"))) + return false; + conf->addLib(QString("-L") + s); + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/lib64/"; + sl << "/usr/local/lib/"; + sl << "/usr/local/lib64/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libcurl.so"))){ + found = true; + break; + } + } + if(!found) return false; + conf->addLib(QString("-L") + s); + } + return true; + } +}; diff --git a/qcm/libmagick.qcm b/qcm/libmagick.qcm new file mode 100644 index 000000000..6e82064ab --- /dev/null +++ b/qcm/libmagick.qcm @@ -0,0 +1,76 @@ +/* +-----BEGIN QCMOD----- +name: libmagick +arg: with-libmagick-inc=[path], Path to libmagick++ include files +arg: with-libmagick-lib=[path], Path to libmagick++ library files +-----END QCMOD----- +*/ +#include +class qc_libmagick : public ConfObj +{ +public: + qc_libmagick(Conf *c) : ConfObj(c) {} + QString name() const { return "ImageMagick library (libmagick++)"; } + QString shortname() const { return "libmagick++"; } + QString checkString() const { + if(!conf->getenv("QC_DISABLE_libmagick").isEmpty()) + return ""; + return ConfObj::checkString(); + } + bool exec(){ + if(!conf->getenv("QC_DISABLE_libmagick").isEmpty()) + return false; + QString s; + s = conf->getenv("QC_WITH_LIBMAGICK_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "Magick++.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "Magick++.h")){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBMAGICK_LIB"); + if(!s.isEmpty()) { + if(!conf->checkLibrary(s, "Magick++")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/lib64/"; + sl << "/usr/local/lib/"; + sl << "/usr/local/lib64/"; + bool found = false; + foreach(s, sl){ + if(conf->checkLibrary(s, "Magick++")) { + found = true; + break; + } + } + if(!found) + return false; + } + conf->addLib(QString("-L") + s); + QString out = ""; + QStringList params; + params << "--libs"; + qconf->doCommand("Magick++-config", params, &out); + out = out.replace("\n", ""); + conf->addLib(result.data()); + conf->addDefine("HAVE_MAGICK"); + return true; + } +}; diff --git a/qcm/libtorrent-rasterbar.qcm b/qcm/libtorrent-rasterbar.qcm new file mode 100644 index 000000000..8f9cb7511 --- /dev/null +++ b/qcm/libtorrent-rasterbar.qcm @@ -0,0 +1,29 @@ +/* +-----BEGIN QCMOD----- +name: libtorrent-rasterbar +-----END QCMOD----- +*/ +// see Conf::findPkgConfig +class qc_libtorrent_rasterbar : public ConfObj +{ +public: + qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} + QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; } + QString shortname() const { return "libtorrent-rasterbar"; } + bool exec(){ + QStringList incs; + QString req_ver = "0.14.0"; + QString adv_ver = "0.14.4"; + QString version, libs, other; + VersionMode mode = VersionMin; + if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other)) + return false; + for(int n = 0; n < incs.count(); ++n) + conf->addIncludePath(incs[n]); + if(!libs.isEmpty()) + conf->addLib(libs); + if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other)) + printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); + return true; + } +}; diff --git a/qcm/libzzip.qcm b/qcm/libzzip.qcm new file mode 100644 index 000000000..acec24caa --- /dev/null +++ b/qcm/libzzip.qcm @@ -0,0 +1,71 @@ +/* +-----BEGIN QCMOD----- +name: libzzip +arg: with-libzzip-inc=[path], Path to libzzip++ include files +arg: with-libzzip-lib=[path], Path to libzzip++ library files +-----END QCMOD----- +*/ +#include +class qc_libzzip : public ConfObj +{ +public: + qc_libzzip(Conf *c) : ConfObj(c) {} + QString name() const { return "Zzip library (libzzip)"; } + QString shortname() const { return "libzzip"; } + QString checkString() const { + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return ""; + return ConfObj::checkString(); + } + bool exec(){ + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return false; + QString s; + s = conf->getenv("QC_WITH_LIBZZIP_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "zzip/zzip.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "zzip/zzip.h")){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBZZIP_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("/libzzip.so"))){ + return false; + } + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/lib64/"; + sl << "/usr/local/lib/"; + sl << "/usr/local/lib64/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libzzip.so"))){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addLib(QString("-L") + s); + conf->addLib("-lzzip"); + conf->addDefine("HAVE_ZZIP"); + return true; + } +}; diff --git a/qcm/qt4.qcm b/qcm/qt4.qcm new file mode 100644 index 000000000..00c709812 --- /dev/null +++ b/qcm/qt4.qcm @@ -0,0 +1,20 @@ +/* +-----BEGIN QCMOD----- +name: Qt >= 4.3 +-----END QCMOD----- +*/ +class qc_qt4 : public ConfObj +{ +public: + qc_qt4(Conf *c) : ConfObj(c) {} + QString name() const { return "Qt >= 4.3"; } + QString shortname() const { return "Qt 4.3"; } + bool exec() + { + if(QT_VERSION >= 0x040400) { + conf->addDefine("QT_4_4"); + } + return(QT_VERSION >= 0x040300); + + } +}; diff --git a/src/DLListDelegate.h b/src/DLListDelegate.h new file mode 100644 index 000000000..641e493c0 --- /dev/null +++ b/src/DLListDelegate.h @@ -0,0 +1,116 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DLLISTDELEGATE_H +#define DLLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for download list list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 +#define DLSPEED 3 +#define UPSPEED 4 +#define SEEDSLEECH 5 +#define RATIO 6 +#define ETA 7 +#define PRIORITY 8 +#define HASH 9 + +class DLListDelegate: public QItemDelegate { + Q_OBJECT + + public: + DLListDelegate(QObject *parent) : QItemDelegate(parent){} + + ~DLListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + switch(index.column()){ + case SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + case ETA: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); + break; + case UPSPEED: + case DLSPEED:{ + QItemDelegate::drawBackground(painter, opt, index); + double speed = index.data().toDouble(); + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); + break; + } + case RATIO:{ + QItemDelegate::drawBackground(painter, opt, index); + double ratio = index.data().toDouble(); + if(ratio > 100.) + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); + else + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); + break; + } + case PROGRESS:{ + QStyleOptionProgressBarV2 newopt; + double progress = index.data().toDouble()*100.; + newopt.rect = opt.rect; + newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + break; + } + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; + } + +}; + +#endif diff --git a/src/FeedDownloader.h b/src/FeedDownloader.h new file mode 100644 index 000000000..70b94b40f --- /dev/null +++ b/src/FeedDownloader.h @@ -0,0 +1,480 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef FEEDDOWNLOADER_H +#define FEEDDOWNLOADER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bittorrent.h" +#include "ui_FeedDownloader.h" + +class FeedFilter: public QHash { +private: + bool valid; +public: + FeedFilter():valid(true) {} + FeedFilter(bool valid): valid(valid) {} + FeedFilter(QHash filter): QHash(filter), valid(true) {} + + bool matches(QString s) { + QStringList match_tokens = getMatchingTokens(); + foreach(const QString& token, match_tokens) { + if(token.isEmpty() || token == "") + continue; + QRegExp reg(token, Qt::CaseInsensitive); + if(reg.indexIn(s) < 0) return false; + } + // Checking not matching + QStringList notmatch_tokens = getNotMatchingTokens(); + foreach(const QString& token, notmatch_tokens) { + if(token.isEmpty()) continue; + QRegExp reg(token, Qt::CaseInsensitive); + if(reg.indexIn(s) > -1) return false; + } + return true; + } + + bool isValid() const { + return valid; + } + + QStringList getMatchingTokens() const { + QString matches = this->value("matches", "").toString(); + return matches.split(" "); + } + + QString getMatchingTokens_str() const { + return this->value("matches", "").toString(); + } + + void setMatchingTokens(QString tokens) { + tokens = tokens.trimmed(); + if(tokens.isEmpty()) + (*this)["matches"] = ""; + else + (*this)["matches"] = tokens; + } + + QStringList getNotMatchingTokens() const { + QString notmatching = this->value("not", "").toString(); + return notmatching.split(" "); + } + + QString getNotMatchingTokens_str() const { + return this->value("not", "").toString(); + } + + void setNotMatchingTokens(QString tokens) { + (*this)["not"] = tokens.trimmed(); + } + + QString getSavePath() const { + return this->value("save_path", "").toString(); + } + + void setSavePath(QString save_path) { + (*this)["save_path"] = save_path; + } + +}; + +class FeedFilters : public QHash { + +private: + QString feed_url; + +public: + FeedFilters() {} + FeedFilters(QString feed_url, QHash filters): QHash(filters), feed_url(feed_url) {} + + bool hasFilter(QString name) const { + return this->contains(name); + } + + FeedFilter* matches(QString s) { + if(!isDownloadingEnabled()) return 0; + if(this->size() == 0) return new FeedFilter(false); + foreach(QVariant var_hash_filter, this->values()) { + QHash hash_filter = var_hash_filter.toHash(); + FeedFilter *filter = new FeedFilter(hash_filter); + if(filter->matches(s)) + return filter; + else + delete filter; + } + return 0; + } + + QStringList names() const { + return this->keys(); + } + + FeedFilter getFilter(QString name) const { + if(this->contains(name)) + return FeedFilter(this->value(name).toHash()); + return FeedFilter(); + } + + void setFilter(QString name, FeedFilter f) { + (*this)[name] = f; + } + + bool isDownloadingEnabled() const { + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QHash feeds_w_downloader = qBTRSS.value("downloader_on", QHash()).toHash(); + return feeds_w_downloader.value(feed_url, false).toBool(); + } + + void setDownloadingEnabled(bool enabled) { + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QHash feeds_w_downloader = qBTRSS.value("downloader_on", QHash()).toHash(); + feeds_w_downloader[feed_url] = enabled; + qBTRSS.setValue("downloader_on", feeds_w_downloader); + } + + static FeedFilters getFeedFilters(QString url) { + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QHash all_feeds_filters = qBTRSS.value("feed_filters", QHash()).toHash(); + return FeedFilters(url, all_feeds_filters.value(url, QHash()).toHash()); + } + + void rename(QString old_name, QString new_name) { + Q_ASSERT(this->contains(old_name)); + (*this)[new_name] = this->take(old_name); + } + + bool serialize(QString path) { + QFile f(path); + if(f.open(QIODevice::WriteOnly)) { + QDataStream out(&f); + out.setVersion(QDataStream::Qt_4_3); + out << (QHash)(*this); + f.close(); + return true; + } else { + return false; + } + } + + bool unserialize(QString path) { + QFile f(path); + if(f.open(QIODevice::ReadOnly)) { + QDataStream in(&f); + in.setVersion(QDataStream::Qt_4_3); + QHash tmp; + in >> tmp; + qDebug("Unserialized %d filters", tmp.size()); + foreach(const QString& key, tmp.keys()) { + (*this)[key] = tmp[key]; + } + return true; + } else { + return false; + } + } + + void save() { + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QHash all_feeds_filters = qBTRSS.value("feed_filters", QHash()).toHash(); + qDebug("Saving filters for feed: %s (%d filters)", feed_url.toLocal8Bit().data(), (*this).size()); + all_feeds_filters[feed_url] = *this; + qBTRSS.setValue("feed_filters", all_feeds_filters); + } +}; + +class FeedDownloaderDlg : public QDialog, private Ui_FeedDownloader{ + Q_OBJECT + +private: + QString feed_url; + QString feed_name; + FeedFilters filters; + bittorrent *BTSession; + QString selected_filter; // name + +public: + FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + Q_ASSERT(!feed_name.isEmpty()); + rssfeed_lbl->setText(feed_name); + filters = FeedFilters::getFeedFilters(feed_url); + // Connect Signals/Slots + connect(filtersList, SIGNAL(currentItemChanged(QListWidgetItem* , QListWidgetItem *)), this, SLOT(showFilterSettings(QListWidgetItem *))); + connect(filtersList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFiltersListMenu(const QPoint&))); + connect(actionAdd_filter, SIGNAL(triggered()), this, SLOT(addFilter())); + connect(actionRemove_filter, SIGNAL(triggered()), this, SLOT(deleteFilter())); + connect(actionRename_filter, SIGNAL(triggered()), this, SLOT(renameFilter())); + connect(del_button, SIGNAL(clicked(bool)), this, SLOT(deleteFilter())); + connect(add_button, SIGNAL(clicked(bool)), this, SLOT(addFilter())); + connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int))); + // Restore saved info + enableDl_cb->setChecked(filters.isDownloadingEnabled()); + fillFiltersList(); + if(filters.size() > 0) { + // Select first filter + filtersList->setCurrentItem(filtersList->item(0)); + //showFilterSettings(filtersList->item(0)); + } + // Show + show(); + } + + ~FeedDownloaderDlg() { + // Make sure we save everything + saveCurrentFilterSettings(); + filters.save(); + } + +protected slots: + void saveCurrentFilterSettings() { + if(!selected_filter.isEmpty()) { + FeedFilter filter = filters.getFilter(selected_filter); + filter.setMatchingTokens(match_line->text()); + filter.setNotMatchingTokens(notmatch_line->text()); + QString save_path = savepath_line->text().trimmed(); + if(save_path.isEmpty()) + save_path = BTSession->getDefaultSavePath(); + filter.setSavePath(save_path); + // Save updated filter + filters.setFilter(selected_filter, filter); + } + } + + void fillFiltersList() { + // Fill filter list + foreach(QString filter_name, filters.names()) { + new QListWidgetItem(filter_name, filtersList); + } + } + + void displayFiltersListMenu(const QPoint&) { + QMenu myFiltersListMenu(this); + if(filtersList->selectedItems().size() > 0) { + myFiltersListMenu.addAction(actionRename_filter); + myFiltersListMenu.addAction(actionRemove_filter); + } else { + myFiltersListMenu.addAction(actionAdd_filter); + } + // Call menu + myFiltersListMenu.exec(QCursor::pos()); + } + + void showFilterSettings(QListWidgetItem *item) { + // First, save current filter settings + saveCurrentFilterSettings(); + // Clear all fields + clearFields(); + if(!item) { + qDebug("No new selected item"); + return; + } + // Actually show filter settings + QString filter_name = item->text(); + FeedFilter filter = filters.getFilter(filter_name); + filterSettingsBox->setEnabled(true); + match_line->setText(filter.getMatchingTokens_str()); + if(match_line->text().trimmed().isEmpty()) { + match_line->setText(filter_name); + } + notmatch_line->setText(filter.getNotMatchingTokens_str()); + QString save_path = filter.getSavePath(); + if(save_path.isEmpty()) + save_path = BTSession->getDefaultSavePath(); + savepath_line->setText(save_path); + // Update selected filter + selected_filter = filter_name; + } + + void deleteFilter() { + QList items = filtersList->selectedItems(); + if(items.size() == 1) { + QListWidgetItem * item = items.first(); + filters.remove(item->text()); + selected_filter = QString::null; + delete item; + // Reset Filter settings view + if(filters.size() == 0) { + clearFields(); + filterSettingsBox->setEnabled(false); + } + } + } + + void renameFilter() { + QList items = filtersList->selectedItems(); + if(items.size() == 1) { + QListWidgetItem *item = items.first(); + QString current_name = item->text(); + QString new_name; + bool validated = false; + do { + new_name = askFilterName(current_name); + if(new_name.isNull() || new_name == current_name) return; + if(!filters.hasFilter(new_name)) { + validated = true; + } else { + QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use.")); + } + }while(!validated); + // Rename the filter + filters.rename(current_name, new_name); + if(selected_filter == current_name) + selected_filter = new_name; + item->setText(new_name); + } + } + + void enableFilterBox(int state) { + if(state == Qt::Checked) { + filtersBox->setEnabled(true); + filters.setDownloadingEnabled(true); + } else { + filtersBox->setEnabled(false); + filters.setDownloadingEnabled(false); + } + } + + QString askFilterName(QString name=QString::null) { + QString name_prop; + if(name.isEmpty()) + name_prop = tr("New filter"); + else + name_prop = name; + QString new_name; + bool validated = false; + do { + bool ok; + new_name = QInputDialog::getText(this, tr("Please choose a name for this filter"), tr("Filter name:"), QLineEdit::Normal, name_prop, &ok); + if(!ok) { + return QString::null; + } + // Validate filter name + new_name = new_name.trimmed(); + if(new_name.isEmpty()) { + // Cannot be left empty + QMessageBox::warning(0, tr("Invalid filter name"), tr("The filter name cannot be left empty.")); + } else { + validated = true; + } + } while(!validated); + return new_name; + } + + void addFilter() { + QString filter_name = QString::null; + bool validated = false; + do { + filter_name = askFilterName(); + if(filter_name.isNull()) return; + if(filters.hasFilter(filter_name)) { + // Filter alread exists + QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use.")); + } else { + validated = true; + } + }while(!validated); + QListWidgetItem *it = new QListWidgetItem(filter_name, filtersList); + filtersList->setCurrentItem(it); + //showFilterSettings(it); + } + + void clearFields() { + match_line->clear(); + notmatch_line->clear(); + savepath_line->clear(); + test_res_lbl->setText(""); + test_line->clear(); + } + + void on_testButton_clicked(bool) { + if(selected_filter.isEmpty()) return; + QString s = test_line->text().trimmed(); + if(s.isEmpty()) { + QMessageBox::warning(0, tr("Filter testing error"), tr("Please specify a test torrent name.")); + return; + } + // Get current filter + saveCurrentFilterSettings(); + FeedFilter f = filters.getFilter(selected_filter); + if(f.matches(s)) + test_res_lbl->setText(""+tr("matches")+""); + else + test_res_lbl->setText(""+tr("does not match")+""); + } + + void on_importButton_clicked(bool) { + QString source = QFileDialog::getOpenFileName(0, tr("Select file to import"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)")); + if(source.isEmpty()) return; + if(filters.unserialize(source)) { + // Clean up first + clearFields(); + filtersList->clear(); + selected_filter = QString::null; + fillFiltersList(); + if(filters.size() > 0) + filtersList->setCurrentItem(filtersList->item(0)); + QMessageBox::information(0, tr("Import successful"), tr("Filters import was successful.")); + } else { + QMessageBox::warning(0, tr("Import failure"), tr("Filters could not be imported due to an I/O error.")); + } + } + + void on_exportButton_clicked(bool) { + QString destination = QFileDialog::getSaveFileName(this, tr("Select destination file"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)")); + if(destination.isEmpty()) return; + // Append file extension + if(!destination.endsWith(".filters")) + destination += ".filters"; + if(QFile::exists(destination)) { + int ret = QMessageBox::question(0, tr("Overwriting confirmation"), tr("Are you sure you want to overwrite existing file?"), QMessageBox::Yes|QMessageBox::No); + if(ret != QMessageBox::Yes) return; + } + if(filters.serialize(destination)) + QMessageBox::information(0, tr("Export successful"), tr("Filters export was successful.")); + else + QMessageBox::warning(0, tr("Export failure"), tr("Filters could not be exported due to an I/O error.")); + } + +}; + +#endif // FEEDDOWNLOADER_H diff --git a/src/FeedDownloader.ui b/src/FeedDownloader.ui new file mode 100644 index 000000000..f19c37017 --- /dev/null +++ b/src/FeedDownloader.ui @@ -0,0 +1,546 @@ + + + FeedDownloader + + + + 0 + 0 + 737 + 415 + + + + RSS Feed downloader + + + + + + + + + 16 + 75 + true + + + + RSS feed: + + + + + + + + 16 + 75 + true + + + + Feed name + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Automatically download torrents from this feed + + + + + + + false + + + + 75 + true + + + + Download filters + + + + + + + + + + + + + 75 + true + + + + Filters: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::CustomContextMenu + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + false + + + + 75 + true + + + + false + + + + + + Filter settings + + + false + + + + + + + + + + + 50 + false + + + + Matches: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 50 + false + + + + Does not match: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 50 + false + + + + Destination folder: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + + + + + + 300 + 0 + + + + + + + + + 50 + false + + + + ... + + + + + + + + + + + + + Filter testing + + + + + + + + + + + 0 + 28 + + + + + 50 + false + + + + Torrent title: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 50 + false + + + + Result: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + 50 + false + + + + Test + + + + + + + + + + + + 50 + false + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 9 + + + + + + + + + + + + + + + + + + Import... + + + + + + + Export... + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + :/Icons/oxygen/edit_clear.png:/Icons/oxygen/edit_clear.png + + + Rename filter + + + Rename filter + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + Remove filter + + + Remove filter + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + Add filter + + + + + + + + + buttonBox + accepted() + FeedDownloader + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + FeedDownloader + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/FinishedListDelegate.h b/src/FinishedListDelegate.h new file mode 100644 index 000000000..0fb0495a4 --- /dev/null +++ b/src/FinishedListDelegate.h @@ -0,0 +1,98 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef FINISHEDLISTDELEGATE_H +#define FINISHEDLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for download list list columns +#define F_NAME 0 +#define F_SIZE 1 +#define F_UPSPEED 2 +#define F_SWARM 3 +#define F_PEERS 4 +#define F_UPLOAD 5 +#define F_RATIO 6 +#define F_HASH 7 + +#define MAX_RATIO 100. + +class FinishedListDelegate: public QItemDelegate { + Q_OBJECT + + public: + FinishedListDelegate(QObject *parent) : QItemDelegate(parent){} + + ~FinishedListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + switch(index.column()){ + case F_SIZE: + case F_UPLOAD: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + case F_UPSPEED:{ + QItemDelegate::drawBackground(painter, opt, index); + double speed = index.data().toDouble(); + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); + break; + } + case F_RATIO:{ + QItemDelegate::drawBackground(painter, opt, index); + double ratio = index.data().toDouble(); + if(ratio > MAX_RATIO) + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); + else + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); + break; + } + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; + } + +}; + +#endif diff --git a/src/FinishedTorrents.cpp b/src/FinishedTorrents.cpp new file mode 100644 index 000000000..50e801860 --- /dev/null +++ b/src/FinishedTorrents.cpp @@ -0,0 +1,640 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ +#include "FinishedTorrents.h" +#include "misc.h" +#include "properties_imp.h" +#include "bittorrent.h" +#include "allocationDlg.h" +#include "FinishedListDelegate.h" +#include "GUI.h" + +#include +#include +#include +#include +#include +#include +#include + +FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : parent(parent), BTSession(BTSession), nbFinished(0){ + setupUi(this); + actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); + actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); + finishedListModel = new QStandardItemModel(0,8); + finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); + finishedListModel->setHeaderData(F_SWARM, Qt::Horizontal, tr("Seeds / Leechers")); + finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers")); + finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data")); + finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio")); + + proxyModel = new QSortFilterProxyModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(finishedListModel); + finishedList->setModel(proxyModel); + + finishedList->setRootIsDecorated(false); + finishedList->setAllColumnsShowFocus(true); + finishedList->setSortingEnabled(true); + + loadHiddenColumns(); + // Hide hash column + finishedList->hideColumn(F_HASH); + // Load last columns width for download list + if(!loadColWidthFinishedList()){ + finishedList->header()->resizeSection(0, 200); + } + // Connect BTSession signals + connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&))); + // Make download list header clickable for sorting + finishedList->header()->setClickable(true); + finishedList->header()->setSortIndicatorShown(true); + finishedListDelegate = new FinishedListDelegate(finishedList); + finishedList->setItemDelegate(finishedListDelegate); + connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&))); + finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&))); + connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&))); + actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); + actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); + actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); + actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); + actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); + actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png"))); + + connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); + connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); + connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); + connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); + connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); + connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); + connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage())); + connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection())); + connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck())); + connect(actionCopy_magnet_link, SIGNAL(triggered()), (GUI*)parent, SLOT(copyMagnetURI())); + + connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName())); + connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize())); + connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed())); + connect(actionHOSColSwarm, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSwarm())); + connect(actionHOSColPeers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPeers())); + connect(actionHOSColUpload, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpload())); + connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio())); +} + +FinishedTorrents::~FinishedTorrents(){ + saveLastSortedColumn(); + saveColWidthFinishedList(); + saveHiddenColumns(); + delete finishedListDelegate; + delete proxyModel; + delete finishedListModel; +} + +void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) { + unsigned int row = index.row(); + QString hash = getHashFromRow(row); + emit torrentDoubleClicked(hash, true); +} + +void FinishedTorrents::addTorrent(QString hash){ + int row = getRowFromHash(hash); + if(row != -1) return; + row = finishedListModel->rowCount(); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + // Adding torrent to download list + finishedListModel->insertRow(row); + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name())); + finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); + finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.)); + finishedListModel->setData(finishedListModel->index(row, F_SWARM), QVariant("-1/-1")); + finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant("0")); + finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((qlonglong)h.all_time_upload())); + finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str()))); + finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash)); + if(h.is_paused()) { + finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + setRowColor(row, "red"); + }else{ + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + setRowColor(row, "orange"); + } + // Update the number of finished torrents + ++nbFinished; + emit finishedTorrentsNumberChanged(nbFinished); + + loadLastSortedColumn(); +} + +// Set the color of a row in data model +void FinishedTorrents::setRowColor(int row, QString color){ + unsigned int nbColumns = finishedListModel->columnCount()-1; + for(unsigned int i=0; isetData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); + } +} + +QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{ + QStringList res; + QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == F_NAME) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + res << hash; + if(only_one) break; + } + } + return res; +} + +unsigned int FinishedTorrents::getNbTorrentsInList() const { + return nbFinished; +} + +// Load columns width in a file that were saved previously +// (finished list) +bool FinishedTorrents::loadColWidthFinishedList(){ + qDebug("Loading columns width for finished list"); + QSettings settings("qBittorrent", "qBittorrent"); + QString line = settings.value("FinishedListColsWidth", QString()).toString(); + if(line.isEmpty()) + return false; + QStringList width_list = line.split(' '); + if(width_list.size() < finishedListModel->columnCount()-1) + return false; + unsigned int listSize = width_list.size(); + for(unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + } + loadLastSortedColumn(); + QVariantList visualIndexes = settings.value(QString::fromUtf8("FinishedListVisualIndexes"), QVariantList()).toList(); + if(visualIndexes.size() != finishedListModel->columnCount()-1) { + qDebug("Corrupted values for download list columns sizes"); + return false; + } + bool change = false; + do { + change = false; + for(int i=0;iheader()->logicalIndex(i)).toInt(); + if(i != new_visual_index) { + qDebug("Moving column from %d to %d", finishedList->header()->logicalIndex(i), new_visual_index); + finishedList->header()->moveSection(i, new_visual_index); + change = true; + } + } + }while(change); + qDebug("Finished list columns width loaded"); + return true; +} + +void FinishedTorrents::saveLastSortedColumn() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + Qt::SortOrder sortOrder = finishedList->header()->sortIndicatorOrder(); + QString sortOrderLetter; + if(sortOrder == Qt::AscendingOrder) + sortOrderLetter = QString::fromUtf8("a"); + else + sortOrderLetter = QString::fromUtf8("d"); + int index = finishedList->header()->sortIndicatorSection(); + settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter); +} + +void FinishedTorrents::loadLastSortedColumn() { + // Loading last sorted column + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QString sortedCol = settings.value(QString::fromUtf8("FinishedListSortedCol"), QString()).toString(); + if(!sortedCol.isEmpty()) { + Qt::SortOrder sortOrder; + if(sortedCol.endsWith(QString::fromUtf8("d"))) + sortOrder = Qt::DescendingOrder; + else + sortOrder = Qt::AscendingOrder; + sortedCol = sortedCol.left(sortedCol.size()-1); + int index = sortedCol.toInt(); + finishedList->sortByColumn(index, sortOrder); + } +} + +// Save columns width in a file to remember them +// (finished list) +void FinishedTorrents::saveColWidthFinishedList() const{ + qDebug("Saving columns width in finished list"); + QSettings settings("qBittorrent", "qBittorrent"); + QStringList width_list; + QStringList new_width_list; + short nbColumns = finishedListModel->columnCount()-1; + + QString line = settings.value("FinishedListColsWidth", QString()).toString(); + if(!line.isEmpty()) { + width_list = line.split(' '); + } + for(short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { + // load the former width + new_width_list << width_list.at(i); + } else if(finishedList->columnWidth(i)>=1) { + // usual case, save the current width + new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str()); + } else { + // default width + finishedList->resizeColumnToContents(i); + new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str()); + } + } + settings.setValue("FinishedListColsWidth", new_width_list.join(" ")); + QVariantList visualIndexes; + for(int i=0; iheader()->visualIndex(i)); + } + settings.setValue(QString::fromUtf8("FinishedListVisualIndexes"), visualIndexes); + qDebug("Finished list columns width saved"); +} + +void FinishedTorrents::on_actionSet_upload_limit_triggered(){ + QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); + QStringList hashes; + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == F_NAME){ + // Get the file hash + hashes << getHashFromRow(index.row()); + } + } + new BandwidthAllocationDialog(this, true, BTSession, hashes); +} + +void FinishedTorrents::updateMetadata(QTorrentHandle &h) { + QString hash = h.hash(); + int row = getRowFromHash(hash); + if(row != -1) { + qDebug("Updating torrent metadata in download list"); + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name())); + finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); + } +} + +void FinishedTorrents::updateTorrent(QTorrentHandle h) { + if(!h.is_valid()) return; + QString hash = h.hash(); + int row = getRowFromHash(hash); + if(row == -1){ + qDebug("Cannot find torrent in finished list, adding it"); + addTorrent(hash); + row = getRowFromHash(hash); + } + Q_ASSERT(row != -1); + if(!finishedList->isColumnHidden(F_SWARM)) { + finishedListModel->setData(finishedListModel->index(row, F_SWARM), misc::toQString(h.num_complete())+QString("/")+misc::toQString(h.num_incomplete())); + } + if(h.is_paused()) return; + // Update queued torrent + if(BTSession->isQueueingEnabled() && h.is_queued()) { + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){ + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + } else { + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); + } + // Reset upload speed and seeds/leech + finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.); + finishedListModel->setData(finishedListModel->index(row, F_PEERS), "0"); + setRowColor(row, QString::fromUtf8("grey")); + return; + } + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){ + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + setRowColor(row, QString::fromUtf8("grey")); + return; + } + setRowColor(row, QString::fromUtf8("orange")); + finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole); + if(!finishedList->isColumnHidden(F_UPSPEED)) { + finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate())); + } + if(!finishedList->isColumnHidden(F_PEERS)) { + finishedListModel->setData(finishedListModel->index(row, F_PEERS), misc::toQString(h.num_peers() - h.num_seeds(), true)); + } + if(!finishedList->isColumnHidden(F_UPLOAD)) { + finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((double)h.all_time_upload())); + } + if(!finishedList->isColumnHidden(F_RATIO)) { + finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash)))); + } +} + +int FinishedTorrents::getRowFromHash(QString hash) const{ + unsigned int nbRows = finishedListModel->rowCount(); + for(unsigned int i=0; idata(finishedListModel->index(i, F_HASH)) == hash){ + return i; + } + } + return -1; +} + +// Note: does not actually pause the torrent in BT Session +void FinishedTorrents::pauseTorrent(QString hash) { + int row = getRowFromHash(hash); + if(row == -1) + return; + finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0)); + finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); + finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant(QString::fromUtf8("0"))); + setRowColor(row, QString::fromUtf8("red")); +} + +QString FinishedTorrents::getHashFromRow(unsigned int row) const { + Q_ASSERT(row < (unsigned int)proxyModel->rowCount()); + return proxyModel->data(proxyModel->index(row, F_HASH)).toString(); +} + +// Will move it to download tab +void FinishedTorrents::deleteTorrent(QString hash){ + int row = getRowFromHash(hash); + if(row == -1){ + qDebug("Torrent is not in finished list, nothing to delete"); + return; + } + // Select item just under (or above nothing under) the one that was deleted + QModelIndex current_prox_index = proxyModel->mapFromSource(finishedListModel->index(row, 0, finishedList->rootIndex())); + bool was_selected = finishedList->selectionModel()->isSelected(current_prox_index); + if(finishedListModel->rowCount() > 1 && was_selected) { + QModelIndex under_prox_index; + if(current_prox_index.row() == finishedListModel->rowCount()-1) + under_prox_index = proxyModel->index(current_prox_index.row()-1, 0); + else + under_prox_index = proxyModel->index(current_prox_index.row()+1, 0); + //downloadList->selectionModel()->select(under_prox_index, QItemSelectionModel::Current|QItemSelectionModel::Columns|QItemSelectionModel::Select); + finishedList->setCurrentIndex(under_prox_index); + finishedList->update(); + } + // Actually delete the row + finishedListModel->removeRow(row); + --nbFinished; + emit finishedTorrentsNumberChanged(nbFinished); +} + +// Show torrent properties dialog +void FinishedTorrents::showProperties(const QModelIndex &index){ + showPropertiesFromHash(getHashFromRow(index.row())); +} + +void FinishedTorrents::showPropertiesFromHash(QString hash){ + QTorrentHandle h = BTSession->getTorrentHandle(hash); + properties *prop = new properties(this, BTSession, h); + connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSize(QString))); + connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString))); + prop->show(); +} + +void FinishedTorrents::updateFileSize(QString hash){ + int row = getRowFromHash(hash); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); +} + +// display properties of selected items +void FinishedTorrents::propertiesSelection(){ + QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == F_NAME){ + showProperties(index); + } + } +} + +void FinishedTorrents::forceRecheck(){ + QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == F_NAME){ + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data()); + h.force_recheck(); + } + } +} + +void FinishedTorrents::displayFinishedListMenu(const QPoint&){ + QMenu myFinishedListMenu(this); + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); + bool has_pause = false, has_start = false, has_preview = false; + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == F_NAME) { + // Get the file name + QString hash = getHashFromRow(index.row()); + // Get handle and pause the torrent + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(!h.is_valid()) continue; + if(h.is_paused()) { + if(!has_start) { + myFinishedListMenu.addAction(actionStart); + has_start = true; + } + }else{ + if(!has_pause) { + myFinishedListMenu.addAction(actionPause); + has_pause = true; + } + } + if(BTSession->isFilePreviewPossible(hash) && !has_preview) { + myFinishedListMenu.addAction(actionPreview_file); + has_preview = true; + } + if(has_pause && has_start && has_preview) break; + } + } + myFinishedListMenu.addSeparator(); + myFinishedListMenu.addAction(actionDelete); + myFinishedListMenu.addAction(actionDelete_Permanently); + myFinishedListMenu.addSeparator(); + myFinishedListMenu.addAction(actionSet_upload_limit); + myFinishedListMenu.addSeparator(); + myFinishedListMenu.addAction(actionForce_recheck); + myFinishedListMenu.addSeparator(); + myFinishedListMenu.addAction(actionOpen_destination_folder); + myFinishedListMenu.addAction(actionTorrent_Properties); + myFinishedListMenu.addSeparator(); + myFinishedListMenu.addAction(actionCopy_magnet_link); + myFinishedListMenu.addAction(actionBuy_it); + + // Call menu + myFinishedListMenu.exec(QCursor::pos()); +} + + +/* + * Hiding Columns functions + */ + +// hide/show columns menu +void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){ + QMenu hideshowColumn(this); + hideshowColumn.setTitle(tr("Hide or Show Column")); + int lastCol = F_RATIO; + for(int i=0; i<=lastCol; i++) { + hideshowColumn.addAction(getActionHoSCol(i)); + } + // Call menu + hideshowColumn.exec(QCursor::pos()); +} + +// toggle hide/show a column +void FinishedTorrents::hideOrShowColumn(int index) { + unsigned int nbVisibleColumns = 0; + unsigned int nbCols = finishedListModel->columnCount(); + // Count visible columns + for(unsigned int i=0; iisColumnHidden(i)) + ++nbVisibleColumns; + } + if(!finishedList->isColumnHidden(index)) { + // User wants to hide the column + // Is there at least one other visible column? + if(nbVisibleColumns <= 1) return; + // User can hide the column, do it. + finishedList->setColumnHidden(index, true); + getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + --nbVisibleColumns; + } else { + // User want to display the column + finishedList->setColumnHidden(index, false); + getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); + ++nbVisibleColumns; + } + //resize all others non-hidden columns + for(unsigned int i=0; iisColumnHidden(i)) { + finishedList->setColumnWidth(i, (int)ceil(finishedList->columnWidth(i)+(finishedList->columnWidth(index)/nbVisibleColumns))); + } + } +} + +void FinishedTorrents::hideOrShowColumnName() { + hideOrShowColumn(F_NAME); +} + +void FinishedTorrents::hideOrShowColumnSize() { + hideOrShowColumn(F_SIZE); +} + +void FinishedTorrents::hideOrShowColumnUpSpeed() { + hideOrShowColumn(F_UPSPEED); +} + +void FinishedTorrents::hideOrShowColumnSwarm() { + hideOrShowColumn(F_SWARM); +} + +void FinishedTorrents::hideOrShowColumnPeers() { + hideOrShowColumn(F_PEERS); +} + +void FinishedTorrents::hideOrShowColumnUpload() { + hideOrShowColumn(F_UPLOAD); +} + +void FinishedTorrents::hideOrShowColumnRatio() { + hideOrShowColumn(F_RATIO); +} + +// load the previous settings, and hide the columns +bool FinishedTorrents::loadHiddenColumns() { + bool loaded = false; + QSettings settings("qBittorrent", "qBittorrent"); + QString line = settings.value("FinishedListColsHoS", QString()).toString(); + QStringList ishidden_list; + if(!line.isEmpty()) { + ishidden_list = line.split(' '); + if(ishidden_list.size() == finishedListModel->columnCount()-1) { + unsigned int listSize = ishidden_list.size(); + for(unsigned int i=0; iheader()->resizeSection(i, ishidden_list.at(i).toInt()); + } + loaded = true; + } + } + for(int i=0; icolumnCount()-1; i++) { + if(loaded && ishidden_list.at(i) == "0") { + finishedList->setColumnHidden(i, true); + getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + } else { + getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); + } + } + return loaded; +} + +// save the hidden columns in settings +void FinishedTorrents::saveHiddenColumns() { + QSettings settings("qBittorrent", "qBittorrent"); + QStringList ishidden_list; + short nbColumns = finishedListModel->columnCount()-1; + + for(short i=0; iisColumnHidden(i)) { + ishidden_list << QString::fromUtf8(misc::toString(0).c_str()); + } else { + ishidden_list << QString::fromUtf8(misc::toString(1).c_str()); + } + } + settings.setValue("FinishedListColsHoS", ishidden_list.join(" ")); +} + +// getter, return the action hide or show whose id is index +QAction* FinishedTorrents::getActionHoSCol(int index) { + switch(index) { + case F_NAME : + return actionHOSColName; + break; + case F_SIZE : + return actionHOSColSize; + break; + case F_UPSPEED : + return actionHOSColUpSpeed; + break; + case F_SWARM : + return actionHOSColSwarm; + break; + case F_PEERS : + return actionHOSColPeers; + break; + case F_UPLOAD : + return actionHOSColUpload; + break; + case F_RATIO : + return actionHOSColRatio; + break; + default : + return NULL; + } +} diff --git a/src/FinishedTorrents.h b/src/FinishedTorrents.h new file mode 100644 index 000000000..c220b26e5 --- /dev/null +++ b/src/FinishedTorrents.h @@ -0,0 +1,104 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEEDING_H +#define SEEDING_H + +#include "ui_seeding.h" +#include "qtorrenthandle.h" + +class QStandardItemModel; +class QSortFilterProxyModel; +class bittorrent; +class FinishedListDelegate; + +using namespace libtorrent; + +class FinishedTorrents : public QWidget, public Ui::seeding { + Q_OBJECT + private: + QObject *parent; + bittorrent *BTSession; + FinishedListDelegate *finishedListDelegate; + QStandardItemModel *finishedListModel; + QSortFilterProxyModel *proxyModel; + unsigned int nbFinished; + void hideOrShowColumn(int index); + bool loadHiddenColumns(); + void saveHiddenColumns(); + QAction* getActionHoSCol(int index); + + public: + FinishedTorrents(QObject *parent, bittorrent *BTSession); + ~FinishedTorrents(); + // Methods + bool loadColWidthFinishedList(); + int getRowFromHash(QString hash) const; + QStringList getSelectedTorrents(bool only_one=false) const; + unsigned int getNbTorrentsInList() const; + QString getHashFromRow(unsigned int row) const; + + protected slots: + void showProperties(const QModelIndex &index); + void displayFinishedListMenu(const QPoint&); + void displayFinishedHoSMenu(const QPoint&); + void setRowColor(int row, QString color); + void saveColWidthFinishedList() const; + void updateFileSize(QString hash); + void on_actionSet_upload_limit_triggered(); + void notifyTorrentDoubleClicked(const QModelIndex& index); + void hideOrShowColumnName(); + void hideOrShowColumnSize(); + void hideOrShowColumnUpSpeed(); + void hideOrShowColumnSwarm(); + void hideOrShowColumnPeers(); + void hideOrShowColumnUpload(); + void hideOrShowColumnRatio(); + void forceRecheck(); + + public slots: + void addTorrent(QString hash); + void updateTorrent(QTorrentHandle h); + void pauseTorrent(QString hash); + void propertiesSelection(); + void deleteTorrent(QString hash); + void showPropertiesFromHash(QString hash); + void loadLastSortedColumn(); + void saveLastSortedColumn(); + void updateMetadata(QTorrentHandle &h); + + signals: + void torrentMovedFromFinishedList(QString); + void torrentDoubleClicked(QString hash, bool finished); + void finishedTorrentsNumberChanged(unsigned int); + +}; + +#endif diff --git a/src/GUI.cpp b/src/GUI.cpp new file mode 100644 index 000000000..7bc68ac43 --- /dev/null +++ b/src/GUI.cpp @@ -0,0 +1,1669 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef QT_4_4 +#include +#include +#include +#include +#else +#include +#include +#endif +#include +#include +#include +#include +#include + +#include "GUI.h" +#include "downloadingTorrents.h" +#include "misc.h" +#include "createtorrent_imp.h" +#include "downloadFromURLImp.h" +#include "torrentAddition.h" +#include "searchEngine.h" +#include "rss_imp.h" +#include "FinishedTorrents.h" +#include "bittorrent.h" +#include "about_imp.h" +#include "trackerLogin.h" +#include "options_imp.h" +#include "previewSelect.h" +#include "allocationDlg.h" +#include +#include "console_imp.h" +#include "httpserver.h" +#include "torrentPersistentData.h" + +using namespace libtorrent; + +/***************************************************** + * * + * GUI * + * * + *****************************************************/ + +// Constructor +GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false), refreshInterval(1500) { + setupUi(this); + setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + systrayIntegration = settings.value(QString::fromUtf8("Preferences/General/SystrayEnabled"), true).toBool(); + systrayCreator = 0; + // Create tray icon + if (QSystemTrayIcon::isSystemTrayAvailable()) { + if(systrayIntegration) { + createTrayIcon(); + } + }else{ + if(systrayIntegration) { + // May be system startup, check again later + systrayCreator = new QTimer(this); + connect(systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed())); + systrayCreator->start(1000); + } + systrayIntegration = false; + qDebug("Info: System tray unavailable"); + } + // Setting icons + this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png"))); + actionOpen->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/open.png"))); + actionExit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/exit.png"))); + actionDownload_from_URL->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/url.png"))); + actionOptions->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/settings.png"))); + actionAbout->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/info.png"))); + actionWebsite->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png"))); + actionBugReport->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/bug.png"))); + actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); + actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); + actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); + actionPause_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause_all.png"))); + actionStart_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play_all.png"))); + actionClearLog->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); + actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); + actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); + actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); + actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qb_question.png"))); + prioSeparator = toolBar->insertSeparator(actionDecreasePriority); + prioSeparator2 = menu_Edit->insertSeparator(actionDecreasePriority); + prioSeparator->setVisible(false); + prioSeparator2->setVisible(false); + actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); + actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); + actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png"))); + // Fix Tool bar layout + toolBar->layout()->setSpacing(7); + // creating options + options = new options_imp(this); + connect(options, SIGNAL(status_changed(bool)), this, SLOT(OptionsSaved(bool))); + BTSession = new bittorrent(); + connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString))); + connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(addedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(pausedTorrent(QTorrentHandle&)), this, SLOT(pausedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(resumedTorrent(QTorrentHandle&)), this, SLOT(resumedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(torrentFinishedChecking(QTorrentHandle&)), this, SLOT(checkedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&))); + connect(BTSession, SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString))); + connect(BTSession, SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString))); + connect(BTSession, SIGNAL(deletedTorrent(QString)), this, SLOT(deleteTorrent(QString))); + connect(BTSession, SIGNAL(torrentPaused(QTorrentHandle&)), this, SLOT(setPaused(QTorrentHandle&))); + qDebug("create tabWidget"); + tabs = new QTabWidget(); + // Download torrents tab + downloadingTorrentTab = new DownloadingTorrents(this, BTSession); + tabs->addTab(downloadingTorrentTab, tr("Downloads") + QString::fromUtf8(" (0/0)")); + tabs->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + vboxLayout->addWidget(tabs); + connect(downloadingTorrentTab, SIGNAL(unfinishedTorrentsNumberChanged(unsigned int)), this, SLOT(updateUnfinishedTorrentNumber(unsigned int))); + connect(downloadingTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); + // Finished torrents tab + finishedTorrentTab = new FinishedTorrents(this, BTSession); + tabs->addTab(finishedTorrentTab, tr("Uploads") + QString::fromUtf8(" (0/0)")); + tabs->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); + connect(finishedTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); + connect(finishedTorrentTab, SIGNAL(finishedTorrentsNumberChanged(unsigned int)), this, SLOT(updateFinishedTorrentNumber(unsigned int))); + // Search engine tab + searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); + tabs->addTab(searchEngine, tr("Search")); + tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png"))); + readSettings(); + // RSS Tab + rssWidget = 0; + // Start download list refresher + refresher = new QTimer(this); + connect(refresher, SIGNAL(timeout()), this, SLOT(updateLists())); + refresher->start(1500); + // Configure BT session according to options + configureSession(true); + // Resume unfinished torrents + BTSession->startUpTorrents(); + downloadingTorrentTab->loadLastSortedColumn(); + finishedTorrentTab->loadLastSortedColumn(); + // Add torrent given on command line + processParams(torrentCmdLine); + // Initialize Web UI + httpServer = 0; + if(settings.value("Preferences/WebUI/Enabled", false).toBool()) + { + quint16 port = settings.value("Preferences/WebUI/Port", 8080).toUInt(); + QString username = settings.value("Preferences/WebUI/Username", "").toString(); + QString password = settings.value("Preferences/WebUI/Password", "").toString(); + initWebUi(username, password, port); + } + // Use a tcp server to allow only one instance of qBittorrent +#ifdef QT_4_4 + localServer = new QLocalServer(); + QString uid = QString::number(getuid()); +#ifdef Q_WS_X11 + if(QFile::exists(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid)) { + // Socket was not closed cleanly + std::cerr << "Warning: Local domain socket was not closed cleanly, deleting file...\n"; + QFile::remove(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid); + } +#endif + if (!localServer->listen("qBittorrent-"+uid)) { +#else + localServer = new QTcpServer(); + if (!localServer->listen(QHostAddress::LocalHost)) { +#endif + std::cerr << "Couldn't create socket, single instance mode won't work...\n"; + } +#ifndef QT_4_4 + else { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.setValue(QString::fromUtf8("uniqueInstancePort"), localServer->serverPort()); + } +#endif + connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); + // Start connection checking timer + checkConnect = new QTimer(this); + connect(checkConnect, SIGNAL(timeout()), this, SLOT(checkConnectionStatus())); + checkConnect->start(5000); + // Accept drag 'n drops + setAcceptDrops(true); + createKeyboardShortcuts(); + connecStatusLblIcon = new QLabel(); + connecStatusLblIcon->setFrameShape(QFrame::NoFrame); + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0")); + upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0")); + ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0")); + DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0)); + statusSep1 = new QFrame(); + statusSep1->setFixedWidth(1); + statusSep1->setFrameStyle(QFrame::Box); + statusSep2 = new QFrame(); + statusSep2->setFixedWidth(1); + statusSep2->setFrameStyle(QFrame::Box); + statusSep3 = new QFrame(); + statusSep3->setFixedWidth(1); + statusSep3->setFrameStyle(QFrame::Box); + statusSep4 = new QFrame(); + statusSep4->setFixedWidth(1); + statusSep4->setFrameStyle(QFrame::Box); + QMainWindow::statusBar()->addPermanentWidget(DHTLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep1); + QMainWindow::statusBar()->addPermanentWidget(connecStatusLblIcon); + QMainWindow::statusBar()->addPermanentWidget(statusSep2); + QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep3); + QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep4); + QMainWindow::statusBar()->addPermanentWidget(ratioLbl); + if(!settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { + show(); + } + scrapeTimer = new QTimer(this); + connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers())); + scrapeTimer->start(20000); + qDebug("GUI Built"); + } + + // Destructor + GUI::~GUI() { + qDebug("GUI destruction"); + hide(); + // Do this as soon as possible + BTSession->saveDHTEntry(); + BTSession->saveSessionState(); + BTSession->saveFastResumeData(); + scrapeTimer->stop(); + delete scrapeTimer; + delete dlSpeedLbl; + delete upSpeedLbl; + delete ratioLbl; + delete DHTLbl; + delete statusSep1; + delete statusSep2; + delete statusSep3; + delete statusSep4; + if(rssWidget != 0) + delete rssWidget; + delete searchEngine; + delete refresher; + delete downloadingTorrentTab; + delete finishedTorrentTab; + delete checkConnect; + qDebug("1"); + if(systrayCreator) { + delete systrayCreator; + } + if(systrayIntegration) { + delete myTrayIcon; + delete myTrayIconMenu; + } + qDebug("2"); + localServer->close(); + delete localServer; + delete connecStatusLblIcon; + delete tabs; + // HTTP Server + if(httpServer) + delete httpServer; + qDebug("3"); + // Keyboard shortcuts + delete switchSearchShortcut; + delete switchSearchShortcut2; + delete switchDownShortcut; + delete switchUpShortcut; + delete switchRSSShortcut; + qDebug("4"); + delete BTSession; + qDebug("5"); + } + + void GUI::displayRSSTab(bool enable) { + if(enable) { + // RSS tab + if(rssWidget == 0) { + rssWidget = new RSSImp(BTSession); + tabs->addTab(rssWidget, tr("RSS")); + tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); + } + } else { + if(rssWidget != 0) { + delete rssWidget; + rssWidget = 0; + } + } + } + + void GUI::scrapeTrackers() { + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + h.scrape_tracker(); + } + } + + void GUI::updateRatio() { + // Update ratio info + float ratio = 1.; + session_status sessionStatus = BTSession->getSessionStatus(); + if(sessionStatus.total_payload_download == 0) { + if(sessionStatus.total_payload_upload == 0) + ratio = 1.; + else + ratio = 10.; + }else{ + ratio = (double)sessionStatus.total_payload_upload / (double)sessionStatus.total_payload_download; + if(ratio > 10.) + ratio = 10.; + } + ratioLbl->setText(tr("Ratio: %1").arg(QString(QByteArray::number(ratio, 'f', 1)))); + // Update DHT nodes + DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes))); + } + + void GUI::on_actionWebsite_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org"))); + } + + void GUI::on_actionDocumentation_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://wiki.qbittorrent.org"))); + } + + void GUI::on_actionBugReport_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org"))); + } + + void GUI::writeSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("MainWindow")); + settings.setValue(QString::fromUtf8("size"), size()); + settings.setValue(QString::fromUtf8("pos"), pos()); + settings.endGroup(); + } + + // called when a torrent has finished + void GUI::finishedTorrent(QTorrentHandle& h) const { + qDebug("In GUI, a torrent has finished"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool show_msg = true; + if(TorrentPersistentData::isSeed(h.hash())) + show_msg = false; + QString fileName = h.name(); + bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); + // Add it to finished tab + QString hash = h.hash(); + if(show_msg) + BTSession->addConsoleMessage(tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName)); + downloadingTorrentTab->deleteTorrent(hash); + finishedTorrentTab->addTorrent(hash); + if(show_msg && systrayIntegration && useNotificationBalloons) { + myTrayIcon->showMessage(tr("Download finished"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + } + } + + void GUI::addedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->addTorrent(h.hash()); + } else { + downloadingTorrentTab->addTorrent(h.hash()); + } + } + + void GUI::pausedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->pauseTorrent(h.hash()); + } else { + downloadingTorrentTab->pauseTorrent(h.hash()); + } + } + + void GUI::resumedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->updateTorrent(h); + } else { + downloadingTorrentTab->updateTorrent(h); + } + } + + void GUI::checkedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + // Move torrent to finished tab + downloadingTorrentTab->deleteTorrent(h.hash()); + finishedTorrentTab->addTorrent(h.hash()); + } else { + // Move torrent back to download list (if necessary) + if(TorrentPersistentData::isSeed(h.hash())) { + TorrentPersistentData::saveSeedStatus(h); + finishedTorrentTab->deleteTorrent(h.hash()); + downloadingTorrentTab->addTorrent(h.hash()); + } + } + } + + // Notification when disk is full + void GUI::fullDiskError(QTorrentHandle& h, QString msg) const { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); + if(systrayIntegration && useNotificationBalloons) { + myTrayIcon->showMessage(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg), QSystemTrayIcon::Critical, TIME_TRAY_BALLOON); + } + // Download will be paused by libtorrent. Updating GUI information accordingly + QString hash = h.hash(); + qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data()); + setPaused(h); + BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name())); + } + + void GUI::setPaused(QTorrentHandle &h) const { + if(!h.is_paused()) { + // FIXME in v1.6.0: Add Error state and stop using pause for this + h.pause(); + } + qDebug("Marking torrent %s as paused", h.hash().toLocal8Bit().data()); + if(h.is_seed()) { + // In finished list + qDebug("Automatically paused torrent was in finished list"); + finishedTorrentTab->pauseTorrent(h.hash()); + }else{ + downloadingTorrentTab->pauseTorrent(h.hash()); + } + } + + void GUI::createKeyboardShortcuts() { + actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N"))); + actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O"))); + actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q"))); + switchDownShortcut = new QShortcut(QKeySequence(tr("Alt+1", "shortcut to switch to first tab")), this); + connect(switchDownShortcut, SIGNAL(activated()), this, SLOT(displayDownTab())); + switchUpShortcut = new QShortcut(QKeySequence(tr("Alt+2", "shortcut to switch to second tab")), this); + connect(switchUpShortcut, SIGNAL(activated()), this, SLOT(displayUpTab())); + switchSearchShortcut = new QShortcut(QKeySequence(tr("Alt+3", "shortcut to switch to third tab")), this); + connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab())); + switchSearchShortcut2 = new QShortcut(QKeySequence(tr("Ctrl+F", "shortcut to switch to search tab")), this); + connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab())); + switchRSSShortcut = new QShortcut(QKeySequence(tr("Alt+4", "shortcut to switch to fourth tab")), this); + connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab())); + actionTorrent_Properties->setShortcut(QKeySequence(QString::fromUtf8("Alt+P"))); + actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O"))); + actionDelete->setShortcut(QKeySequence(QString::fromUtf8("Del"))); + actionDelete_Permanently->setShortcut(QKeySequence(QString::fromUtf8("Shift+Del"))); + actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S"))); + actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S"))); + actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P"))); + actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P"))); + actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-"))); + actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++"))); + } + + // Keyboard shortcuts slots + void GUI::displayDownTab() const { + tabs->setCurrentIndex(0); + } + + void GUI::displayUpTab() const { + tabs->setCurrentIndex(1); + } + + void GUI::displaySearchTab() const { + tabs->setCurrentIndex(2); + } + + void GUI::displayRSSTab() const { + tabs->setCurrentIndex(3); + } + + // End of keyboard shortcuts slots + + void GUI::readSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("MainWindow")); + resize(settings.value(QString::fromUtf8("size"), size()).toSize()); + move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint()); + settings.endGroup(); + } + + void GUI::balloonClicked() { + if(isHidden()) { + show(); + if(isMinimized()) { + showNormal(); + } + raise(); + activateWindow(); + } + } + + void GUI::acceptConnection() { + clientConnection = localServer->nextPendingConnection(); + connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket())); + qDebug("accepted connection from another instance"); + } + + void GUI::readParamsOnSocket() { + if(clientConnection) { + QByteArray params = clientConnection->readAll(); + if(!params.isEmpty()) { + processParams(QString::fromUtf8(params.data()).split(QString::fromUtf8("\n"))); + qDebug("Received parameters from another instance"); + } + } + } + + void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{ + // Display a message box + QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason)); + } + + void GUI::on_actionSet_global_upload_limit_triggered() { + qDebug("actionSet_global_upload_limit_triggered"); + new BandwidthAllocationDialog(this, true, BTSession, QStringList()); + } + + void GUI::on_actionShow_console_triggered() { + new consoleDlg(this, BTSession); + } + + void GUI::on_actionSet_global_download_limit_triggered() { + qDebug("actionSet_global_download_limit_triggered"); + new BandwidthAllocationDialog(this, false, BTSession, QStringList()); + } + + void GUI::on_actionPreview_file_triggered() { + QString hash; + switch(tabs->currentIndex()){ + case 0: + hash = downloadingTorrentTab->getSelectedTorrents(true).first(); + break; + case 1: + hash = finishedTorrentTab->getSelectedTorrents(true).first(); + break; + default: + return; + } + QTorrentHandle h = BTSession->getTorrentHandle(hash); + new previewSelect(this, h); + } + + void GUI::openDestinationFolder() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(true); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(true); + break; + default: + return; + } + QStringList pathsList; + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString savePath = h.save_path(); + if(!pathsList.contains(savePath)) { + pathsList.append(savePath); + QDesktopServices::openUrl(QString("file://")+savePath); + } + } + } + + void GUI::copyMagnetURI() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(); + break; + default: + return; + } + QStringList magnet_uris; + foreach(QString hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid()) { + magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); + } + } + qApp->clipboard()->setText(magnet_uris.join("\n")); + } + + void GUI::goBuyPage() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(true); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(true); + break; + default: + return; + } + QStringList pathsList; + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+hash+"&n="+h.name()+"&cid=33"); + } + } + + // Necessary if we want to close the window + // in one time if "close to systray" is enabled + void GUI::on_actionExit_triggered() { + force_exit = true; + close(); + } + + void GUI::previewFile(QString filePath) { + QDesktopServices::openUrl(QString("file://")+filePath); + } + + int GUI::getCurrentTabIndex() const{ + if(isMinimized() || isHidden()) + return -1; + return tabs->currentIndex(); + } + + void GUI::setTabText(int index, QString text) const { + tabs->setTabText(index, text); + } + + // Toggle Main window visibility + void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) { + if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) { + if(isHidden()) { + show(); + if(isMinimized()) { + if(isMaximized()) { + showMaximized(); + }else{ + showNormal(); + } + } + raise(); + activateWindow(); + }else{ + hide(); + } + } + } + + // Center window + QPoint GUI::screenCenter() const{ + int scrn = 0; + QWidget *w = this->topLevelWidget(); + + if(w) + scrn = QApplication::desktop()->screenNumber(w); + else if(QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(this); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2); + } + + // Display About Dialog + void GUI::on_actionAbout_triggered() { + //About dialog + new about(this); + } + + void GUI::showEvent(QShowEvent *e) { + qDebug("** Show Event **"); + updateLists(true); + e->accept(); + } + + // Called when we close the program + void GUI::closeEvent(QCloseEvent *e) { + + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool(); + if(!force_exit && systrayIntegration && goToSystrayOnExit && !this->isHidden()) { + hide(); + //e->ignore(); + e->accept(); + return; + } + if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && downloadingTorrentTab->getNbTorrentsInList()) { + show(); + if(!isMaximized()) + showNormal(); + if(e->spontaneous() == true || force_exit == true) { + if(QMessageBox::question(this, + tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"), + tr("The download list is not empty.\nAre you sure you want to quit qBittorrent?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1)) { + e->ignore(); + force_exit = false; + return; + } + } + } + hide(); + if(systrayIntegration) { + // Hide tray icon + myTrayIcon->hide(); + } + // Save window size, columns size + writeSettings(); + // Accept exit + e->accept(); + qApp->exit(); + } + + + // Display window to create a torrent + void GUI::on_actionCreate_torrent_triggered() { + createtorrent *ct = new createtorrent(this); + connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString))); + } + + bool GUI::event(QEvent * e) { + if(e->type() == QEvent::WindowStateChange) { + //Now check to see if the window is minimised + if(isMinimized()) { + qDebug("minimisation"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) { + hide(); + } + } + } + return QMainWindow::event(e); + } + + // Action executed when a file is dropped + void GUI::dropEvent(QDropEvent *event) { + event->acceptProposedAction(); + QStringList files; + if(event->mimeData()->hasUrls()) { + QList urls = event->mimeData()->urls(); + foreach(const QUrl &url, urls) { + QString tmp = url.toString().trimmed(); + if(!tmp.isEmpty()) + files << url.toString(); + } + } else { + files = event->mimeData()->text().split(QString::fromUtf8("\n")); + } + // Add file to download list + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + foreach(QString file, files) { + file = file.trimmed().replace(QString::fromUtf8("file://"), QString::fromUtf8(""), Qt::CaseInsensitive); + qDebug("Dropped file %s on download list", file.toLocal8Bit().data()); + if(file.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { + BTSession->downloadFromUrl(file); + continue; + } + if(file.startsWith("magnet:", Qt::CaseInsensitive)) { + // FIXME: Possibly skipped torrent addition dialog + BTSession->addMagnetUri(file); + continue; + } + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoad(file); + }else{ + BTSession->addTorrent(file); + } + } + } + + // Decode if we accept drag 'n drop or not + void GUI::dragEnterEvent(QDragEnterEvent *event) { + foreach(const QString &mime, event->mimeData()->formats()){ + qDebug("mimeData: %s", mime.toLocal8Bit().data()); + } + if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { + event->acceptProposedAction(); + } + } + + /***************************************************** + * * + * Torrent * + * * + *****************************************************/ + + // Display a dialog to allow user to add + // torrents to download list + void GUI::on_actionOpen_triggered() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + // Open File Open Dialog + // Note: it is possible to select more than one file + QStringList pathsList = QFileDialog::getOpenFileNames(0, + tr("Open Torrent Files"), settings.value(QString::fromUtf8("MainWindowLastDir"), QDir::homePath()).toString(), + tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); + if(!pathsList.empty()) { + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + unsigned int listSize = pathsList.size(); + for(unsigned int i=0; ishowLoad(pathsList.at(i)); + }else{ + BTSession->addTorrent(pathsList.at(i)); + } + } + // Save last dir to remember it + QStringList top_dir = pathsList.at(0).split(QDir::separator()); + top_dir.removeLast(); + settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator())); + } + } + + // delete from download list AND from hard drive + void GUI::on_actionDelete_Permanently_triggered() { + QStringList hashes; + bool inDownloadList = true; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(); + inDownloadList = false; + break; + default: + return; + } + if(hashes.empty()) return; + int ret; + if(inDownloadList) { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) from download list and from hard drive?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + }else{ + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) from finished list and from hard drive?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } + if(ret) return; + //User clicked YES + foreach(const QString &hash, hashes) { + // Get the file name + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString fileName = h.name(); + // Remove the torrent + BTSession->deleteTorrent(hash, true); + } + } + + void GUI::deleteTorrent(QString hash) { + // Delete item from list + downloadingTorrentTab->deleteTorrent(hash); + finishedTorrentTab->deleteTorrent(hash); + } + + // delete selected items in the list + void GUI::on_actionDelete_triggered() { + QStringList hashes; + bool inDownloadList = true; + switch(tabs->currentIndex()){ + case 0: // DL + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: // SEED + hashes = finishedTorrentTab->getSelectedTorrents(); + inDownloadList = false; + break; + case 3: //RSSImp + rssWidget->deleteSelectedItems(); + return; + default: + return; + } + if(hashes.empty()) return; + int ret; + if(inDownloadList) { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) in download list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } else { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) in finished list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } + if(ret) return; + //User clicked YES + foreach(const QString &hash, hashes) { + // Get the file name + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString fileName = h.name(); + // Remove the torrent + BTSession->deleteTorrent(hash, false); + } + } + + // As program parameters, we can get paths or urls. + // This function parse the parameters and call + // the right addTorrent function, considering + // the parameter type. + void GUI::processParams(const QStringList& params) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + foreach(QString param, params) { + param = param.trimmed(); + if(param.startsWith("--")) continue; + if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { + BTSession->downloadFromUrl(param); + }else{ + if(param.startsWith("magnet:", Qt::CaseInsensitive)) { + // FIXME: Possibily skipped torrent addition dialog + BTSession->addMagnetUri(param); + } else { + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoad(param); + }else{ + BTSession->addTorrent(param); + } + } + } + } + } + + void GUI::addTorrent(QString path) { + BTSession->addTorrent(path); + } + + void GUI::processDownloadedFiles(QString path, QString url) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoad(path, url); + }else{ + BTSession->addTorrent(path, false, url); + } + } + + // Set BT session configuration + void GUI::configureSession(bool deleteOptions) { + qDebug("Configuring session"); + // General + bool new_displaySpeedInTitle = options->speedInTitleBar(); + if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) { + // Reset title + setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); + } + displaySpeedInTitle = new_displaySpeedInTitle; + if(options->isToolbarDisplayed()) { + toolBar->setVisible(true); + toolBar->layout()->setSpacing(7); + } else { + toolBar->setVisible(false); + } + unsigned int new_refreshInterval = options->getRefreshInterval(); + if(refreshInterval != new_refreshInterval) { + refreshInterval = new_refreshInterval; + refresher->start(refreshInterval); + } + // Downloads + // * Save path + BTSession->setDefaultSavePath(options->getSavePath()); + if(options->isTempPathEnabled()) { + BTSession->setDefaultTempPath(options->getTempPath()); + } else { + BTSession->setDefaultTempPath(QString::null); + } + BTSession->preAllocateAllFiles(options->preAllocateAllFiles()); + BTSession->startTorrentsInPause(options->addTorrentsInPause()); + // * Scan dir + if(options->getScanDir().isNull()) { + BTSession->disableDirectoryScanning(); + }else{ + //Interval first + BTSession->enableDirectoryScanning(options->getScanDir()); + } + // Connection + // * Ports binding + unsigned short old_listenPort = BTSession->getListenPort(); + BTSession->setListeningPort(options->getPort()); + unsigned short new_listenPort = BTSession->getListenPort(); + if(new_listenPort != old_listenPort) { + BTSession->addConsoleMessage(tr("qBittorrent is bound to port: TCP/%1", "e.g: qBittorrent is bound to port: 6881").arg( misc::toQString(new_listenPort))); + } + // * Global download limit + QPair limits = options->getGlobalBandwidthLimits(); + if(limits.first <= 0) { + // Download limit disabled + BTSession->setDownloadRateLimit(-1); + } else { + // Enabled + BTSession->setDownloadRateLimit(limits.first*1024); + } + // * Global Upload limit + if(limits.second <= 0) { + // Upload limit disabled + BTSession->setUploadRateLimit(-1); + } else { + // Enabled + BTSession->setUploadRateLimit(limits.second*1024); + } + // * UPnP + if(options->isUPnPEnabled()) { + BTSession->enableUPnP(true); + BTSession->addConsoleMessage(tr("UPnP support [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableUPnP(false); + BTSession->addConsoleMessage(tr("UPnP support [OFF]"), QString::fromUtf8("blue")); + } + // * NAT-PMP + if(options->isNATPMPEnabled()) { + BTSession->enableNATPMP(true); + BTSession->addConsoleMessage(tr("NAT-PMP support [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableNATPMP(false); + BTSession->addConsoleMessage(tr("NAT-PMP support [OFF]"), QString::fromUtf8("blue")); + } + // * Session settings + session_settings sessionSettings; + if(options->shouldSpoofAzureus()) { + sessionSettings.user_agent = "Azureus 3.0.5.2"; + } else { + sessionSettings.user_agent = "qBittorrent "VERSION; + } + sessionSettings.upnp_ignore_nonrouters = true; + sessionSettings.use_dht_as_fallback = false; + // To keep same behavior as in qbittorrent v1.2.0 + sessionSettings.rate_limit_ip_overhead = false; + // Queueing System + if(options->isQueueingSystemEnabled()) { + if(!BTSession->isQueueingEnabled()) { + downloadingTorrentTab->hidePriorityColumn(false); + actionDecreasePriority->setVisible(true); + actionIncreasePriority->setVisible(true); + prioSeparator->setVisible(true); + prioSeparator2->setVisible(true); + toolBar->layout()->setSpacing(7); + } + int max_torrents = options->getMaxActiveTorrents(); + int max_uploads = options->getMaxActiveUploads(); + int max_downloads = options->getMaxActiveDownloads(); + sessionSettings.active_downloads = max_downloads; + sessionSettings.active_seeds = max_uploads; + sessionSettings.active_limit = max_torrents; + sessionSettings.dont_count_slow_torrents = false; + BTSession->setQueueingEnabled(true); + } else { + if(BTSession->isQueueingEnabled()) { + sessionSettings.active_downloads = -1; + sessionSettings.active_seeds = -1; + sessionSettings.active_limit = -1; + BTSession->setQueueingEnabled(false); + downloadingTorrentTab->hidePriorityColumn(true); + actionDecreasePriority->setVisible(false); + actionIncreasePriority->setVisible(false); + prioSeparator->setVisible(false); + prioSeparator2->setVisible(false); + toolBar->layout()->setSpacing(7); + } + } + BTSession->setSessionSettings(sessionSettings); + // Bittorrent + // * Max connections limit + BTSession->setMaxConnections(options->getMaxConnecs()); + // * Max connections per torrent limit + BTSession->setMaxConnectionsPerTorrent(options->getMaxConnecsPerTorrent()); + // * Max uploads per torrent limit + BTSession->setMaxUploadsPerTorrent(options->getMaxUploadsPerTorrent()); + // * DHT + if(options->isDHTEnabled()) { + // Set DHT Port + BTSession->setDHTPort(options->getDHTPort()); + if(BTSession->enableDHT(true)) { + int dht_port = new_listenPort; + if(options->getDHTPort()) + dht_port = options->getDHTPort(); + BTSession->addConsoleMessage(tr("DHT support [ON], port: UDP/%1").arg(dht_port), QString::fromUtf8("blue")); + } else { + BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("red")); + } + } else { + BTSession->enableDHT(false); + BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("blue")); + } + // * PeX + BTSession->addConsoleMessage(tr("PeX support [ON]"), QString::fromUtf8("blue")); + // * LSD + if(options->isLSDEnabled()) { + BTSession->enableLSD(true); + BTSession->addConsoleMessage(tr("Local Peer Discovery [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableLSD(false); + BTSession->addConsoleMessage(tr("Local Peer Discovery support [OFF]"), QString::fromUtf8("blue")); + } + // * Encryption + int encryptionState = options->getEncryptionSetting(); + // The most secure, rc4 only so that all streams and encrypted + pe_settings encryptionSettings; + encryptionSettings.allowed_enc_level = pe_settings::rc4; + encryptionSettings.prefer_rc4 = true; + switch(encryptionState) { + case 0: //Enabled + encryptionSettings.out_enc_policy = pe_settings::enabled; + encryptionSettings.in_enc_policy = pe_settings::enabled; + BTSession->addConsoleMessage(tr("Encryption support [ON]"), QString::fromUtf8("blue")); + break; + case 1: // Forced + encryptionSettings.out_enc_policy = pe_settings::forced; + encryptionSettings.in_enc_policy = pe_settings::forced; + BTSession->addConsoleMessage(tr("Encryption support [FORCED]"), QString::fromUtf8("blue")); + break; + default: // Disabled + encryptionSettings.out_enc_policy = pe_settings::disabled; + encryptionSettings.in_enc_policy = pe_settings::disabled; + BTSession->addConsoleMessage(tr("Encryption support [OFF]"), QString::fromUtf8("blue")); + } + BTSession->applyEncryptionSettings(encryptionSettings); + // * Desired ratio + BTSession->setGlobalRatio(options->getDesiredRatio()); + // * Maximum ratio + BTSession->setDeleteRatio(options->getDeleteRatio()); + // Ip Filter + if(options->isFilteringEnabled()) { + BTSession->enableIPFilter(options->getFilter()); + }else{ + BTSession->disableIPFilter(); + } + // RSS + if(options->isRSSEnabled()) { + displayRSSTab(true); + } else { + displayRSSTab(false); + } + // * Proxy settings + proxy_settings proxySettings; + if(options->isProxyEnabled()) { + qDebug("Enabling P2P proxy"); + proxySettings.hostname = options->getProxyIp().toStdString(); + qDebug("hostname is %s", proxySettings.hostname.c_str()); + proxySettings.port = options->getProxyPort(); + qDebug("port is %d", proxySettings.port); + if(options->isProxyAuthEnabled()) { + + proxySettings.username = options->getProxyUsername().toStdString(); + proxySettings.password = options->getProxyPassword().toStdString(); + qDebug("username is %s", proxySettings.username.c_str()); + qDebug("password is %s", proxySettings.password.c_str()); + } + switch(options->getProxyType()) { + case HTTP: + qDebug("type: http"); + proxySettings.type = proxy_settings::http; + break; + case HTTP_PW: + qDebug("type: http_pw"); + proxySettings.type = proxy_settings::http_pw; + break; + case SOCKS5: + qDebug("type: socks5"); + proxySettings.type = proxy_settings::socks5; + break; + default: + qDebug("type: socks5_pw"); + proxySettings.type = proxy_settings::socks5_pw; + break; + } + qDebug("booleans: %d %d %d %d", options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); + BTSession->setProxySettings(proxySettings, options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); + } else { + qDebug("Disabling P2P proxy"); + BTSession->setProxySettings(proxySettings, false, false, false, false); + } + if(options->isHTTPProxyEnabled()) { + qDebug("Enabling Search HTTP proxy"); + // HTTP Proxy + QString proxy_str; + switch(options->getHTTPProxyType()) { + case HTTP_PW: + proxy_str = misc::toQString("http://")+options->getHTTPProxyUsername()+":"+options->getHTTPProxyPassword()+"@"+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); + break; + default: + proxy_str = misc::toQString("http://")+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); + } + // We need this for urllib in search engine plugins +#ifdef Q_WS_WIN + char proxystr[512]; + snprintf(proxystr, 512, "http_proxy=%s", proxy_str.toLocal8Bit().data()); + putenv(proxystr); +#else + qDebug("HTTP: proxy string: %s", proxy_str.toLocal8Bit().data()); + setenv("http_proxy", proxy_str.toLocal8Bit().data(), 1); +#endif + } else { + qDebug("Disabling search proxy"); +#ifdef Q_WS_WIN + putenv("http_proxy="); +#else + unsetenv("http_proxy"); +#endif + } + // Clean up + if(deleteOptions && options) { + qDebug("Deleting options"); + //delete options; + options->deleteLater(); + } + qDebug("Session configured"); + } + + void GUI::updateUnfinishedTorrentNumber(unsigned int nb) { + unsigned int paused = BTSession->getUnfinishedPausedTorrentsNb(); + tabs->setTabText(0, tr("Downloads") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); + } + + void GUI::updateFinishedTorrentNumber(unsigned int nb) { + unsigned int paused = BTSession->getFinishedPausedTorrentsNb(); + tabs->setTabText(1, tr("Finished") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); + } + + // Allow to change action on double-click + void GUI::torrentDoubleClicked(QString hash, bool finished) { + int action; + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + + if(finished) { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorFN"), 0).toInt(); + } else { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorDl"), 0).toInt(); + } + + switch(action) { + case TOGGLE_PAUSE: + this->togglePausedState(hash); + break; + case OPEN_DEST: { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString savePath = h.save_path(); + QDesktopServices::openUrl(QUrl(savePath)); + break; + } + case SHOW_PROPERTIES : + if(finished) { + finishedTorrentTab->showPropertiesFromHash(hash); + } else { + downloadingTorrentTab->showPropertiesFromHash(hash); + } + break; + } + } + + // Toggle paused state of selected torrent + void GUI::togglePausedState(QString hash) { + if(tabs->currentIndex() > 1) return; + bool inDownloadList = true; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_paused()) { + h.resume(); + resumedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + }else{ + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + }else{ + h.pause(); + pausedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + }else{ + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + } + } + + // Pause All Downloads in DL list + void GUI::on_actionPause_All_triggered() { + bool change = false; + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid() || h.is_paused()) continue; + change = true; + h.pause(); + pausedTorrent(h); + } + if(change) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + } + + void GUI::on_actionIncreasePriority_triggered() { + if(tabs->currentIndex() != 0) + return; + QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); + foreach(const QString &hash, hashes) { + BTSession->increaseDlTorrentPriority(hash); + } + updateLists(); + } + + void GUI::on_actionDecreasePriority_triggered() { + Q_ASSERT(tabs->currentIndex() == 0); + QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); + foreach(const QString &hash, hashes) { + BTSession->decreaseDlTorrentPriority(hash); + } + updateLists(); + } + + // pause selected items in the list + void GUI::on_actionPause_triggered() { + bool inDownloadList = true; + if(tabs->currentIndex() > 1) return; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QStringList hashes; + if(inDownloadList) { + hashes = downloadingTorrentTab->getSelectedTorrents(); + } else { + hashes = finishedTorrentTab->getSelectedTorrents(); + } + qDebug("nb hashes: %d", hashes.size()); + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(!h.is_paused()){ + h.pause(); + pausedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + } else { + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + } + } + } + + // Resume All Downloads in DL list + void GUI::on_actionStart_All_triggered() { + bool change = false; + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid() || !h.is_paused()) continue; + change = true; + h.resume(); + resumedTorrent(h); + } + if(change) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + } + + // start selected items in the list + void GUI::on_actionStart_triggered() { + bool inDownloadList = true; + if(tabs->currentIndex() > 1) return; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QStringList hashes; + if(inDownloadList) { + hashes = downloadingTorrentTab->getSelectedTorrents(); + } else { + hashes = finishedTorrentTab->getSelectedTorrents(); + } + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_paused()){ + h.resume(); + resumedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + } else { + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + } + } + } + + void GUI::addUnauthenticatedTracker(QPair tracker) { + // Trackers whose authentication was cancelled + if(unauthenticated_trackers.indexOf(tracker) < 0) { + unauthenticated_trackers << tracker; + } + } + + // display properties of selected items + void GUI::on_actionTorrent_Properties_triggered() { + if(tabs->currentIndex() > 1) return; + switch(tabs->currentIndex()){ + case 1: // DL List + finishedTorrentTab->propertiesSelection(); + break; + default: + downloadingTorrentTab->propertiesSelection(); + } + } + + void GUI::updateLists(bool force) { + if(isVisible() || force) { + // update global informations + dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)))); + upSpeedLbl->setText(tr("UP: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)))); + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + try { + if(h.is_seed()) { + // Update in finished list + finishedTorrentTab->updateTorrent(h); + } else { + // Update in download list + if(downloadingTorrentTab->updateTorrent(h)) { + // Torrent was added, we may need to remove it from finished tab + finishedTorrentTab->deleteTorrent(h.hash()); + TorrentPersistentData::saveSeedStatus(h); + } + } + } catch(invalid_handle e) { + qDebug("Caught Invalid handle exception, lucky us."); + } + } + } + if(displaySpeedInTitle) { + QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); + QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); + setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); + } + } + + // Called when a tracker requires authentication + void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { + if(unauthenticated_trackers.indexOf(QPair(h, h.current_tracker())) < 0) { + // Tracker login + new trackerLogin(this, h); + } + } + + // Check connection status and display right icon + void GUI::checkConnectionStatus() { + // qDebug("Checking connection status"); + // Update Ratio + updateRatio(); + // update global informations + if(systrayIntegration) { +#ifdef Q_WS_WIN + // Windows does not support html here + QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); + html += "\n"; + html += tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); +#else + QString html = "
"; + html += tr("qBittorrent"); + html += "
"; + html += "
"; + html += " "+tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); + html += "
"; + html += "
"; + html += " "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); + html += "
"; +#endif + myTrayIcon->setToolTip(html); // tray icon + } + session_status sessionStatus = BTSession->getSessionStatus(); + if(sessionStatus.has_incoming_connections) { + // Connection OK + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); + }else{ + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + } + } + + /***************************************************** + * * + * Utils * + * * + *****************************************************/ + + void GUI::downloadFromURLList(const QStringList& url_list) { + foreach(const QString url, url_list) { + if(url.startsWith("magnet:", Qt::CaseInsensitive)) { + BTSession->addMagnetUri(url); + } else { + BTSession->downloadFromUrl(url); + } + } + } + + /***************************************************** + * * + * Options * + * * + *****************************************************/ + + void GUI::createSystrayDelayed() { + static int timeout = 10; + if(QSystemTrayIcon::isSystemTrayAvailable()) { + // Ok, systray integration is now supported + // Create systray icon + createTrayIcon(); + systrayIntegration = true; + delete systrayCreator; + } else { + if(timeout) { + // Retry a bit later + systrayCreator->start(1000); + --timeout; + } else { + // Timed out, apparently system really does not + // support systray icon + delete systrayCreator; + } + } + } + + void GUI::createTrayIcon() { + // Tray icon +#ifdef Q_WS_WIN + myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this); +#endif +#ifndef Q_WS_WIN + myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this); +#endif + // Tray icon Menu + myTrayIconMenu = new QMenu(this); + myTrayIconMenu->addAction(actionOpen); + myTrayIconMenu->addAction(actionDownload_from_URL); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionSet_global_download_limit); + myTrayIconMenu->addAction(actionSet_global_upload_limit); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionStart_All); + myTrayIconMenu->addAction(actionPause_All); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionExit); + myTrayIcon->setContextMenu(myTrayIconMenu); + connect(myTrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); + // End of Icon Menu + connect(myTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); + myTrayIcon->show(); + } + + // Display Program Options + void GUI::on_actionOptions_triggered() { + options = new options_imp(this); + connect(options, SIGNAL(status_changed(bool)), this, SLOT(OptionsSaved(bool))); + options->show(); + } + + // Is executed each time options are saved + void GUI::OptionsSaved(bool deleteOptions) { + BTSession->addConsoleMessage(tr("Options were saved successfully.")); + bool newSystrayIntegration = options->systrayIntegration(); + if(newSystrayIntegration != systrayIntegration) { + if(newSystrayIntegration) { + // create the trayicon + createTrayIcon(); + } else { + // Destroy trayicon + delete myTrayIcon; + delete myTrayIconMenu; + } + systrayIntegration = newSystrayIntegration; + } + // Update Web UI + if (options->isWebUiEnabled()) { + quint16 port = options->webUiPort(); + QString username = options->webUiUsername(); + QString password = options->webUiPassword(); + initWebUi(username, password, port); + } else if(httpServer) { + delete httpServer; + } + // Update session + configureSession(deleteOptions); + } + + bool GUI::initWebUi(QString username, QString password, int port) { + if(httpServer) + httpServer->close(); + else + httpServer = new HttpServer(BTSession, 3000, this); + httpServer->setAuthorization(username, password); + bool success = httpServer->listen(QHostAddress::Any, port); + if (success) + qDebug("Web UI listening on port %d", port); + else + QMessageBox::critical(this, "Web User Interface Error", "Unable to initialize HTTP Server on port " + misc::toQString(port)); + return success; + } + + /***************************************************** + * * + * HTTP Downloader * + * * + *****************************************************/ + + // Display an input dialog to prompt user for + // an url + void GUI::on_actionDownload_from_URL_triggered() { + downloadFromURL *downloadFromURLDialog = new downloadFromURL(this); + connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), BTSession, SLOT(downloadFromURLList(const QStringList&))); + } + diff --git a/src/GUI.h b/src/GUI.h new file mode 100644 index 000000000..3c81d2b06 --- /dev/null +++ b/src/GUI.h @@ -0,0 +1,213 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef GUI_H +#define GUI_H + +#include +#include +#include +#include "ui_MainWindow.h" +#include "qtorrenthandle.h" + +class bittorrent; +class createtorrent; +class QTimer; +class DownloadingTorrents; +class FinishedTorrents; +class downloadFromURL; +class SearchEngine; +#ifdef QT_4_4 + class QLocalServer; + class QLocalSocket; +#else + class QTcpServer; + class QTcpSocket; +#endif +class QCloseEvent; +class RSSImp; +class QShortcut; +class about; +class previewSelect; +class options_imp; +class QTabWidget; +class QLabel; +class QModelIndex; +class HttpServer; +class QFrame; + +class GUI : public QMainWindow, private Ui::MainWindow{ + Q_OBJECT + + private: + // Bittorrent + bittorrent *BTSession; + QTimer *checkConnect; + QTimer *scrapeTimer; + QList > unauthenticated_trackers; + // GUI related + QTabWidget *tabs; + QPointer options; + QSystemTrayIcon *myTrayIcon; + QPointer systrayCreator; + QMenu *myTrayIconMenu; + DownloadingTorrents *downloadingTorrentTab; + FinishedTorrents *finishedTorrentTab; + QLabel *connecStatusLblIcon; + bool systrayIntegration; + bool displaySpeedInTitle; + bool force_exit; + unsigned int refreshInterval; + QTimer *refresher; + QLabel *dlSpeedLbl; + QLabel *upSpeedLbl; + QLabel *ratioLbl; + QLabel *DHTLbl; + QFrame *statusSep1; + QFrame *statusSep2; + QFrame *statusSep3; + QFrame *statusSep4; + // Keyboard shortcuts + QShortcut *switchSearchShortcut; + QShortcut *switchSearchShortcut2; + QShortcut *switchDownShortcut; + QShortcut *switchUpShortcut; + QShortcut *switchRSSShortcut; + QAction *prioSeparator; + QAction *prioSeparator2; + // Search + SearchEngine *searchEngine; + // RSS + RSSImp *rssWidget; + // Web UI + QPointer httpServer; + // Misc +#ifdef QT_4_4 + QLocalServer *localServer; + QLocalSocket *clientConnection; +#else + QTcpServer *localServer; + QTcpSocket *clientConnection; +#endif + + protected slots: + // GUI related slots + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void toggleVisibility(QSystemTrayIcon::ActivationReason e); + void on_actionAbout_triggered(); + void on_actionCreate_torrent_triggered(); + void on_actionWebsite_triggered() const; + void on_actionBugReport_triggered() const; + void on_actionShow_console_triggered(); + void readParamsOnSocket(); + void acceptConnection(); + void togglePausedState(QString hash); + void torrentDoubleClicked(QString hash, bool finished); + void on_actionPreview_file_triggered(); + void previewFile(QString filePath); + void balloonClicked(); + void writeSettings(); + void readSettings(); + void on_actionExit_triggered(); + void createTrayIcon(); + void updateUnfinishedTorrentNumber(unsigned int nb); + void updateFinishedTorrentNumber(unsigned int nb); + void fullDiskError(QTorrentHandle& h, QString msg) const; + void handleDownloadFromUrlFailure(QString, QString) const; + void createSystrayDelayed(); + void setPaused(QTorrentHandle &h) const; + // Keyboard shortcuts + void createKeyboardShortcuts(); + void displayDownTab() const; + void displayUpTab() const; + void displaySearchTab() const; + void displayRSSTab() const; + // Torrent actions + void on_actionTorrent_Properties_triggered(); + void on_actionPause_triggered(); + void on_actionPause_All_triggered(); + void on_actionStart_triggered(); + void on_actionStart_All_triggered(); + void on_actionOpen_triggered(); + void on_actionDelete_Permanently_triggered(); + void on_actionDelete_triggered(); + void on_actionSet_global_upload_limit_triggered(); + void on_actionSet_global_download_limit_triggered(); + void on_actionDocumentation_triggered() const; + void checkConnectionStatus(); + void configureSession(bool deleteOptions); + void processParams(const QStringList& params); + void addTorrent(QString path); + void addUnauthenticatedTracker(QPair tracker); + void processDownloadedFiles(QString path, QString url); + void downloadFromURLList(const QStringList& urls); + void deleteTorrent(QString hash); + void finishedTorrent(QTorrentHandle& h) const; + void addedTorrent(QTorrentHandle& h) const; + void checkedTorrent(QTorrentHandle& h) const; + void pausedTorrent(QTorrentHandle& h) const; + void resumedTorrent(QTorrentHandle& h) const; + void updateLists(bool force=false); + bool initWebUi(QString username, QString password, int port); + void on_actionIncreasePriority_triggered(); + void on_actionDecreasePriority_triggered(); + void scrapeTrackers(); + // Options slots + void on_actionOptions_triggered(); + void OptionsSaved(bool deleteOptions); + // HTTP slots + void on_actionDownload_from_URL_triggered(); + + + public slots: + void trackerAuthenticationRequired(QTorrentHandle& h); + void setTabText(int index, QString text) const; + void openDestinationFolder() const; + void goBuyPage() const; + void copyMagnetURI() const; + void updateRatio(); + + protected: + void closeEvent(QCloseEvent *); + void showEvent(QShowEvent *); + bool event(QEvent * event); + void displayRSSTab(bool enable); + + public: + // Construct / Destruct + GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList()); + ~GUI(); + // Methods + int getCurrentTabIndex() const; + QPoint screenCenter() const; +}; + +#endif diff --git a/src/Icons/downarrow.png b/src/Icons/downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9c00cf8b9d01f54408eeff0b636eb1a7a5e834 GIT binary patch literal 722 zcmV;@0xkWCP)ld|NFQ8-|s&PK+FKb|9}4l)BpZJ z_z?V;0U?jdN2vP?l6&y)&)-0R0Ac|d`jJOmK}1uXft! z>FsA=Hb4LY4gNFX|AmtUZOm2-ah3uM93(jWT zK#U+#)@RNBzyFyW{@J)OcxrPqurlK}@cj=4hT}koJ^73z_~SbRLsu(^KES}x=Lir$ zVE2Jyk>U5R{lAayH`v1L#$Y7PhGEzrUE37YGsp z2p~q7oP^yX0iXr@e{t~}FgbfOi14Et{`Vimu%|%p|3xkZz5@-N12pvcGmxQ7UQ=`4N6YK>#3t7zt$pW{wJw%hv<5z5`U~ z03=D_HWUN^0*H}TH3&ce(X2cM2q2mn3=lvxGZ-Mi0DSlsJ-%(kVgLXD07*qoM6N<$ Ef{v9g@Bjb+ literal 0 HcmV?d00001 diff --git a/src/Icons/flags/brazil.png b/src/Icons/flags/brazil.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bb642bf18e6bba6c9ed3a2df832e197d3c2889 GIT binary patch literal 799 zcmV+)1K|9LP)?X&9$f$c0<1|y zK~y-)wUk*%RB;%^fA`LvQ75l9;!^IrqGpLnRq%n&S z{TbE^D#C0LWQ91mwXB8ef;JM2!!st3{x)C`Rd%QJvLmq%oj9sy?ebc1 z|4y(lbco|Qox~UvZai4Wlhy@z6p8F4Guw*pvwq%JjFSS}G81BSaen_fG7>FRcE?iH6NfU*H9FJAlw*@07Khoml>eGl5mp2N zYF?c{G$oS|AB5&LFlh4t;P&cidYeh{nmP)@2U!zorOhTY;5JMzkx}w-Ak9p1+-F2# z^eB%a@v=FQ?=CO0NoB+OC_?9l@xkom&TT7w0}-@zrIMfVj!fCf%_Xf|HpgKm=2k_78{THgi0ilt%fDVxW=yEeX9O%rm68oQEvNeyb-K%%+MaQ2HX9+Wsgee@Iw}ok)|2Ne;m7@DgAUiH-{7af6jJr$13pD3csNLEzH_ zu3BO^)S5ZIXFLaXMMrsi8YNBH^tl2@&(rx>ncIk4Q3#dwxIHRPr-~$r81y=t>Uv0z zz6(IN!^pPhxtw~N#E2^XK4{Ornb`C!k89>=R8634%XMPIEetsn035?!WTS*B#Kpm_ zXVEmM?1^J@!y;O3^2}^HIR_Ovox~axY96hop(C3SkDlC=9*WmKWKi#>ygi*a_BsCL z;Me{sP3>c6QZLd^cX>7OkKXr-UgFeGf*hh)5S5w;&k$#|NsBjvq>?ju}L)t za&s_EyBmdKI;Vst0C-b9@Bjb+ literal 0 HcmV?d00001 diff --git a/src/Icons/flags/china.png b/src/Icons/flags/china.png new file mode 100644 index 0000000000000000000000000000000000000000..58cf04ded3ea517d8ea8fe921ad88bcb5658dce8 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^5B*k-vwZ+N$P0~qFJSED*!;`pvy+KNx&DjrWzvEv;DSY}Z z?fiAIGtaa6^CpP0SLkl|{bRzyM;8;>8tv^*^rfs3EBN>O@Pz+QSeozOmKJ%=%)@Q6 ze{WhwML~n(x99GwQcQNR`uzWId}QCQ6BGXYkzqdlzdl4;D?$PYRO)IIS5#Lt9DHz^ ud)4%1I(hHk8%?pXJ9XgmcX4K228L%$rxvS-?+yWmGJ~h9pUXO@geCwT>BCR} literal 0 HcmV?d00001 diff --git a/src/Icons/flags/denmark.png b/src/Icons/flags/denmark.png new file mode 100644 index 0000000000000000000000000000000000000000..3e055375a99293477473bc8b90ffa0a99da7031b GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^51 z85ghSW}dvs=%kpzzyJUL+xs@ZxPM8sqV~Xxcc%^j!H54pJlp<%e>XYtV9UuJx)&}c zCbUIvsOCSs|LpA(9Z#O?7o7I;Qo12;XY?S{de%j^b*v1pd{qua9FZ{vI+MZE)z4*} HQ$iB}tx{)2 literal 0 HcmV?d00001 diff --git a/src/Icons/flags/finland.png b/src/Icons/flags/finland.png new file mode 100644 index 0000000000000000000000000000000000000000..818f5d415f4834a651d031c8121cf8df7e73cd76 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^5|2F^s^LhT< zM+&p*e>^VF5t^-E_jmWZJK}i~_dT0GyU((cY*)_ literal 0 HcmV?d00001 diff --git a/src/Icons/flags/france.png b/src/Icons/flags/france.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d430a6e1f0434b18a0bc5756a8887c022d6d14 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^5gFn)bR&p>Ta0r-bp4XKGn$6(p>gTe~DWM4fh#fmj literal 0 HcmV?d00001 diff --git a/src/Icons/flags/greece.png b/src/Icons/flags/greece.png new file mode 100644 index 0000000000000000000000000000000000000000..461f60f8a6acd30c0bc118a6bbdfdebe0bb9a174 GIT binary patch literal 465 zcmV;?0WSWDP)MbXoCa z2D3$h#c2(94?dnhBKzxy{hRxst_*0~p#)@fLe>PnJ%$%&+-!%ubnNt$f6>OdBgNXB zj@@MgXJrqS$0(4j$^O$(uBHqqH~J~hObP%%{gsjU#c?uB4GZe8Nc4pufa5*!n{5t8 z_UyM|=0LX4ahP6Op|Cv;5wV~N1XH7=JZNOQEJHT5Xn8*14@|E{Lrn5*tyfJ1bF>5j z7~;}D9hf^^7b%v0xN0=g1Q0WSrrN>5wQHx^0k%5tX##!$W@dWKZ9Mlq00000NkvXX Hu0mjfl%2g@ literal 0 HcmV?d00001 diff --git a/src/Icons/flags/hungary.png b/src/Icons/flags/hungary.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd38a24557ebcdd863e010a19e0da371843e7d7 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^5<>&kweotH;U@Xz#jyMaQMo-U3d7N?W-n4g%ft-+{r_KYBFbCLEwS3H{gTNfN!=<*x8REg+Zh;24Y}p(G`)`l4Po$f L^>bP0l+XkKvlulk literal 0 HcmV?d00001 diff --git a/src/Icons/flags/italy.png b/src/Icons/flags/italy.png new file mode 100644 index 0000000000000000000000000000000000000000..c46d8a1ae68c3b24e19cad83dc399cf4c3662138 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^5n@1{5iY0YW604*ulWa#KQ4`bpzwFUQXHH{K6nJ7(8A5 KT-G@yGywqEZZG8k literal 0 HcmV?d00001 diff --git a/src/Icons/flags/japan.png b/src/Icons/flags/japan.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaa7cce702bb589c86378abc69d59ed7d0e7c63 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoT!3HEXcCqsTDVAa<&kznEsNqQI0P;BtJR*yM zbSMZj7QRyZ2xLf>xJHx&=ckpFCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ypp<)5S5w zqWA6;Yp!Mofwp?*4TeXImt2hg@nZYtnch`w^5Gs!eUC8b2qq~XTEfLL>5NW?*w4gO zKg;cIR92ihb0eaCE#q#-zIDf{BOe8Z&e+XYC-Zp9a|`j-+sR>DB2G6O*09m94?ae02_#*e|bS22js=a~8X9_ON;E*C(mhu%kR{&;SJ>96_Pe^?Ap8Jn3}FI)%o O41=eupUXO@geCxR6M8%V literal 0 HcmV?d00001 diff --git a/src/Icons/flags/netherlands.png b/src/Icons/flags/netherlands.png new file mode 100644 index 0000000000000000000000000000000000000000..ddac9129140ec7099088c24b3ee8da4d2ac03998 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^50WbcEP)ZUaRJ0UXQnyaU}lE8@7{T@no=3Jj|ujVZ?ICf=w9sNYw#9Sz!(E6o}YNhO1q8q zdhWFDnX%9Vg@N|g->FjwSu()PKF~Y>0000o}-R5La>+KsurD7JTOOi{nj8aPR46dHj_HMg!m8s zWi;sCo!7S6+)AD8hV<)qUAGhtShC;M-*sSlqqx)(`TbJOGVg$vF?hQAxvXLV(HL2duafWBDsGAxQW8JhI9{RskD={oyG-rXH~~ zGzAGrc`)OE^aIcY>}PZsEiyY-L&1gj^A=*{kXsut*j37YrEF?Kt(L@DxWl-0pFp_C zW9u%5v2LPmd16aGR}_=b(j=L@s<>$-dG)%5%MAxCMl#&)hsL;1o6c84#DWfUnTd>~ z<6)#Yu)C#QxCgCsQ2)UvARmC~93;Fyv{iv)rexm_M{9ou)n7o*okLXEE=05N&W7;! z+_$>7P#XpP*Lj7VII`lN3&G!{D^lfW(dnOF{Cj2UFX*w8n#32B*Z=?k07*qoM6N<$ Ef}zCm;{X5v literal 0 HcmV?d00001 diff --git a/src/Icons/flags/romania.png b/src/Icons/flags/romania.png new file mode 100644 index 0000000000000000000000000000000000000000..8fce28465bfa70a820074ebc282271dc67709aea GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^5 y$>G{`#yy{Wcud$9i}geqWF1_=x>$^dlba#igw?ju}L)t za&s_Edw$;j@)ahx@awH6zOFqyJf$`n>h3t7y`rv7e2T6ZwWM=!PC{xWt~$(69CvfJ$3*9 literal 0 HcmV?d00001 diff --git a/src/Icons/flags/slovakia.png b/src/Icons/flags/slovakia.png new file mode 100644 index 0000000000000000000000000000000000000000..d6eae2b6cec4696c534611c0b9d2987a11e886ba GIT binary patch literal 525 zcmV+o0`mQdP)&$@`q=h*C=NhfCv+*Z&8&%9O+wYKRDFftM?5mp0l zG>O3YIMUw_UN5Sq2Il6lDoyP5-vV}a&P#-+fh@RO@cIgw3{+G=It`|YrNCbQEkMLJ zXA$stkmY62G|+V<6hiIqe;jMSbJ4A*4!OSvzmMF+Brmh`5DXx(J#MP}&RwKzjBRP< z(bY*j>n9owlF{;vVgo%M!zx(L07@tiJHsFyXyT}&m%Q$#{cxAy z?FBr)fH<3hSR&;BrHXy(14SoYC5yKZaXjSD0XC5OLF2Ep$o3|F`&qmL)6agd+JSm< P00000NkvXXu0mjfMBC+z literal 0 HcmV?d00001 diff --git a/src/Icons/flags/south_korea.png b/src/Icons/flags/south_korea.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1328dba2d0cd78f99d1aef9491b3cfd831159d GIT binary patch literal 1173 zcmV;G1Zw+lkhPwYGP?(}R^%l(y<4&1Giv{+@aDyd#c|j-+827>0qA65sckOeW~M zj$s)5Uxi^v5Co{IimIvrjK^aXMNz)kY`5FkwoR+mLI`nr_Fqd;6b6FHA@Ow*)Vt#aqi9gIi>83f451Q~`1MM3B~Lf07u0fz?%ym;|~ z)6-Kt&%?4T%H=Y;uA@mQnNFvC`0#vej)9=`8m+cw#3mTWeQWm#wdQcC*$KB}s+y1I&GSriHd^0^$! zaLC~OdwM%Nc(%>7-$#kXh_0=X*uIClu}(gpCzwvz-`}U(?J^t=8IQ-a76B-V!rIyz z4<0<==;(;yaL9KzZ*sd@g<6fXhY#sKd&cDWc$OA5f-LTlY&sNv{e@ebRnnOZp66j0 z2Gwd6%d!wc%mAvYvb?-ZKA)%AY|`)d$uBMv^E}$mpW{A$jPE!A_*#T^;tGzRzLx!Zc0t`8=^$4A1jsfD1*VQHsSPQcA>hO8?-1{+r+M+wIFcpW|6} zm$s;9O9&}B|JWzp=&*eKDyg~5WwbA({XKSyq5v?ROz_+;{q|?11OZHRgOAx2-W4|a z9G?RO`skdkLBLWdF^sRueGRyf6bhaerIlDX z2YmsMQsTNUqtS?TGKIdFBrz(p-ew->)!V znCGFR^W#FbwfL4_%M2dh1)ozm;|I5;?9Fc@(6?%lrz4Z!z(9LJ&2XkZuyolb{TD#iVu z@AKomDp#*(Y5d`E-W`%K4HlQKuvE&CNJV-3{5AWv8i_;#Ap}7X5QgDw4ulX0A+Riq zVzJ2K;USLWkWQy(e~GSVx8rBcClU23%&rBaENl@&BiLrRGrGe}1D*^CH*5DF3r2+HL$yH zK~y-)wUjYW0znXkzuj9zJjeld5<9J|HT0H7Ewu7SSZibFZ?QL87#nM248f>{SQxdj zzyt08VcE67#z5nF`^w!+zRa7MCvL#vP!h*-4p7E5piuRvw|=-r1}qe^l9_~VDi}?^TFdE4lgqOlb-`dZ$pHXLuK(bq=M({{T`7 zvO&PZXGj=nsccfaj%TQ7w+}D@A&l9D1PwDqglC0000< KMNUMnLSTZ;ORkat literal 0 HcmV?d00001 diff --git a/src/Icons/flags/spain_catalunya.png b/src/Icons/flags/spain_catalunya.png new file mode 100644 index 0000000000000000000000000000000000000000..015347ccb1be617e888a62b1288e2ac701cd481e GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^5FY1 zpB44t^{MUCw`^(n*l2#AdDgFnhyUyIX8n3_yZ-WNldTW#3YN}VrgTi2hv$B#6#JjG zlf*M#G0#fha$Y!Y&XQ7@nuRM_^S7`5x4hJDhg&eWTpQ<}1(_=UtG|C2_pSZ#Z_BgT cs3-;o(e2tFg*NWJ4Ri#9r>mdKI;Vst0323WE&u=k literal 0 HcmV?d00001 diff --git a/src/Icons/flags/sweden.png b/src/Icons/flags/sweden.png new file mode 100644 index 0000000000000000000000000000000000000000..6548b8417fcbbb3dbc65eb8054683263053155ad GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^5Ld+$Ko^N;rO=2JoS=mBqe}ghU7T|1LGMJ zqP3?U8S7^7tX%l4J>$=e{SWj5p7R+! Wb4cR;er;NT*NEk$rpx9$$QiDL&r z930wBr%r_q20}DK5khTD{B=c4)7+bzdyc~mF3FI@+`)G|9L~e}zW05lk;yx_?FmAX zB4mXQi1a-*209(k8W2zlA{K~@2_S+jW{{aw0BJPQ$2DlThlWJ@J+5*~#2##*(&y0i zZ|Gtf@A)gtaSgl<$UgwoLYk?U&oJL@oI4NE`)|QgsFf_{>>Sj;1|!sZpx^WWqW9O4 z={U}fO?2TM#HRqz#WFIVh70ErkzizQdw3UFSFd1xpWq)9g600bsWA3WthH4px1SKZ zdn*K+S{5>!LQ*Nr4|_C#Unn7oGg$dt*QQ-*jU*HJulHzOzlpc|W;B5J=qbi=nRvW~ z%3gxg7Pv0z@_hJWgR0Yo)Dhs^; z6NFb5(#T8_d>>Al=;{}6-Ejmhs0#D3f(f%Kh(`a9HvI!tmX=T0oo1>40000X6&+$j0cy;bE2(0B$j*Ff8ZBB+{c#*~#z!b2&~+z^H512d7|n2@r!OI9 z3$)4QtH`|iJJEqbyi2{j{oWQ@&-l35+J$A!0gnHfYy%QUQYz0>xhbFNBWIwE)T&ju za^3WX9B5})!JYFL$#+Cpvm=$Yo6GTJS7D?YT)BLWA^#L$J!H59$0G9GNqCG|8Y^sS zFo>IySmioyr5AAQ=q0rM$9p8S&oO_vy-_#1?H zK#~+gC3A_BcemzKJ=RY0jS*x+J*KCOQ|AXbe6)!hgX5^CRs8Wp(1Aa!FfcU3W4W2+ zhDJ!fJxGqXh~gSALUHh7bv9Fn4grwW*vL(PfLD`;sn(|`-uM)*np)cCGC6$uCM_*j z=<;2|vZ834>%2%?5{#GxS61VAu8_H|R>Hn+3TkR8+*CnMx{ehM%@eSqQ5v_EdoJM7*Ot5fuTpv@tCksi+_Xc03MJqN)nvzJC1m z^#J5GH)D97z!qwv&omP_O+nMtgqrsPDEdo_=d)ME7lQ$Y_d4B6EVm&8s@T)Gno8p?6GxgExbPco>E-P0TTDyq0Jd#E;MK|R+xX!96P)`iMC9dd zIG$clN#qv0%VX@SOQ$eX#i_f{-mI_V_3br0J~v9rv9D02$@Qfre0_0(?)W%;lW~Z} z5(X_WD=-})FnyaZ5B^Gf_Z_ysP{hWMc4PH)qkZ!uSstCXy!B`en{)AwwG+8DL`UCU zE)QGy(sTG}NGBE?1=M@zKLG?_uz!e~*Cq%|1sHf~HLEiUDcH1*{AiFIzn^~q)fdw; TZETgR00000NkvXXu0mjfFUTb? literal 0 HcmV?d00001 diff --git a/src/Icons/loading.png b/src/Icons/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8e5b96b8e80134e0b0b6f39cb77112e2680284 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzsmUKs7M+SzC{oH>NS%G|^0G|+7 z1__3lGiRoyr5PI=1I4y(-CAUG^cs-GSQ6wH%;50sMjD8dhY#FnK+6#Y%!KTuvJ=mvC%}4hMPWI1&60hS>WTws4>~pAwXbNL!)DW hz&j&1#yfHh3|j=bzkaT%>INFk;OXk;vd$@?2>^BCL-GIs literal 0 HcmV?d00001 diff --git a/src/Icons/locale.png b/src/Icons/locale.png new file mode 100644 index 0000000000000000000000000000000000000000..827360a8b5aeed9fb8ff65e44cce8e1249180d5d GIT binary patch literal 1319 zcmV+?1=#wDP)%UX1hh#+ zK~xx5-IYshRAm&$f8V{|eazf>w#5z>+EPm~Xs|{eS|5oqHKGYcP#~xnSy+t=i4qbu zqA_uSZd@2$*e0SuqZU&i3qXk_g%Ak{<e{z!Zfd2?FH}H47!BSZl&eWvtsjV@pZ_+P+{nPoDp+r|RZT{Tcf5qo4jh!X= z?9l3lQ~7-da$a|L;9a~J43{m)cN6}xh1AlyHP?{8DIfYG%l|sc~fQ zL-oU7ZnTP{i_C`A!dST+LLpQTV7>C1S@hwD4^*AI&}fRNmz}CS(Gbl1V?ips;I~D2UnZ76PNMk8o2H_U_$?kr5Pv zyyxS)1?=8Fl84)IziMG>agO+{IVe`-Iw98!Sw$Mi$;9L97si%Vqn0m6FBFhHJ?H}i zplPI)&Shyas^=(_fQZ=GPMGd@7cX4|R@8A_A+_qO`^$wbCYWTMRv3Os3z*!9}w@@WKcM&WeDA zwl~T<_;Nei>-XVwCp5Wu%CoW^<1^=ss=@vjSI>M=QEx`$(Gc^hBG@;^5YY&jHb@gI z1_@V3%TI$B0zUw+fU^9npaQv{$t(NeU0ihB2?YcrPq8c(7a=2NA);Z3L?9A|(5y)l zd>>sZJXZv+uX|GHx@j2tjHeBQ|K~~r3h-uqLN=wQDI~fMx&$e~Fu}4R>`(}V-+OML z|5*D#`^k>+qhr_dSLP>h)~(dmjZZQJv$tX{ZCzX_Pw_)#WpJkzRv~;)uCFG4pUie% z80y@2;7V(A>qzU!G=0Edv)1}Et(CpQc`L&GoIJh;r8{7a|xK> d&o2K*`~gJx-h&?i{i*-}002ovPDHLkV1nv@Y0m%v literal 0 HcmV?d00001 diff --git a/src/Icons/magnet.png b/src/Icons/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..49b06fd20d9c598fd549b07a6d457fad69f953c0 GIT binary patch literal 7199 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

dDgZ|tMj1a?0oBmiRs5UmNje)&>_&{>gD0CdR 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 Z{s6uQpM&(s52yeD002ovPDHLkV1m|;Hsb&Q literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/application-x-kgetlist.png b/src/Icons/oxygen/application-x-kgetlist.png new file mode 100644 index 0000000000000000000000000000000000000000..55c04aa98f25a6226cb90aa003e2a6d2a7639f07 GIT binary patch literal 659 zcmV;E0&M+>P)mzf$l^)8)D=V!5j-e8 zt?WTOdGIQD5kc@@*n=Y8J;)yR4=B`wKfsIbVWI4zWrb3tCT?j{o3u@nad;%ruuH)& z4D*tC?=v&W8-<9VD9RZCHT<7;iKwk54>iYewqu5=sw$14Ib)?>#!p(-9RL{sF=3%3 zC|%>PGJp_jwviCy@{8-Jlr5-=fa8wv`QZnsq5vh?lLMq>fd~rwSrp-H)xx!NHRyck z-PbRO0O)Fxgnb^6QrYA;AQctc!Y}_2nyR5vG9mcA5CT|GLFNSmiYJ!fB!FVU;8v8} z!J~jA_&e|r#&Z-R1FruALJ_ddDhB=#dKh5YDjf?*dY@r)=P}B*0eiW?v4TjId2l?QOcKK2IRamvzBv<$TR2RK9@_tzewAaoGX(F&0C zcy;v(Iy)U`l`Zs!19?AA7j2x6H?UT%VKSK<+d}Tv-Me%buRi?*N^d~~tPF49_Juk+ zosP`j?RLKb*aIsqXWjRGVmi%cGYZ3y=JPpizJEf`KR%@(2&mO+(Re(jMx)^XxX32w zC>^GCKM1z@Ph@kz0C=8<(P#wIG~v1~dcB@ouh(yKf?ZHkZUi(4Z(m6oTkhTqH<*02d!r|nwq)|pbma8^ZxCR zPC7Ate+Hy9e9x0_*zRn@@EtZ+d4lZ`mLaO>I_Zd^GDt=U0c+Pal;u8zfLZ$5l- z@A1M~4a~cLC^A%9;C`>VSU*(FrW2rb4X?C^s|DYwt}ebm6r zK00xRxM!fM&@x>K>kHqJeL7&&Tfv$-vKS`@038Lbw4hX+8nD*=5^HSrGIW!?vatpo zklY2*%0nr-`e@ErYYG2Q0<+qcd}nfebGYdbSpX(a(G2}sB2ZrdEDCkv1WIYFZl>$A zbDvM>(D$;}%c(sz62TaQJOf5r>Nl8}+3fv4e@?5}d z(2%iGG$?KnAkX*n$~IS}fHl@Oz>P5I>UI?TB;a%-0J01)3;`E!#h_lKseu>ya7vN{ z+dYFQWC#~TMz^A1MYo&5G682I&mg57maUw=cdPnWk5mzSpX7iHvB?nm%H`e#%MuSY z!>^K1Ovb%U?C@NO+s{%7@-G|fsWbTG5WW{S_=|ybp`69B4(G^s-|b&XzH!J&^(4b&&0*a-&WTC^8HoNnh;QTUN6o+ zdpbUS*F@1UyYi1CS4}%g%=cF>pOc#iaH7#_UD|s%bc`Eky4&0Dg!!QadjQ%vzN~ml anAtCJ<@r?F)p@A^0000e0 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 literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/bug.png b/src/Icons/oxygen/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..44c7ae1ed3140738c15fb87880d3bdff0418e552 GIT binary patch literal 733 zcmV<30wVp1P)Y`MskBx%3DsDvZFA;R(PTZ9i7sXN#H%cK3+iqH+jSp&K+6LMrGqID$T(8jJI9c=u zXEA5K^UXOQ3>ahol_-h|021tTLj0W^>w1upQw86rg273D;O(h`6b z_@D?-E|)*MsycWBxYjPq$NG7-0q2<@^g5371pz2pVN{l5y%VXYRzgZQI!L-}ggnwT ztsPDFF~Ios?E!e@VW(!ArK(}>*rD5ZM&+Xb$i4=us#6YZw6f#L=f~)&#Z#f>$p{~ zONW8bU+upQe53(84{WwqtA{+sP`7R5D-L!<5n2A6(zLA{P(_oV0ncG@j^XDiZZNsK z3mZU+e>ufZDpHE6%I}<_D4hV-TMYKXyqs}slQXf{S+`I?m=Hu6LygzVWD-X9*DMeE zwBLaGhDjokQ0FS;7k!28_uu%?3a^gq?g~GXWD-rVdtQ- z)eByHw%>lw^Zh>G|M{K&|9=hv_)nP&@c#~QlF0D1rDelefBzfR1_sVEH9bw_^nj334Uwb1;nE|$4J((T-rE!6AzsfEKm<(lDT9|V zR-ndYO%=|)<_O*!Vw`k@c9Nc-7CYlX**Ca<>RX7%NgW}k9e$hzRV*A;@4#eM7K8^? z6*%K*53UWB6HPgeqeLzhTs!0CfO|(Yn9R(?-~0Aq;zS9=OFYF}Z-8S&^_46b`1C!D zr*FsY?T<-M$3%H4zV}dpdxmA;znUT#A|mY$3#3 zZ-7!F#}cB!YCBW>xgj1siHX`ICu8K$S19CxJ9zL0qVe5M*67dQi|(YPDgA#PIlzIf zA)ex`H-J#Yjm3PPCu|p?XMHp-M{Cm=6NA3IY-BoGAl<Eb0N|2F>4e2v2GRGmM>Shz%&H~p^<5Qymuub0llARU{Iq*1%EoC6^|Es z6z8+SL86;wR>tUxeI2d7zK;kDL}yeKx>HhdZPR9SZQO`oSFAu&up5qA8bLIoot1Y1 zo4Mq(VX1_8HykZ|wJm(*=Ts`x&YOo?A_%RkJW#^JrB^hw_A<(4vphB}wlqdtuqVzE zO$XP!AU)EXJ6i#Ah@AJc;bAKibcA}Ni6ufK(;z%rEBhT`J~(W>2%^b((IXH8wS1A- zuq)gT9Yhe?nTyN?LDrA5S0NtEv)zW-M2>q{s9}TN$Ytm!(xQ)PjSND7jT!uz^K0I~4XHgv zZ_Jy}s4O8~;yI%LyNu_%v0zYy{cLcHNQ+UXGbRKp?X0kp=w1-f{S~~vv^HF7Q~LYk zBB8OjMUJ82P?4XXyWRj<<|e&)OT2M&T@>ySX)(cEi+u}WDjTdOy1SLgQwZiD;ky!xwreA>ig?w`?I0A2h8NhAKH((YXL00000NkvXXu0mjfs{d(= literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/button_ok.png b/src/Icons/oxygen/button_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..118a441b31c6807be30b487d949917311daf2f79 GIT binary patch literal 1076 zcmV-41k3x0P)y{D4^00X8;L_t(o!|m5gs8v-Q$MMhF`#v<4 zC?X*UiV7Mus0b>EAV}?AO-O z&bac>YzcU^&&(i6y?ItW@OqvTl3+qI&ph0NcTAeJAWI1+TELq%c-QhV$subbD+O!K zb)QzxBPUS6>IR&`LD5{RC94Eel5xRXCfsivV<$?$+XLW7M5Wgx4+`3nk=ne*9IK2; z9Rcf(A!F|y0$(>H=AFGQQQ;-Y!-6(S1W8*kBH1Ik923F%fk!jd=IP&x#y{5&fVV}# z3zA2(#bth0B`77|VKII~2sYF*wk0W?jwkS}=y#*j84H%@c|*hPQK1qA&q*GiVL4S^ ze=k`q_(j!8#NgcwKOk9PzT_iZja`CU9CFb7h6oLKQmRyV8c#70zE`qH;U{f{Bua#y zCCtt6C78lEJ{K&t+hLd1M5Gx(>cXGIGeh7%X3O`grs17*8 z%7HAR)j2|95B?aQ&%mMq|2e~dQ03%~^@Q7iV2;9eTvY?Bt+xo4nWN=M&j(%jBY1HL z{8z~m!Ja{IE2cdFCkeJ-(GU?IDBYzLRZ5k1=XK)cA@F^YYXsk_l&EIFmv=qzelD5w zB!|rxe0&s7yr-~2RN;YK`RnkQ*ZXlTz8MI=yB>m#d20}iOIl7AY{eBrM7)9Bx&Fo8 z?rHcRxDHav*%!u!iKrhKNx~vdNi*`bE=iKhgNyCYok@0hmAI> zP&>6{F1Mq#d8~1*3omM6h?5ETmS$7B6?I2D?NY%?PN(TTo*alb-Q_5Tb0000ZXfe#8;LKtO5tWXONw^t@E!e`!RYw6GS13ZqQOYPd3iX#FXM=#8 ziV7%kuyV*{!G;#bRiqs4=qMG+IiTez6hob`4^8$Y-~YY;o9};)H(<PrNHq`+3()3_u zI5?!GrPv8EL?RLN>+0%8M@NN1;b(@dtSmO0 z4OBQBPES{tKqx??(M%?@q@)Bi%gV}HTU*=P+h2b|czAeHQWBu8sHnhVv4DX@A^~qX zIXS>aO-)U0Z7oRD-Q8_sVq#`yW?^9g%v)Pq+uGU!dybBd&d$z&AA`ZTxVYeOI6NNj z;o;%s<>lk!Lm&`*eSQ6YLI>W&g#}{(GmyJ|`*sA05J|#CMn*4qoae% z<#tVU@pwG`&`2M^OkaP0|A0XB_U+r@;bAb?v9Yo7@o|wzBo>P&CMF~j$>ijuR4SdC znv%(6?*NpW(?a3&^z_Wkj9f0Cot>SVo134XUszaJTwGiNSXKWckt{DSudJ-BuC6LN zI~59rQmI^9Tie*!P^nbg+uLfjdS_>6cXwB#(fs>ye{W<2+#-8V%`tGR+~U3QJ}@`{ z0)a&8=$ryDGO{6)V`HgQI{hGOMMYh6b7yCFw?H7D1>!*Hlg9cdY^meY+1*9#oup!n_wwx&Gb-YX-oJz_v0}g#dI6ZLmG$DZoQ{> z-VWj2aH1GGo)ocrnsP-lDqTWqoz^6*cU1;0w<>@5u7PZO=7^g`%$8ccbqcZZeoMxU zy8HtAv)sb<@KI(OlX(~uE$uw)!>dG=L)W^iLP9F}RhBXSIWL3c8e}77^YRhD%bW7A zEKz(yLy(e_ktR~S$XAH^)vISJao=lgc8bZZaNds6F+^Fmdr5WPKN6KsEvhHJxr5ZN z`}s|XX_H;?4p*=DevQSqf!yRH`l!HnP#r@U+ov*k?8^GF%>FE#WH=yoe`58V6!zi4 zwJ(ST@F(i+ia~zFLICTWSxCWBi`L+hBG8t+^q1c6lKF3Vs=l4G_5NIs)7e@dm+gOD zcHEts+*6h*N>sn#zWzg;S#Vb+D>!M@sDB}HU3}B)K_R@bZHBjq)*IKbn>fAcYuH8N zf`R!>nION`hGSex2^F4D={z6Cu%fLNp4(rIy5+9;QXShbxI?lTcxjT|FxyY&b4u~v tiK#y0gJCgvG}}1{`VSDWogM%H literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/document-new.png b/src/Icons/oxygen/document-new.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb4ce05812f6c109d7b3bc3fd10900b269a64fe GIT binary patch literal 873 zcmV-v1D5=WP)g!0D0`BB1}#^JwdP| z$k{z-`I?*M-ti$M*I)LrHPp%DQCo;e;9gq@Nlw9S0>OM2p43Ulq$?`{x#RQ7) zg#Qo9WO2*Q0B-tT=CNZv~B2(Y?SX0&*zn%C?Pb z0fHNY7<&!chBP7@pzRmL2LzH+cQx1w=^|9Skfdsj>nl)g<#9dsd2h5AyznOs+D`Cy zf+7&Hvm1VQf)xO~Jdom*?P@aDTM>)Kh_*$c3N!OCR{}+*2yec@+#=xT6HDB2-sAa& zh3Bg6iuo^UUHNjJp7%W@<`Yl?-w$~mDqFzv0Gr7$&k=E67`nQtAug$!+grBt_V8P7 z?!C#Ou0sU&Z)D599aug-)5-uLc1bCK)A;w|qHNswcDTg#>Bi&noD@Qg(15pQcehro zCU;X8*JX8S)5dl?EX$I!skknMrj3imBI$IRrKKgx<+39;3?m23f}3vphr+%|EH5t$ z`vzf}rl?dZPO8spHzGY*#20P^)O{}RjkxQ}tM2>WF@|8I_c;iAm{(iLSj@=?R_F8PY;KhsaQh$H!bUglU zj3(%;5qqcP^TzC@OP7zYCSCu39;Ag3Db~PW-k42K!5=_z00000NkvXXu0mjfKDd*j literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/download.png b/src/Icons/oxygen/download.png new file mode 100644 index 0000000000000000000000000000000000000000..6c650c97bac647ee4cba2609b6bcb643f2dd62b2 GIT binary patch literal 1705 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 literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/edit-copy.png b/src/Icons/oxygen/edit-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..d4180c69c2ce5791895782978b4e813bacc2270a GIT binary patch literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*yM zqGce=SbMeU3{X(A#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFy~cqX3@} z*Z=?j1Jz>%&aSRNao<4y_@t!dwA84$nDm^iti0?Ud-mSGd+*TU!{;wt=$+8pH(|o0 zX;Ws-o;`EUtOW}fE?u^4<;s<-R)fIWwQJX{Tep7w`VAX4Y}&MG+qP{xckbM^Z~yMy zyAK{bc<9if!$%IEIC0|i>CNOa=0fV<-@D2>#zkm1P<9i_Z00ti+;M2!XVDK3X zzJS43F!%-r-@)Jq2>kpBL_dH10-|5PeuKcDKY#xI{rm6VKaQJcPXWV4v?Rzcn1PXr zS=HLr+oz&&(u`&6wjKHY>)*eN6TfrB(jw)AHloTbu#r>pGZ z)!FsJ{M%%wv)syFD$0L6d~K`!jMI-rZtk8Hd*o?lMP>R;=6YTyWraVpVqAY;ZzwQd z++d^gTHpWkKCy&vjg7oYT2h$?I}S`ar4T=>L2{#*LuG=`qyUM)%d0jth_G}w+NjR= ziw<*b5#UPq+07TCyM~MVNQ{ACV@#1U+gc?igYDA}l^RUZnsp#1@8~KIrd+dp`Nl3R&BO%$Kq(IxQdk;ED~%W4xMCGBG*-g4)_irQGpazIMs?zOh~3vU*XI z{~_XWpmgo&>gTe~DWM4f5f#Qg literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/edit-cut.png b/src/Icons/oxygen/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..073232808a62fba614f56f1daeac9e4addc97ccd GIT binary patch literal 892 zcmV-?1B3jDP)kdg00002b3#c}2nbc| zMg#x=010qNS#tmY19kua19ky@)q>0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S* zE^l&Yo9;Xs0008}Nklpqd-%TR z|2P*vK`+{{^o5}LLo7{%!9>5_s(X6h6!4&|@wG|7Gj({ZFmArnqtBeLl6m=@OEcNdT02My0)1X$-i2NUA8lO)N72t?3bsjBer@&O??6`$nZpH-O9m zi>d@lw6_?3>DfIM8k)(`ECAxBjVa}-nylHg^2CV=nJ&2iWC1{&#t#Y%3^+N=Ol&$k zmH5&}t1SXR8D(Oq@$%7hZ>Ul+5|rGf1r`G2{YfZ;L{gG4)v~>Yh7|ZQ?i3HQ6rlap zlTe|%n{0{I`c@4w$_2F8VgN*eAB9qAv<(+-&%2sm~ONpS6-?k>+_aRT8l%mV()gRX@>3M$+ogXIGs+SLs_r&rYOhGu<^&tH?Z}VX` zW1Za1j(aYFNs<}>#EO=M4o|h9VIEvYjr}?}pJNfpc(FnL?I{Qh*8{xysR(ES`5lbW z`Rdp?pt)gtx+{3_eFzFF%7EWZJ%F2^iR8a=kNIjIoLWG}<5U&Q?9)ZJMfc`{`$`XR zvsh-A*A1~JTvZ3au^ZsZQQjDArrz|KuMFVjX1p SYgWbp0000R|DNig)WhgH%*UQYyE>2D?NY%?PN}v7CMv8%fktx6@ z#P$FG|3LNR0Y*kfphgxJ7A`K3ivi5DgoTAgMMcHL z#KgtLB_t$(;xaNa%F4YwK@}Ahjdisx4(u)ACT-5#?a|f~Jh>+%+D=TepIQ{MdSX@e5v!R% z*DI6+`2{mDa&QTYNUEr5x+gXEO`b7#>Ao}PFTQ^B_Ved2-@g6+(|b3-6R38(r;B5V zgkHE2C^~&oE5eyR!nAb2>;T3_05&6xywo~ zYMabBTd~X9bl2TqndY+j5-HDaecmV@tXWuJow?a$$Hhl^^DEa+x4(V;>ICN{wH5VK zGz3EJ-aA_}`RkaUIPTfd^PK(W40eWx$`2H3SYm!Koj)#dH2k~RCZHD>JYD@<);T3K F0Ra4-y$1jQ literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/edit-paste.png b/src/Icons/oxygen/edit-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..4a109a164fdb846ad285950b6cf54555bf52d979 GIT binary patch literal 937 zcmV;a16KTrP)OhyY5q10W3=1t0xvk9N?~$xasmc`-|fKd?d|tyZaQ>-KmjlaTzOz= zX{k4e#&UbQEtyOj0}EJKShx|1MDF_i{uy*NaDw^ydFXUH%I&JIwWZT(!1-#P>ffr@ z>yI*-%)7oJh(@E2r>Cc<0)YVdd_KF-;-OFo+#nv0LpU6U;o)I>ez{zp+1%WGirtO^ z6sC4|c7TJ(Yqc6oOt{OhY&HwQV2~$guRb<5c1=t|BBII4eQFWfO)8awcDrr&@qP@K zY9lX_+qE%;LV?Ed&04fS3!xgdiQL9wF=(|~TKlQ-G={8J8jS`~TvmB^B7lx{Qwh+{ zwz6vB)zww-f?O{5oj)V_RWy6t17~_cWiz2zD$&IMg&J6$EHDdd497{|g^>}vg$p=y z_sS~-o1ByCbtXisYj6qy7t&7v72YS13j%}?I16wHgBy4af#c5gXIX$00w;2b*kcH| z0D!*avJmef5XiNu1K8W&hj1ti!xvOKy>*tDpz1{!|?T~K>7VqDK z&!4_fcZrhD@kNx+=S_6orBe%XE9LJ%=P)K~zYI?Uu1_(_j>ZKifaHy!^JTSc=*qnH;r^Sb)W1fhq$q zS7HL5fhB!}WZ@Zr38_1vENrZFh+4^IZHF{6wk2ZO#5N1H3IZe`rc2Ivb?-f&?sAV( zRTbm$SO=a04}opq8qMena0I*po(+e?Tp5iHv zviHCp0qpC#?hgh7Ow$BF*Y!pK@;s;AZqw;>m`o;qp6B}l*z-IO(=@Sd8!071h(-XG z%Oy#Y0N{BZ)9G|i09%%2VHgIE;{fpD<#VFw(|5!D{&jZm?*0>i5CX?>NYfO{vH-SJ zKvPu}DP`U0x-PAj%jwxEC*AZYuL;ADlaD7X(v-u)5A=FHZr-@H64T3G zDo~VVS^sH(*=)vqe$M8`CR7#k`8jc%{AAVNDM^wGh(Z9zaUA!vEF%mQYL{ZdeBm+p(lpqKI4z4_uDpwuLzXH(av$`$#SmOWy N002ovPDHLkV1gn1_q_lB literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/encrypted.png b/src/Icons/oxygen/encrypted.png new file mode 100644 index 0000000000000000000000000000000000000000..04a05c1cb1fec55b1d037f11b7340d8d24f9b969 GIT binary patch literal 750 zcmVsmTOMf>H=7Ly%CAwRb5*>sq*K2!wDGwwax7f*>fu zMXOv`(8`V0A~f(jlp#%LhH>6F&-d=U?-tXHQ<7(O?mhqi?_AEgb^H_4({CefZQ+Nl zt<8^`n(D6s$g-NsW~G^2uK0R#@_|&Vch?@Kre3v#!=Xex-v4Z9s5csmwbRwrLU(t2 zb0FZmolfW7@%a7K#l?AX4v_JRTV6 z3rC~P3pr#qW2szP^{qWTcnL}KA-1` z5L&fy6`&|8hM^;bAd|_Tn5MZ}sm;zNva+mbnpQ&BbreOd&aFzid1*6*==2I{AFrA9 zOb*U%0ouXUQnRmynpc7Kn&0|}rGU^Uq{>J8Q>tjN`oP-7@?A{9g=Ag|YM z=vajMo0`Kx^;9W&3VX|jP+tr@+4$@M$V%LckKGz=>c|1dfD?q^P%R*a1?0hT0>zz< zJ73@Legn#YqnwSU?m#ieh2a2_z}k>F%7xBmaF}y23M%-t3(O7_OK@<4Avql8oHIba z=wKB!@QS|;m9CZziVnvr7#3E^MZQ=Aa2!B2z^{R;4r~WZyKFRV&@Ct#VAx<-pu4O5 z>KZZZGD-g>)|%bjU7nwxnM@|^?d>t2&({G;DaPY5Pft%sDN#z1Wf_%9g<7pf zqtW2;@sS`1kW%IVx$MAoU9PUK==FLG1_KI(0tW{NRI63A)>JALhQr~?%vJ!mx3|P` zOqOL7i$$8vCYELK`ufUjHp^#{W!YxH*47qUYvMSj)oP)XqTlbMwI&QhJkKKxL*h8z z3^+PEA_xKsg#xWsi&CjXyWK`9h41@#o=1`-XstH`PEJl}Hk;hv-*bI^jpunpQA89) zjK^by5R}VhCX>lJV6h~ZmzUVKO}E>n)9EmsP6>hltu^&}owv6)9v&Wsz#kjN7;M|F zjz*(t9LFY2Qkdg00002b3#c}2nbc| zMg#x=010qNS#tmY19kua19ky@)q>0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S* zE^l&Yo9;Xs0008?NklmMM3 zxYLD#Yggh@bn8O85VfdK-&n;*eOsTjifuKh5w#{`GifHK^St+SrU^l7t7SZAh8YI# zkMGXFFv73d(w^L~X2p`Gy2df?*6wrM=tj0LK?rM3Un-3w>P=E ztzlEk(l(n}%4gMfkb@pHxR&oHN>`TU;-;-1e{NzbO2uJ24{pnF4MLOgMdNCw_I>Pw znyJ_7oThj_kxOJ7zO>3!g?eZEQ|KQj&h5sL-vFXr3MAyi#=iDcYcg673pz5Y3qQ@M zL@6!4({XCwJ(Y9u#}>A3>e`WAdS>I-`2w>ig5>!6WAjq|54CsG0Hz$;)3GqWJk|ET zFd*fs)FEn?lp?&neMTAN?syTV@=10h&dVzt%KUst;N<<}&N{3pO=PyUK zG%y1ITs=Lg2Y?iY8ReDF!x<-5Uj9AqMPK9j5HJfcY~DCAW(S035D}pIj6o?>SR|E5J*21B2bY zz#IW!|A9BxbjN}%T_5n&SHrivF=G_W7?NH45^EA&j7ZpC>f8ClgB~#F34+`;iz6zJ z*A!JvXxSGfV6H$lM4W1oq*?+4!T`a+h=a3mfTX|x14l?;YJvb@JUjrf&|47I2@n>j zPJnO#gAA7c#{@yBOoReBK8( z#s(xHQG$-guweVOV3GLC|9~+lQ&oM$#xu+VhXd2+1UztH`gVQ-Rt131FZRal00000 LNkvXXu0mjfxE+w2 literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/folder-new.png b/src/Icons/oxygen/folder-new.png new file mode 100644 index 0000000000000000000000000000000000000000..bd34174a33ca1b0809041b89853a593be6f6a2ee GIT binary patch literal 923 zcmV;M17!S(P){7@b+0x69x5zf zOFuQv?|XLN)T?e*$tkpCluG{TM_od0zCn%TaxNqU^6^s_y(x2wHvU{?= zQ2($UK6)~Hxvr|PYqxW$OF zngiwx-}fJ6kqnbfa3=%_pqYdSNc3*vrR?eQb<;|C&i5N4#)hFoSUnt&;_%`a7sKOZ zlcy>5PU4%8MAXZ3l_Tt$f0ub(mcY$7yfE;q0w(4xYx{+kJ*{KxDIVirJV98pf%7X~ zEbz-h)EoFh6e*oBMiA7-16T06Lbqs)Bx8ZlYzdw4tRRBKL;v)K!;%|%&Ei62Rqxk>;002ovPDHLkV1lSPvy%V- literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/folder.png b/src/Icons/oxygen/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ea7e73ea3c4fa18df2124971ce2bdb7236ad24 GIT binary patch literal 449 zcmV;y0Y3hTP)HP5=M^8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10X|7YK~yM_m6AP9BS8>G-`8C;o*BbfcCwa8NRdF|G>8*$0PaA_ z0XV@*+<_F4ZM53Nl8rW40(%5P7P8G0fq!86G4Q0Sma4m61zmD?0M4)O|0Ype0N2AA zH@A$m-vPqImziB8kk|dp0mS#mYtLs+YSlswLz30<13xd%~v!s%{bM%wb r+9{u(E(AV51@kq2p$X#d?2zLpMlN2~$8)Fg00000NkvXXu0mjfxP-!- literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/gear.png b/src/Icons/oxygen/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab8c04f4ce514c83d3b86d2abbd6a8a0e56b3bf GIT binary patch literal 1403 zcmV->1%&#EP)tN#p37~2FWN=O2B}nB z`59b@fxt<=x%b?j^SSqTe&=`k4ghQ@wD-B(g1<^i9^^3?9xmu_*(hf%$QIO|$jF$8 z3m3xu@qQcXJuM&IesA&2kB z$ERO|+3ZXXK08rdTwb)iY=+rcjSl_KHv``1K_|j5LOai2(Wx~vi26GIUGY<;ItoiKO z^Eb&?zX8*%t+)S_o6B#Rno_~w;0UCqW%*Q>359rCCt?=c04O9@A2rU5~`{mL1tzSczd6toSf)h zYi#gVH#hIm_;{uX`y1r)2`pP5DMKK6If)^*FEQ~(Q9%J;+S%E!9vB#fhY!V&l9En& zd42b6y#wIxe)?Q+aG0sQyb7?4FfcG?!4~`{JDVrAxBv7U0sqk4+@+GsC!xE02wGd8 zLt|qLBqrWm^7ReOSr6>*?{6Ix6lRf1o1vwp3)KsRf!zcyF7!+S_K%HaHl?Q*jPiIQ zeRg&!^!2@f{QN>=XlQuFdf=$2tNUYP<1NF(FQK&bF<>raWE4%Z*}Ru_cKg``{4we` z6f+{?nlvj*0R8=PkjVzjk&)3ebb9!gzjkkNPw;+GnY&!57%@b( zMmgBn*z%;(wuRo_A&^R&@N|hmB&x=;)FP}FpEW>FPcOW9F#@5XVfAFQP~W1?pmwY` zHl5?*653@lIW~T;-re1!_V(@DJqm@wq*N+#hKR>PLPF}f+}!?GuO<)YyS&C)sOPuUU7GWft~Bx(#euuEiJk0F$V%W=dn22X$(LfTCDSj0d_?ky^aNW z(5(;d7)eh@fYJRj_TG`?8EKy4oWmghVS@ z+{eNZQkxQIF;WO(7h_b&xtk|^pcGmw0@d^J@mUs*Ufg+_ZC})DPuIS=eD?B~^Evfs z3l9kCDI`2X2y#+7wgW)s5^56`e)dBe@%CFf%~Jl^ zd4Q8Koh$|iQVF!{#o@aKk5Ps|1q8Bd5t7)HN6p9lUH_Tgs7)uym@!AYj83tRf<J$I7pBXX6(Tc`=cZT`N^sDS?uHHPHHk z_KSWEm}MW0e>?1>JSre1tw?-C+^rvcS{MEIxW9_L+F84pKr2Dw;^GZp5O9&-Ub;tS za}bc&=y3iD>nzQrg(5;pfyi53usxhl=t-xEi`%r~giz#%5ykgtUc2nGhr97=;!=c^ks(+f hwc{TxEiLs0{|}&sZo)`g(B=RD002ovPDHLkV1oSvsSW@D literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/list-remove.png b/src/Icons/oxygen/list-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb1a59831d42e01df138bbe76861b3c573cd71a GIT binary patch literal 498 zcmVRHg64C~ZChUS5vpoL5VA5tAr}#SR$T{WGVm-b<<#qEEI#tZ50{s_ zoB2GJ{XUkK6-*-`DOY$(N^&m*v}_h{o(H?v!{cy>!(tJ_w)cZ57K;U5Ivqr2GuZ@_ zl0vXVk4B*}a!Qvcbf!~0H5wR?MtB84xg6Zd1lnrG9&lqfo5vfRQ#76C(+C7#7A*2u zQ7DK8~KoZ=ls6?v;mtBy1Il+Yx+d6O^HH;mDg~3Pp&X;F85rUpy ot~*YL`;#rAZuoZ##s5M40Ta=R=mj`S^8f$<07*qoM6N<$f>l$>!vFvP literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/log.png b/src/Icons/oxygen/log.png new file mode 100644 index 0000000000000000000000000000000000000000..24ce63b0eaafce1b20e9fa18449ef5461a806b3d GIT binary patch literal 541 zcmV+&0^dZ7N$rVO$-vPedP;;s2>oB zU~iMkLTf?94^R;8#6S>4ktA4{SSUWwr~wVj#x>bo?@o4ih8@8JhrP_)bM9jqhKRrz z3j;s|dSLKBkXR#aBjg?o)$4CX1k?yXbW8<-;Kl_0ol2$B6z+$FCGy+y?K3wJBEjhJ zfZL+@cm`bLVDI>{Cv+=$$jrq-({<%sF<6`#|Br zU0#>~UDH$p<}NNXJI-S*P+ge(J%TUTIXqVqSJFv{QQMMGHK0pgd1*euV|OP!mKlT? zCeXG6Ilj7i;FQkr&k?o{&ZH!Dft^kVTCElshVd;M_?xFBF@j{!Xner?%OhO>e8Neg zP^ng{r^*gMbRdiQUc#CM@#!RNY;N7JX0wxs$UE>JQ^YjQGF4@z+LN*e%d$YH%7tR_ zZY`HfkmeOUI0l4K!!+BJi0yWplV(NRwz1po;#aeY>-l_%^7@^8iGBxtbQzQW3JW}4 fn^>k?3j+8BB;ThDN2Hu(00000NkvXXu0mjfOMvCQ literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/mail-folder-inbox.png b/src/Icons/oxygen/mail-folder-inbox.png new file mode 100644 index 0000000000000000000000000000000000000000..f320c2677f96d8c778e6327fecf42db21ec4f81f GIT binary patch literal 739 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6%*9TgAsieWw;%dH0CG7CJR*yM zqGce=SbMeU3{X(A#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFz0{fB>Hm z*Z=?j1Jxsgl`B^QxlT?_5J5XTyTZc4j*gC&mKJAc=lNi;bLY-oyLK&KzPzBIVBNZP z>({Tpdi82?aj~nbYjAKdP%1w^zo@9FwzjsZds=JnjHyd^%$&D)*2dGbSMHp>;pE)S zXXhkj-h6cF?yJj|uUNTi&C2b^R_?vJa{tX$K(KnvY7khn`p})V>o=|4 zynF3|YwI^`T7Tr;hK-vxZQHZ?*xg;H@9*BdXYby<`}glZaNxi}AUJ#b(4j+z&s;rx z=KA4lZ;o7jas1?|;}`Cn0)i{|PThWc`V1J{etYiblXJIUUA%bd%9SfuAH2JM@5S}U zUv2`y)33Lle7^nU{hcT8?%lh0|K+y_FTXr~{q5=NPfy=|fBy2#%a<=-y?Of@2tNLJ z|Ni~Q&tE=&{`~dZw{PEne*gZR-}j0-FyQ1%g8YIRm=)A@4Six_;t~=wYn$6wtlYcr z@|Ab*zyJRG_wT=d8*5@O0F~bIba4!kxSX7@Kr`V9AS%DiisO-w}oS-p#&+^(lJDHT*KTmIFY;8?htbA6f zXo12FD=RlY2@M^^rw=DTNS!&4m1QNHBd6WFOF|A0w`?)7?VjQyyT6Ag{O}SH?&1Xu z0TIV;-n@9j%-F>>*w@zP@-?k9HzV0Jblw4dnX+m@;-aP5OV(rvvp(r!Y;`@?D;d%FMt literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/preferences-desktop.png b/src/Icons/oxygen/preferences-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..c60cfd3cc1741a639a0384e5d786edb2d53a6bc7 GIT binary patch literal 2245 zcmV;$2s-zPP)~=s=~vVN2Gi zsscq(pb}MNYGq=n(z&FKWl7earx=)lrYl#h*Df4Xq5u|bJ}w%}@jM2LI;2FAn6bdB zN{tpg3PO#5fIjb<#V{>$3RI+ zkAaAp*hGy0ph4+?C=C)*Ic8-Aezym=ziNPQzzvh0M=;>j`|g~J0hqVxsQ9DlY5anT zsranTgWAUKa3F>m5`AbTs3Mwqv2IMO90)|57ZwS1mM-< z;?z+(K7XtpS9^JUY4;4_XlzWmzyd5AwoJq#%okM(K^6i;gHS?#*c%(*=(-O*r-EZt z0zv@KF&J?5>b>^5K>#-VQ8Xqb@eHd2%jrS>5XTP!J|G({H!Z0MMv*`&iBK>IAryil ziNv`C5=P5DdXq9qPh1=yWBawRbpJ-l#c}Wfg#e2L;I_4&PX{5cZBvY&?7k*3n}T za1EfL;WqppH>7|EQpg7(;0H(6&&?f;%Gb+bHk)zaos-yGa~`%^m(1e8U0;-0v&(jg zdXtG8LUlzZMkY=orKiLrKS8ex#d%{fDPsg2E+1Yya26(`nSkZd-tC4U#@cZBuy_>D z9gD((e59nLqVC#FY~5Rnrp7ws^NVwaH#fEPXaHvY@+|_u$Z2@!sTZ-~`Oqe|x~JO-FWK{vMi1V8r5NsjgpHMFV2x+M zDk0qO>H^2{NQ~pKqUZ;p1-x?QDi%NW6x!R{kz!57$q!D}9;`Z86b7(-m#8z)hEZd^ z&M=YEbHwss38@4@fveX^SnP%z^g!_R!lL$L|LqZ>AMJwN=XOXsqk#pZWlsr3v!`7^F~I3?lI%lKVroY&z2&G%0wnTT znk9rCuarU}^P9I?@cHGxfai52Yb%a@{1sfnFzxt`GZ_%*w;8;hUkK4I$bDv;#Ork| zG>M(@{XI@NNy$}KPry*sIwHD7ROqUa$wma+z0eEY*tdN>{Gx&WVI zL8E;bdIxmi$lBn5%@FLm90M@9V57tv4D18qiGqaQ`y^{oq5&hyhAjPR5#|IXF~(0Ka-^Ei4ub_Uzk>{OJO2kP7;I3HWD|3Y#+#zCN2laKtLWPFlEL zOd6Iz0T5>axSVbZBpMXd4!M9B@Ei+kl8L-OK-jOKq#&1MeF%hD$eaCr%$zj`v$L-u z$$u5^eQd*RH4g!wfcj2q zYheKT+uE^mWf`igtI^!tj8RFz z#wEZ~qSo)wNU1ow+l|_;xuFj~xR|0!KCcGAkTT6^wHkjG8t5{I0>1FAhOfz7Rl^nx z8LHfxvK7m+Cr+62?$H|DX}yE8vQ=t*L*uEB&eWbK+eWiv6J5H&UbX3IIHFz{TpnWH_P~?Y{tZK$$EocbME*0F+ez=sECq}DkAKc1rPh?+W8em z9kcv)>+PhsD=WE@l2VA0a%#`fbDI(~X7{RtzM_R}=Q7@3b@xx-%~R77GA2U~^`ZH4 zcf+4QLBZw^VP`DkmN1!9CeX%5Si{F{cZUO#q{P^-k&(evOI!MjWu?appDuoB{kmVT z%*x6t@p`?VZrJp@=MyF^X=in2dKraPmJxK+b6Na9^50x7?Vmm!V-qvd$a6nh{@&m6 zWgULZ;9E*|cJ{dK+qa*ts;XL0SXj6v5C}Y0QBkps*cJdPzFzpuROG$22Guj3z<5i# z1*#z6`X`~+7<_w)FE20OGHu$lXPcUu>MJWNE6CY?1Av16EF2-`<2zTQdiM7)B^YEJ zFKkzT%HY3~1frveI*Ima!M~ZXRx_sjA|J(P>rvZiM;-H!{u|?n%Hi*X4_W>N4iq$5 T6?v+n00000NkvXXu0mjf_&6?@ literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/proxy.png b/src/Icons/oxygen/proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..bd82964be2359fa1416148bbc339362ac1b3baa3 GIT binary patch literal 1056 zcmV+*1mF9KP)jlCByaOd`I*wpX$`#3y$ zhel)n@WIm36aW)fKtnj_XYKZlZl|lY-oMv6=jWQ9NN7Y}`{ns_O-pE+REkXjWa^f=&oUtp_iB0^;K_g~$mg z0+XQDKZw??s(%*!*kbU2l2Gz;1K+stdj#+Z#ODF&+rVu{5B?5L1U+$SKmvgfc<;Rb zo)J{!1lWQE$oBX5Kah}dg}@V_XMRjiPjl+=xFkcISwI$qw>dpAdqAo{2m*5BERk_( zK*5m?d%&Lseo@jJo=0ROC!lz9rGjY~n8o$NBY;Tn0=j_Ern+yM7V^2=FaajU8iC_D zJQ68^bUK6bwK6^*8$&jm9iDKRf=)~XI0SG0c?&(AMkbT_$O9}zG8U;r1Y*$uooaM+ z6w*t_;kwU#ejkGecyS`Zi~B^#WV+oh48uUL*TbOSM}IJghk$K6uw4SaF(CvB`2uRs zYOpK|OUng#Zn2`)uw53-7nlytx3K1vyznxC!3q7gB zAfctGFzMulZy!Fy8TBtLi-;KL8$Af64#Rptu)D&0;VS@T*JfsB9?j3s-*Y{(ySw}2 z@$qpTz$w`=*$J)NjM4)PcTpno5`@{=*@flh<$F{W-O%i8ZEe;4cXyQ6agYRKWMpJ8 zF)@KkrGk7uZz~_*A?gs+YPH8oiElJLn^X{AS8m>{y5fBO=Ix)txj0w0VOOiwKi1aP ze)?nrtE;Q?Q&Uqv0K-^ZT)bZ>6h=&$z~CZ*QrdzCM`=h13EQ??6pr5!K(Sc-Yhz>M z=PNZZH#axCva<4hV3>2gUa!NCqf4m^-`M2j^2L}h;?d@$F a0sIHGV8(tMA5$#=0000rqyLa#2nN%uuK~WU{&fRSowul;walZ%+(QVXM z2dS=-P@HwFQjwcCu2U!!jJbb8~Y8jg5^{p-|{Y5nya=>})g|<<_lRoH})i zQqkb0efw!`X~i^6L>$Uxi_(r3e0CeQc!qFDBp3`535n}tgNiCu&{t_+nNUxMNtQ^ zEDOUhP*oL4l8D7(D2hUJb2Fh(h;TTJBuT8VuTv_Ouq><6NZo@01^#EbuFK=X5}Czi z!jWo{G|(8?`IJr&gn|ciU02^KFl>VlZ=OTdMe3`PT)p!vQas2&&sW5K@vU;*Yk(+< zOIvR*O_8Tu%QcC z^wAXEP0$ylr{PUjtW{5I+ct`#OnYgnsybaM=3nMC`AnXZttYu54b#2j2(skkbm#lz zgd89Leu4Rg%Y63CCu}2tWm$-#IPFE&+uN&~=0@z>W z{c%d=61HP=Df=A&rfFt-dwc(_8GvP3X@Dz*-!NSZNsxGupQLPi?MIbWj<*~KpyU`& z*m-GgdbkffSMRF>peOkTZ*6~@Y<8pAC9BBD%ysrRyvj#aACNP3uspjbVXo`m0s0OE z_HixR!E5ouoV)fO`qB!rZgcR39)9@yd%m3fnsP|yLi2gBz;T>A6^554kgANMcN^bf zB0tHrHpNP5nN@umZ9Tu~6%NE+VVBZ~>$_eF$WLRp2o&2doPJ{ZIr!kN_130wEy0x&462#)B?w go<+a_*4<6WKbYACWl@6bOaK4?07*qoM6N<$f{#i=GXMYp literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/subscribe.png b/src/Icons/oxygen/subscribe.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d6a2f4d66b7dc3cdb44980a1ea10b5e36b8a86 GIT binary patch literal 1611 zcmV-R2DJH!P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00Vvi00VvjSzn5&00007bV*G`2iXV` z4GA3no=3+300qlQL_t(Y$F-Nsi)2?F$3N$FySlonn(9t#dtNfyq+l^~dL;mTJ8B?M-~cEk_}Mms%pX8JMRJyTt`?&G|& zs7F`#y{&`91BZL>`Q7vTeed`8J->6V0NC8z+~{;V=Y$YU+U$MZ*lGLZ`Sf^FTecfI!|VDxxmEL`NDJ1GFY_8fahCEW!>*I3dt#W}~~ z;v&Q0kSxm>3$4&CdQq_6`S#DRmJLEO%R+?{%@(;=P~JI{9L)HQxJLK~I>{V?l)BFvVI|d8yS} z;Pt<4vQ>6Sgd{C3MoC)F(}cK*YJ@mC|f3kR(Zk=21GsG`0VgfwC;4 z)~ZrO0FuPuoFmV(3f0~_yjOVdr@$xo<7$WZt`@+gcIfegC`&zMV73)SiF1}L%PKad z6y67h!(pY|8e?cQ8Vm-5sV-)lG0AZXthGWZMOjt>lx2Z)?hIQ=j8trYmpA#<*3X#V zO8D;iAF+~NoLN&5fj}qbn1MXcg%Bf$r(2#kaL!T`c}u=Ur}B4v`{UoC^f|BJ zzrhvvgOk8RNt&n4J-25y<4r^efwgr2a-4Iu`cO)b0i3k`b@wlP`N?OQOEhmk{0Cpt zBfE=^IIa&y7+%a?%%%*)7-}_O%t(ZF8W2L@TvD;w;5jOW2q`JOC$rf!cpxw*=15~o z`Ta8J@mdz%yIKHRYn*dap`EssWm%~O&IkHshCpDQXPA%X+GvR);_(y|@%r`aW(vSs zTMIxbH3m>+;4po_-Nn1yls9=}`_CjwlW2uelA+C!LQr_iPv&1{-WcW+!>1nm3>O|e zMQ86Lc|Y_QG(eiBXsv1iNGWPl5C}*luk63V^G|<+Cs#g7Q~@CcMoD(FZKM!<>Ec(B zQZq-3{q!N5I|sZs_ZpuYd{0bQL7JvwluuhzvB3L!4FFgy|K8s~CmPdGbmm$ZDMez@@-zeWHC5IV@*dW#edYzVyi^H(pmL))M7 zQ(U`t?MU!{XyV7j%jeeUwcEUPcZ>ZOhG)jnA6nGk&;!J!=2C9o4sq-7P#mU~mRofD z40%)ldQ9VN*E3zsbO9W1e_tW+67RqJ`GdtP%a8x!_xG|ZYmE!VaHs!MU=^@{1IqEe zpZ*z5YR(w|43O0HiA~PT)qIOL_#@A;M+5?J1oX$(Ngs@_#RvJ4sr49aRz3g#002ov JPDHLkV1l$y_LBer literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/subscribe16.png b/src/Icons/oxygen/subscribe16.png new file mode 100644 index 0000000000000000000000000000000000000000..a41c5d5c7908e326c41de193c8ed7ca25393d37d GIT binary patch literal 752 zcmV5r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00Vvi00VvjSzn5&00007bV*G`2iXV` z4GRd?a`89-00MAHL_t(2&yA8jj~rDHMNhp~ue+yvcGkNRAPWevg+zjch%J7ABXS7I ziO5L!2S|vBgn%3oAp(d%8xmnlBv|%hto829&c{x7Pj|f{n6V`?u5?vVU0t0j`TP9* zQ_AU=>uwxplSJV=hH(TSr9{_thzKDBRF$S_a?aUfjO8#4UxXM#=yRkUgDyH$1TBiB zBBE{Es(aQLqxOBT^Z8thy~>ml?yj00ul9a zDT;)s^hhfMmCCrQnCa{oee_v@E&3 zc#FYD=GXI}*Vorl6#FZ@AiG>H0jR2qAc1YWZ}68r=A@qTe13@lo%g0!S6A|auDjE9 z9n0m4Ai{|8fCrqv{)okR$({5jk;sp)d`BIoyuG{o-r?Jvoc94C1a59NhzOa?W?1tu z{z)}WJX=4dDGM%co-^3M5sk^&+1b6xWb%=F9z=wys_6TH5CmLE$GWYx?l$8l-v9Z7 z&u<@3`S#tPz6v6$ntl-ekDSOiRm6%6E1jU_>I3px^Ir z_jbH=E5E3cbC(_-hU;ixCV04a8!x5zl9(AesfRMKlXg zN+1Y=)nqc|v-c)LgfGo>oaFDrye-Tw^JRZL%AdyIL_h+Jk;W)sn0u&MPIAWm?5@~55JpWK3lv1TB zBdSTuw+9JX#zUe*jzsatZ_NnzNy@c`5~yX@JqB=wI2ApWdti}z z;B{RDw{0uzQ}e(Jf|_|m3Zm`E5rpbpz$g=PD=VQ-OH~#eNeNU3OaQkzC@tk0E@0-; zg|OUd#*MxE&~c+lae^iikOG}(s`>~{aYBRhf31=GgA zJY&U5L>t@SC@#V1_C~n(??;EX2?1X#+y_2H&*3T*mX#vf)Q&N=)2R6xSRlbdXT?j6@K{o7|vGghR$XKcd-VGH#~>C&9{>__V*)m?rdEB zvKrIXtVSpx0<6Du?3}akS#E}b%Y+<_Dmsr;(&5BEiG;NuKc`H<0pzB(kRGb85Dpx*$$!uLY`#ig3$;*1GrXm8BZQN z0ZZ;=aD-qu^fUKt%vFoUQpA3mYn0iy1R=7lx(1D239-~(AS@x?-3`g*M(BzkhKvmG zHZycN1ed@633ERG0_I6MYVZ-90u}YjV6kA~@e}a;(gl8sh*&TPITS`;TN_%B9z~pM z!G+J9D0ufhC3B+F;Zg9nRc<+*0KE&|$0OnOf)3Qk2ta7*!RWE6xOt`q)~WfRgeY%J zhPG2M@Lo=MSe6ZYcVJ#tI)b%sj0O-l2;c-BL<%GEqYpFZOv0s$-=WcD!V_DzAk}Cb zQ5gnfs+;gtVAGU|_5)8%%pkFv27p0DJsMWeN2i>?;_7;!r!QHmxzpk7kK&x$ck)b1 z%E2Jv!W5vx3?65j@hYV>fHyNOYY*gR$J&?8qa8r9rHJ%&>1sOLpl@*y(s1bcm9)cZ zR>yx|FozzR<)9xG&U&K=;Gu;b*<wdK`M5&OTswaP91$$v2d}rX00000NkvXX Hu0mjff){o0 literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/time.png b/src/Icons/oxygen/time.png new file mode 100644 index 0000000000000000000000000000000000000000..a76a31d2eca85e28543e44773eac3cf4a15697ec GIT binary patch literal 856 zcmV-e1E>6nP)%s^y>CCW47 z$4}Xs-SpzggFW9~KfMM3tYoR{F9@L^KN0g?hJ3e@{;IQ-5r zZkU$2!6jFeQkeGL%#DkS+;aRtPJenlAB-{rIyInBfB{l!n);@y?%5ND8_G);t*QXP z`~2)n+3S8@_wd0E*FcZiqy=;w;C6d7kL)dCZJk}8xpl5=IiEj@i#S*PE~NdH{ce~p zkYP1z=$B!6Av_|Y+Q=<0n+Df6#6rF5m@j^bLu=bI=yeI!ep zmKZM9G;}6>9rE0IapUBNzXg|w>kr+^N{u$=SC-~=Z&+t`iL)M#=LK79@2}{Rih7qJ zB<*r*?M`V0G4|k%{58?>$pv}a9h><9V_)ano&Eh^(+MFHXV08p==do)%B$>rs9r4Y zd3;3y00Ns$Ju>7k$+XT!sYc!xd}?Vbnx68e+BR(ri;0bidh_O0Y=|_SG7;J~qN9TGk2$IvCx=E-4*}<0=h{= zK~#9!WzSn^)dc{@@z4K%&e_h+uIFq=%jRlhi`pDHEu;s75`r%D5=B@K77|LMhcYtB zu_)9aeCwfntVjt2>7mQOAXr+9^^#1|9GtD`ZtZrqbGCB}A8nt9-{Tj40h@h9LxO!V z9temQ$rQNw4io<8j=*th8yKhw!#7%Y@2*Yv^ax`yi{s-m!^7olE_Z&Nw~vw86c}Jj z6W_OP-`>~P->3c$VnnTx?4w_de8rShOxK5(ZQP zN|Z|!OC5~hy?t0~b6;C=n z)zxm_N=G8;IHwSVh$J|ijD%uMd4=Yrnr+*49Xe*Zv@SC@uH(%k>N`8dd%G=7PDs_) zOYq`*G)E4Q?%sk^EO23`--RVK`hNN^?k3WC<(delcw71NvYRrn(QjIEF!*z;P z2uhTT6iX}?Q+l6#4nX_Phs8U3RT`;kCQ?HTF$&>1CPG%%bL18opHJB{Fr;&U2HSaeDWsC5=5FFCVs!)oxmmJTNUXBK&;g!bWF-JV!{;2kpSPBY zt%j7V5fT=NZ_tEgE_}eDQKnIe0AT%Feu*)BAN9$KbX`#*QJ}75wan!|7&yquoBWFk r1U3tiK&qRTdZHuDlvzL)B>?yjfS~`FyINaO00000NkvXXu0mjf;$wU` literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/unsubscribe.png b/src/Icons/oxygen/unsubscribe.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb3c694716ef833cbb900af51a511603da71580 GIT binary patch literal 1694 zcmV;P24VS$P)@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11{+C4K~zYIt(Q-X97h$0zv`-<|2t;aW_P{XV8wAng!p%0a{vVn zksyIXZc(s6M2ZqCoDwI_a!4dDfeR!?!HU9#tHr@WAaO$i2@V(&M}{2i07=$f+cUei zHlFF}p04V89D2HU*3*kb#FJXnUDf^GSHJgOb&nDeHa0f?-R*V{E2SuG`n+oF?)l>S z?r{eZ{XS}m-#c<%|r zkRS*Mf`GwbfH4N|J>L6ryk4*4y=QrO8DmW8Hwc0P44`QMy!SG8!h5|4fW>Z|+mWT) zG#qS%L{Wruj&8Tha5yB6V+Ml(3kwVM`+ZhdR}m3LqY>VFoO9G_HF~`sOG`^L!KVOF zB0{g%yD>jMzdWP)$29N#%-D4B;+_i^F61c?5#Q_g87Je99aMlc9g|e}Xt!G!ZT5^E zKAf+&0AOK$zLMM+L+{o{Y~3E9l$uDF%eQc#&C22e&N;FyD`hQKT&vZvHbtpm#%~Y= zWLcI2WLf4%qX=u=%#EE+o8MpjkZa>PYFZPG9idh@fhB#F?|r??_V)Ik-~d`{4jnqg za2Qo8*6nuj-tQ{lz05cP@Lq6Uh*M8cSB#xU2LU2N<^|_mrEmg;J_qd6mz? zrc=QFDeyf0(EWSJrvoNQGE@ED`?6#9OM&-(7a&QJROn$B(_wOWXCjwFd^q_);#j3LXi61+GU2`2l) zY->X$MMXZQn^y2(WnF{Olw2C-C;N!mcY|*%0{EP3y`L% z(mEhb)0rS?I>uU8IcJO^2=eFLV8BOjU*zD|zB&QW#BofLBzvAoHa8jfw`e^4@NNpm z%~)yu3RB~@dXwheH5)VNs{b&ZhZYZ|9t)= z*_}Hy-*|(p*(?DjIjsUnaL!c%RHB*~E@FdU+_-tB@Yic}D&%I|@E_sc44z}l2FZ7?WSII;Ax z$GHEkw?KrV^S9R4*jimJfs|5&VVDCfEiDCku4ff!w>xB6Mv}||)a!L>wL0x~s~poi zI~+WB4s+M`ymJ0L&Ch+7cx?@UPG^pOzn_1UUb=MY!@0S+PkEos1ZgxHcrTTEM6DKL zOh_E(1?qZzHjf|2e(*uQN@LJVOSsKV6ri+b@$_ltzV%HSjb?WC?AaqqL|9u}I{-8b z$3YOFwMJ`=F{bkT?&}BNd1vV}@4kCZd4F^wyBjVne7|?>*!iOuE}T=|ADy^&qs7G& ze?NKhH|y)`+iJfLhX2L>tkg2_2jJ6_p$s_w6_H;}=2w6}0>>tB7I^&2BESB>0GwCq z7r@g~!N2pM$l2+8{;JgK1fo!43%FO^^@BCI@8bD7S`92IBgT^o6=N<0^pK)bI3p@oyu$4;tTv&;JnqHVp@O oAO&I|dI7p$g66m3Pa=~32S%Nh($07*qoM6N<$g5Vk;Gynhq literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/unsubscribe16.png b/src/Icons/oxygen/unsubscribe16.png new file mode 100644 index 0000000000000000000000000000000000000000..2da2d8f596b382e0b62c5eceee1e4a9cad122f43 GIT binary patch literal 765 zcmV5r00004b3#c}2nYxW zdzB|0KR z6VX8zQ=~|X^HoqviYR;p)w0MnK=}@EUB3G8U1E7 z8gp`T^37m!`KzWE#%qoYA43QLBuRqz9%Bqil3=Zk!{JbunepB~c4?X#AFXROLJyZR zu+|bnpzAsSvMi&nYgCoVWU>N9#JCWGjMrP%G6A6Xk)~+?gS836^>w@1)46-abRaKQhR0ZI-KXZQi1A4Cvq~P$g_X)lSU_2Vr_dQXC2&lT~L_|dd)d)c6 z1DywJ63&X2w=-i5B8x!)A|ft?5Z-QjZ}S2lToV4fBl+lI>mcW zRn?1Qzj?#-+BI(v4i0Xs%BO8Rr|UXmgt9E?x(@FH)yorJ+`EU5k+r=&iX!Lq=`()6 ze;*wV&s|xT$$UOXb+Li>fvPG2aL(a|L*BV@gYw}+Ua8(|*mJ_Zq9?e6kdS>n#m6SuRo^TX!m=9V$hfg#HVe}~{NF5cDl)>_~H_;{;5I{G-7 z%?h)z(d|8XGTYzYem=f)=g7nu`M>(vn47>a23`WUfgJb__yYKn7$Zw$4VVJ&0^7ic v!2TFM`W_yA4!3|UV0H_x{0d(m!-anU6=!0OM@MBf00000NkvXXu0mjf9P3xK literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/view-refresh.png b/src/Icons/oxygen/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..afa2a9d77403a12cf6808fd4e551f8582e2599d6 GIT binary patch literal 2182 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 RsA~WK002ovPDHLkV1nTGQjq`v literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/webui.png b/src/Icons/oxygen/webui.png new file mode 100644 index 0000000000000000000000000000000000000000..51a98345fd907a198cfa1de975ce0c6e0f9262bc GIT binary patch literal 1577 zcmV+^2G;qBP)$sLh zl)UguYxdUJ8m)i*>tAQj@SvgnH*CP+{-Oai4Zxn6nfa@(>*Gn1+@Gp7jVOv!XcXY2grFDsl#M||h$K|IeJ2OI-H*tFwb zpt#;(qZ+ebhDa3MsI(|5McvSt$!}n~;g);`Kpe+=CJ=^kJCxEeP1Tka;Aqa{U{{N5 z#sVPYD16z=F~4}WkFE|I$<@vY@R0(!Tn?oapM=$7l?$(3XSEbaWg(SnNWIyj*=*9^ z=kcY_4{`d`LrAi_VrU5N6kI42wknX#W-$zdyCI5V{`ATumnRn)8SP_sVSz%a!Tf?q zYU&Wj)Povx#hbi(VU8bu|8a5you8my$kNgh0O}5boe%^eFa36c>$4?}9Uq|gU?*nU zWpN`Q@?3Jq2Z=38$^l5TD3(g>q;WU z@aTTVP7E+|sGE+g!~TH|oQx|iDpRiq96EA<=U;e*{9K70u-$}r!)q6>vrwp#?MjjE z@aWs`Q*DO4{?0tJixrwdM1L4@>AeMf*JNe2ik}W>qR>Q@^S}HXzdHXl#Hc$dut`9w z-PZS)|2T>3yCk~e+}We7)gvm+gin3gih%~rR?LMrrZG|uL6Xo?inVf`x!a26{0c#< zgG+Dc#h63el$D%YJ)nKey6;ad%G|CI%ku*VvIMb4geGf3SEq+B?U@zsn4aD4f1*GO<96HTSL#AQDn+~z#=8@co**|OcOc_M z`-=(OTCMSCX~`E(=2&lrOx#$fEN54XO_5hab1dW&k_2T%n0i8`7KjlGIHrbU8`~ye zR|O9A`D8qks?sP`MR28f>F+a~IJyrnZQ~gREAAI)|~h}UaPuD?HxSuJz= zSRamK?!5({do)KJMp%wUm+w&6XmD(>gUd@*p8LuXQl7<{wBgOUb*{{p+82|D%|XNB z%IzXr)FS1&oE+=hW^iD46ZZD{oO^PFW~0T*YDHXMM`;?LeW;VcZWr6sNxLSehB`Pi z+RON8kDO(>CS>9;kpM@|p+d$| zJr-R;WJ)RzsvoMP+Gaj8*2@pR_eD0bCl74miN_D~Gm-n(f4E8_#R%T$$&0zs~~^VWQ~u zeI6d}<%x5n969L2rt9ww0dYS)8Jm=?Gqf+omro5)lj#Vf7(-Whwn^GE$vB4W4Rp14 z0<>DKU5VJbL|UguBEjJfHq#}L^uM$fQYx7aPB?!c4vPUlY51vh(Gu- z!!X~+@1Z)M9M46UDVd&PasGYISOZ4ug=&V{Lf_9085--WONn_sa~LA4(QQsysI zk3jVpoVo(FdoX<#)*iyfJLvp|ZU~t(M+)?zlLlzf9vI-p6F7etl3(!VBGjM5>?0@w zgzg+<0Wct*hem1efa5ionTNUeaBUIl_hD-dF28`1D|;M_0kp!1)~@5PFM+S%+#R_3 z68^k}^=EKl6{afCja?HhPS68U8a*7>t&cGG0UEC$Zor9~5Pt!s;pprTgdQ8QR%o=I z9G4PELNH~>TJEiIc(fDayP*`S`E(|mKD6a28;xomWMN0u?sPsGrBEe`%GN}!blFOE tK}C@#+BtUiCdDSUQ6Qfx+wJY{(m(KdvgaQH4Nd?6002ovPDHLkV1fgG{9*tA literal 0 HcmV?d00001 diff --git a/src/Icons/rss32.png b/src/Icons/rss32.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f23522ac0e9eb4fa7845c01807121e0267fad0 GIT binary patch literal 1331 zcmV-316VWIO7lK3!h=4p)gdn9-+NPx)rqk)n zy`PJ7r}xgCnYJcczvRoD``vTS|NlMbszaN&WBs$+-iLy-WzuCz7RGsIJU|N>`_rOKzJBNzT zLN0z;XT0=HZSo`Fj!ho{fP_MB_h^H7;JM)Dry; zFVKSBStqn9Sf_M|;GH~?>T>B9` z4~fmTT>!w)RY(^g(NNv1rX{duH~jfET-Xb4Hbg*yNkV)EIB{?bwy?#6D=8Sb3@%oS zMeLYj1c1UQWN*N2VDB=>^+J6M%zF@8SHhk5LGwyb8soY3mwzOC%EOCjnMOLY0f>$2~^Or z#9fT`UAJ{E+OeV0K*L;^{}8lwKr9gu=>Gvy?Qs6Rpa9l=1c`bZ$1vIGb69;Gahzfo z2sqm2Qv*A?gHU+|7&r$%?}n}vkcCq_!4X)x6O!{`#oKV=<JR*a%EHMPKwNv<{clwbb(t1%96R0YDAqa{uU|YFz&6%z zZP9OlYTpDtq!E+AtBF~Q2y}lB2UZ1rZT!PWx0Lt#tqbs#Dj&ho;ZsINAx;cW8FVf- zbEM!l;VtU0|JmX8iB7jlbG=Z-9wp-i;NHTOj1A_<>Dm#K9vnCnZ!_E6p?YdsSK$4A zqNI&P`x%P1S163*-Vp(-@arsIL9Q!HK0C(kbT*|9KST4pR{egmzVRuO&(wNT{Wzs^ paZe^n8w#o>Gm;%mb={Cx{swKT>o2bE-mm}w002ovPDHLkV1n$BXXO9@ literal 0 HcmV?d00001 diff --git a/src/Icons/skin/connected.png b/src/Icons/skin/connected.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3473475e0814e10b365fad658e487b72c3d799 GIT binary patch literal 1412 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 U_9p`|kN^Mx07*qoM6N<$g6?l{VgLXD literal 0 HcmV?d00001 diff --git a/src/Icons/skin/delete_all.png b/src/Icons/skin/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..513872072a1616a6f5772c2ee78aeacfeae48840 GIT binary patch literal 2492 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 FV1g4{z=i+- literal 0 HcmV?d00001 diff --git a/src/Icons/skin/exit.png b/src/Icons/skin/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..efa39ec7ecdfd3e1b1d0592f38441b068b482e70 GIT binary patch literal 2380 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 D0IvbY literal 0 HcmV?d00001 diff --git a/src/Icons/skin/info.png b/src/Icons/skin/info.png new file mode 100644 index 0000000000000000000000000000000000000000..cad70739c415e38a760c35712424152d5361c6b0 GIT binary patch literal 2211 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 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/pause.png b/src/Icons/skin/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..022d040fcdb00ad7648b21a2fea23705801d195f GIT binary patch literal 2131 zcmV-Z2(0&sP)U9 zfMX|K+3R_w?>e6UZ6VdDkRJMVz@SJ;0SNdc0>fgo2A}{akSxLbWGRcI-^6kFtCJ_5 zxqR0FVAhX$e);>t^^Z#FgK!kMo(sE%24Lqv4-EBIpto9rO37vYPL#k#D}uF+HY~5V z;QGosq)CiHq!>>OItfq5QSdXY##?s`;F%XsKJNOJ=Y;YPO4r9qyRh#wBd~XD5Oxpu z+N?#Md10|;3|}m+HsSKsRhau|82~GxQx0M}i8?R7^4zggT?63EOVyVpIu|ZxSgFGO zpSuU{8y`lWVyo;zh+A%($pf%A8ZOMQzz3JFL#NXMNFuCCI30)W9~3LG6#(sdsa*Yq zaLY#}I#(zUOzg(&huEQ@#uJ+X6w)uaxBqz%C>(p?(=PvEJ2V*0HP#^7wrK=0jy1B;AH~rF8ZO1SS?5gv#wd)JeTwk%yw_-6+ z>n9sy*c%}%EUjR+8lUQ;UY7j}wT^F9fR379sr_E6$|zs}RDr2`$6y2-&a{@`;hnhm z8Fja@<#!x-ceMredk=5`^Ot7fp`o5_I{*B*38FR%%Qu?v-rO~8$N)?nVLt>*VQ1qT zbVTVq0iAO`YS`@(n@&0|_?`zrY#@lRfr0?ib{o=WlUKT@=V_)q$>AI7mtzJx3cK}V52>-hN( z9=pMvyFg>Pm#!^B-4ok%f@%%4zXPHqgOx^rPc#FS-6K8v#+zqOD}q--IKc?#GS~=k zV7-$-9|n+xShC0gO~%s{RTY;#z~?D?=j(`c#4UB4M8igq-J0*KNK8bJywCJ^yJ^NNvElVO8JwC~17z}JbhO(*2uNYIu>n}WC0CTjz6 z(6_WxEys2$(E|g_V#tHgSlKfdwhrV-Rb`EVAKDL-1CuTv! z`oJLeC?2U>2b{$4VuZz$*$*$lvTD(J1yw3RslOlm!9i$uQtSbX4XsW9VFNQ=TZ8cC zO-Qj93>ulexD4Zu*imJDnA}GWWqK6rh7@R#`w7@qtJpZT}X z{0)xOd$;L`f*sMtk7P1Y7^$M5dMB#F-!P`Do+;Qc7Q_oMZHbH|CS&hV@K_maZEMur zHUzeV`r4T8YPnq_4BOPyFq^(8S#7RJqEVK~XeJU27RHhbt#6l|fsBnB2BU8N$*Iol zU=nQGk`|hlNZ)28aX3aNW->Wa(RE>}bvKSdXanYUo5io}anU-bY@9HWm2_GXfg}#c z+2cbFf`r(Nw$-?G0OUNc(j9cjmbI_hvE_}~e2Ts$u~#CH%;9nYlX5R;nr_so2(1nd zC+com>7IOMI(J~Y=+Gb2vd!!fE66@dmc*yXHy=Y{uhR9NG^sO6keMN>Nf&_w!GL;! z3_`62PLA_*uk-Avv+4R)I<}8ec5IN45H*98x#AM}{1hX4_N8CHr2NVc4PvxVWuygF zkZ5G?+!?rfX~sfy0Yt|4KM407`YIpV56->`3m=}_+6rwO1jZ&NVc*o3*l`l#h)x6S z`~-oj^V6Rn|IYDGF(RVQI2Rr;QXi!bCCd($ZDQ(C*#F>R#&&$q&>v0QMg| z0{gyjn7f@%QC@b+JdKej#7M=GHi#4}VbaqP`sz+f{mRR@wFfgC$&OcsQneo(*W>BM zBb6ta#db^23V>v6w^PH>o@*?7)NWt^9n{vK1WbqBNGado=h%;a`E^J6&l`}RryZ7_ zkK54$3Rj6-(V^1*e-Z zO|>nd5b^JQ?1^t3sZZShO;xHqlEx`lLiyAe6=cgki&PGi7t6pgTO8jR?lqM=!HknA zz!?%C-BXZ8!8`L8XMXqA>%aXIs&C{H(wHIV^z){SQbp-Q*@4nupO`!_`S6#&HZ)rQ zBK|z9@{}MFq3jWpv?av=IEaLUptCLsDdVWUy0q~3_y6(s9~S0jW>NJf$~sB|rA?%% zSOE%R0A&beaC1E{b?DI8-UCwuBfIx_rE-}Vll^h}$q%Hhf*QO3Nf-oc%Zpd8UY_ZO002ov JPDHLkV1hfw1y}$8 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/pause_all.png b/src/Icons/skin/pause_all.png new file mode 100644 index 0000000000000000000000000000000000000000..5c92e5e85cd2a4aaac7158f7100d44dcac1654c9 GIT binary patch literal 2353 zcmV-13C{M3P)& zec@jARi6al=@(x6vg`U!XyZOk+DvKf;4O_OFx9h=_puq-oGrbQr^)doiQahi`KSK; ze*rjr^p&liSNWdf`A;fsno4`{>yU+M%>WdAgusf~JSSoR3?xhNJGq|4(Qo58{PnS; z&s@4^0EqfA&#(SKx&9%oeNv7g*K=uNbeJ{__tEG;jRxu!s#RQB--!}xtwnUR)u#F7 zHJV#krZkBGA_bn9@+3SFN5RjLjkiA$z%wr%d))PF&ne^Y)2@$9yR_rJaoW0Rgf@>2 z6j7@(@}5hvjg>D~7gy=h>>^#5nI}Rf@>D>aN}|q-uRM47_+0@=G@KjQL)$ka`cZMHxbRdLKu`ER?u)+?1k3`&`I$xf*Tt(yL_{_TDT_NN!l3;y~W*9~z^+!OsAI>;mARi0#@ z>j1dVrPWaF8UVE8lJ9vG#FpCa4%M`xDx$8r4uxSrVH8l+=;9upb=qrimJ5gw*9buP z`j`JKVvn3Ez6T0HVBE^s8-AMXlYKk$v|+njss2=(>Y#SfR>qgbBaJ#)K2{~yZy?=J8O>X}oxsy->09x%fgrkHqYzSJWwN9I=h}ufw z;n>(!&dwN6POTs*i`bD2aBJedDfVrI+e?O1U^u0UYpauy=Vo;7+<&R%M&#f~LcdC# zye1tG;@k;Gks&i@&tId){f`vIPem5G&IJJWqLM)^fE2z^Pw;Ju!J_4%R$7oU08aNx zkkZ1^61Apt5J^G{%Fw%ERl1!@G;#kf>Yvyu zHK9-|e56IN1rP_mO)=Flr<~JT7n}m6og8ag~re~4jvSzkF0g* zN_I=We{Exx2Bs$E`|qzUV2>?wWC*Wxtf=b`AhsA8sa;~>hsw&us)A2~5DXRsl7ZCm zDTojS7PM`L1{)3VeMZWw&_!N@UB>!rRJW-F60}#TTJTfJTekF3l9^KD=B{J1hwBv5 z49Y}lGN6FCOmmYVhkN{2m?-{2b0aS~qT#bZZNFP_CCULvSzV_p1v@jq^K&508>BeFuJ*8PdvWDZEP!0tMHdZt8Qt_KX`DsXn$;@{NYQYm5vrJLf$29d&yFqQd$|>3 z|2#W1YQTeBOEDKxbcF93xyR3>l0=quqlY@;{b5-WA7|gvhOAz->wVLvPLnA!OVH~s z7!hP(Gw{C1hJ0Q8auN2AjF;V^Xg-RmZ)ifE%?5Ln_*f6{tP^sH7=b~Mur#AowBmL4 zd7C17_NCvvWc=EXEI3-3D#Qn7I0}hJvjzogV}!0by_ok&Dy# z95N>p=jS*=quS9lv1J!EVe7⁢W^9>%dpn)6S8nP)%tJDVDTJ@%Xmsi3q;#E=v8{ z%Q)hF8TigYe^=^*!Jo(=Zk6M zhXdfEMw>V?@g6!iK!np z1RI>(zGvs2N56P*v^n{C2-dnx2^JB?D+|)x4nRO80)l&8voMLH_Tu&FcR%>YU*DR( zaONzQ^2}a_t-#tm+j=v=AckS1u#xU{=iUPcHf`OxcX)jB7OzsRvSR8^pYH!B>j|~R z`6poz+?>C9dG^xT(`QegJc%dJ^|aV?U1H~wfjeqI_hh8M1T?|Z68=9owsCTAV|Z+H ze`B~&>FclfwLU=-1#5Y@x*D#oEUmPb7Ovj7HhmiY|A|M_u({IVYUwnwQmw`3e*z2u XVt+tGS^sGA00000NkvXXu0mjfyK0mm literal 0 HcmV?d00001 diff --git a/src/Icons/skin/paused.png b/src/Icons/skin/paused.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0e947b8874fc39ac19eea1c6ea0ddb93186cdb GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5ijs@2Ei)J&MLyV)=I!t&n)BXu z?+3Fy0t0fD%#U3;@=K!LZppsvp0vh{zvtQ+m>E(cdjBgX3mpSGkHOQ`&t;ucLK6V$ ConNm2 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/play.png b/src/Icons/skin/play.png new file mode 100644 index 0000000000000000000000000000000000000000..828d4b730079f57d1ea5dd2bdf1f214252328826 GIT binary patch literal 2391 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 BnK1wW literal 0 HcmV?d00001 diff --git a/src/Icons/skin/preview.png b/src/Icons/skin/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..d44a256f14dcdfc586d397109039375480fa2c6e GIT binary patch literal 2649 zcmV-f3a0gmP)q$gGRCwB) zS8H%o!$ zaYifBN{bzBXY3CI9Lkh7U}I=g5=xX{(1c_X;wBrC&1JK@XZPIte&23lRH#ljyd21$ z^F7ade~w_=HonQ{@uvONk}R*2BzcV}Nh=@-<$w^%errcz+x?blcA2KpVH(Dn*PC|q ze3Ns9uOqNy&+B(6ierl?E1Mz8Wuhq2QzCssCd|8$onxD@EoR1mW$4FrJ$-n8|7TnRRrC^7;9K4)NaQ|Z^EkpbidLc~QUBKnA#Ngv8& zw1Wqlp6L6=1jy@+s>AiPpg8UpMF#{)hN3E1SXh8yfft2&Zsd8Ka61)#e=@BjnaaQ` zo7lJSS17pQcDTHGM8be&W?<>s@k~1PGDV~LYY9BD_rPYw;oc?4jy0m63SHMxUt5ih zH&>#5SvlMuADAPu;#|YdW*FBbz;n*RPT&H8(*sz#WFaaS1&}dpG9Y7SEv0FQ4G&;( zz=in4RhWhjMNu#^GJ*^d7#NCR?CKbQc4=8LBsvRZbX~(R7}i$^u!7?`S6I$fghK(8 z7Uv^P;Il?;hJaT_|Al`cF)_lQi$o%jBq~lyWo&X9hTuTlP+>?Oq)nU7Sb&mXAwN@; z$yDdv4C@O7SgWyWX9dS{F3^nuzZYqJ795BUUx5*iqR1$oD`b0u)y2AQiIee3)U*5nz4JTaBt+Bm$zOz@e&0Wo*i` zj67i)rw$*2&mmxPauP#BLkNe%=ZK`m_^wHLOO@#ZI)hw`2SE z?flx+)deSc-7^@4>JK4*VFgsr0xD3O3e<*9W>EM;`A&XK>n5&FrC7`GLB;2WZ51E= zTkCO|jaN3|1U}&uK5Ukj6r%Z^S0U;%@I0~&XU??3=ksyzTRv!oDSMIhlp|PG#ygQU zGV_{x9TU+()D(L_Er-9hv}5(g`!Jo-sdL%nlz0SKYtlF`W7r~}?YRj@@uwRlg!62C zdZ7b#b#+K4lNcBnfIq(g%`I(k7FD3OVKY2|Fs=?qaN+Fx2$~U;h!O1j@%_*vAK_c; z>v8fg$MDHV?K~CJN%A^3K{*lnH>DgoY_?cL{-r2nZ}`)RHjKs%xX?9{A>gbOAAmRO5>$xz6Cs=>$&3NNC2Vhc{?AWmb&CSht@4ff%(D&}cL_Ec# zBZvZzfXKl`zE7xoR*2cHmYeOIort268?fOXI-F8+;`Bf9T;tDi@YNS^_~0+$$waZb zt`@s@?}lL**tv5jPMtc1W5XAf?==_YL5x)nVie@G__gdpaC1o)bVPkb|!v+L{K|J-;Q#=B_y}ek!em(Z?-OG!uVM_zr z`r7coGY|exL6ew{VJbGv&tydAu$Z%!-7hj3l~pnf*vt+Kx=HYb@xX%*;+0okK_-*Q zK0NPZ*%m5_EAaB3eR#X|ZLGd?^>s-MeEc6elRAN)ZSfUOfaHkLB{B`irxTM>c5YIU zIZ06X1I5=pG^wS~J$?zjQ_o6E_*DYk9dxEee{zzIJIut2(IGMc z$uu1Io_@(mFe5dyxMtP$38a$fndrgA*vGgK>%!&uWh`I60=wR6#Jx{%riCNVBXBMo zT^41AktH%fZG1**fB$&wM9aAf8o{?@$0c>F#QIc%mYhM)`Ic)E@P+dbye)`fZ5WY6 z1S82PqGWOU3D<^k;~h65l}KT{f1Ia$?WX(5sWfSaG^v?1jEwfyuXla_kDMk`ucD%E zwGFA5jY(6diKU3tzss*1fr*J2&W)Z&MoROVk=Sz-IaV7qa-g_KLp~aYd&y$dhPJ}i z(_ESnGK=mA!_2iIz@+mJpa0z_!8rY- zj1sgAmE-OgXdJ9DsRks~g-ho?KsuE`Y0YXZs#p%$=|+5V6lXi$ zL~KJBCasBVO-Md0xKaxFLI4$Ix1*$bB^_=dotPp5NlJ?aSwM%TC4M?zo_~P=g;98H z_p9HQWJjY7aTV)aQFTxnyj0Z=E~{vVV`g#!XFK0Q`mTOxb_%ZO0;nH`5caIX!X-6u zd;KtU4Z4;f&(jczh$PtObzR$Y;JF_hwdaA(zTS`+AQ1#G;h(p0%R?JVtCw#lZ*MV3 z4zozeR0|}lN!B@#j8EZw_n%=kj6=AX2jLShmet>hf>4;{7dm;&>c*tdD~e1-pZfQ} zr(J(&KKv%VG+;Vs8kxy}+3Ss)%uD7cThQO#sl`Tzqb`?Qa=AS80&1x&kGhuRN=KlL zDQOO*&RSUHTZ!rwYkBKxGn3FLM|hz|C)wEg|)k24hNm@#s+hXMLACFLlyx z2DJ+9t9jQL8EY-`%QYb8BErb{a)cJLZAthy7cDBS^A{AA`1}Qar`P9nxV@Z7IyGZy z@wgVBicL+&t`3bx20ID=9DOxNHk<>D=RkFvFNEypzXA*Z-^;=MEGIW900000NkvXX Hu0mjfdJOha literal 0 HcmV?d00001 diff --git a/src/Icons/skin/properties.png b/src/Icons/skin/properties.png new file mode 100644 index 0000000000000000000000000000000000000000..e6236675f129f3fd1a1b8eeb0eb6bc84acdf8242 GIT binary patch literal 2452 zcmV;F32XL=P)=}<|yeCeagg8ypCTW5Yp%4L56AFq1uTX(d+KNg%AVH|lB+8#w!cR+}ZfJk|7-3(m!mSfvPwrvgCmi56K$DbMf zBFrO<~ycYee?Afo<9A5 z0XTa6wO*gk{~gt5JS7w@EfgR5RpF8;3IhI4sy*X>ws=uq%D!(~# z{MoTj41jih&}Rg`FLdLOq8JdW2HmHlttF1uco;3wAfh2Zf_`0oU#gl|DO9nrQbcC4 zfSK$fEVD)+EW%TRV^#)g)$-3N8t*<3z_Tx(cv3fl$Ao6=QFMbMtz%193cVc(bS9(T zu0?(4Yfj!WuDqC<&tvS)JVqxo07b&FB#1$?T6+1lV@Kb)F95l7f9O?(oC}?H7!09* zQ#-czB*~{(4Z9HHW7Fo=0eCkKhR3tGGB$%!sQ{Q&ib`d$Rw@2)Z6sC!aL)aK&@Y7^ zIHZtsjcjLMC+)sPIuu-Zq5)vd_Ui{Nj^a`dl~NwTXcNNG1YvP7GC7a`+?b+3RN>M$ zcC9o}DHoq>)P&MlfD2CMT<4to(2+`@JKcn;<*r&yn&X{qN192N&#z$W<}hLb;IW6d zBAc1=#KKr!&SN1vhs?|!%ubEd zc?!9Od938~sF@y+a>c~0tCx^$3ZuO>fq>t@?43!>5s1Zw9P))C5=|i}1c1Uy9pr=N z^FPHtR{?OJ%T}XmR|o+2c`-MGuu?%^dldV(cVd4(rK2s3s9Hj8IfKbtBdD4-CdRHq z7bcpcA!M^za7x3vi%)e%kej^?R2ESyEXo#^t*q+YRcZFgzSRs``*eTcCyEwmQgj`T zP;vfme?}@`;TvCj0`aB@bWMdr{jE@usjwmJGC3Z_(B<>EF*JyMyC0Ty!u$}A$8q7p z1?+xg7q<6pKsph_z*~R8nSZ^H&dm?Wy70QiNx%J%e-3C&ugq{lGMtXZ>@@a2vefTgrIY}TK#9}d+wHh{W=)%ppGM4fs*tU&Ir6Qg4H-$n$J{ubw!_J*M zv7xI&)=qA22F=NoY)zu`9`>zBZm%;OZ2>C_SseMwmr*H~WsxM4NeQI0vlFRQN-oSh zH7zEeB9@kxQ6oUAs$zC_R;GXfRI63=^z=wTs&H`R&=;|i%Xr-+)1iTVYu;c{KI<&d^i)F7M>7FCd(a|BlE0szZ9UYZx?%lgrzLUKx z{qSZfnRHE{cWB;Jt8@Emuirg3Z{93-!+`SSEEeOIsSRS0DA!Z-`1rWAnVA{sm{Y(zG))twas`EAQC{;gJw3e| z0ghTGlldR6^nBFGOo){7pm`k(2C-$!7PPmw%aC%bF$lJ5&7??FxHA#+uJLP zSJSiy>H$rP381?%QpG(K%K&&G-Wi__!@$Q)P=0>%=1rVDc@kY+U5G>?2m}J_Cm*lv zdh?<_yfO+a8SjqF;hDaEac)2EYfl3JMG86Z_TJ;_)vFj77(jo2zbr;BR_=T+*=yUD8;ou=gLaA`LlIDI&k2CbjqRSQ0qiie4WcJdLi`rW$~RodlrWeAC{?N zu3+ORa91@VCg6BPM5M;klH}Wv#u`qg2SO?tN2(ewkVGOOiR3!vaxODRxh}&;VK#`A zI2ATUiWd(?nq~2Ei*hjz4-ZRMkw{pA;kw|pgp9u9Nj53nSgcrs8Vg9)aP+W8&_fP2 zSNGIH2|sx8XPBN_fF5o^ED}OnG6vNwpqB*7jfpIc-2_q_G@N?>LmYhkv$#IBh?)5n zWEO~=ND*mf9_eHphrjd%S*!}T9{KQeqdjhsZ}r^if!tr;JKsxGypQ{o6EHdY5l&yY zf#r&e)TT!fYEIJ_4P*TFIC2FGZEbBhcWoNYtz8Jl63CZLG_|C0{>p8L5K(w6i9oCs zYOsYikRw1#G*xF|(>snLED|TR${&Ay?7M%GeZuNh(S2WcEj1mBx8U-*VVLDSF{Xxv z@hikniVUHq3aNbme(D1R!VxUq8J0ccH&k4_JOrOVfc)H;%(*m5r$S+$n4G{$xeePM z?I-6_E6%ddb&BY@SAP47W(0ra5=RRy0NtP&PWe`7d@6#*w5G}QcvG*gkQ#chPBKhB zd}DJ#vmoU>Tb?E~D@8h&sn$$bmC{dt@%*=+uk(O+uym%mu+vqXLtLS}G8d<2(25GH zJzA6o4%4WjlJWgoVNML{*skm%PYrXynH*|qwpoNAFs^G2RLR%dl?r^1O_N{s z1>g@gLDhY7dflC5f?;^<-RNo=c5X4RomoFPqywwPWdcx=fHi@^%Kb#CH!OrW`r@y? zs%pjyE|f>8At?<8r6WxJZb(^0Gn@eEvMw6IXNL2_Z^4!!H>F7Bu(KHDI#7js(KIVB zo%r$h-gehGZD?(dt)GmAfArvyZ+*VIum78xKe*4TSuzru!F55jOrn)d(Nrn3JOxg> zwP-$2t~uN$?bxiANdcFMxHKyI^1sJNhW_yGo4-FrpRd%7W;ASe&i~#pX@|&SWX)tv z-F-W@?Rf0K6D{fPPm^E`$tl4if|ac-NNqg;3Br^hxYt>}(Z6NI`PqpNKRWx~$%)aS zYxL<78B^#ovpQLMZ3GxZoUDZ`(Kv70wSRv{@3vj>ROd!&vw#qde@^d8ht+_(Uj9vz zQwy1?TX)8;UAlJZ%o%#KKsLYToMY!Q0{7H_vL+&tI-oY5mgIkTvb}p(ES~I)#Nsi3 zIN~>gVTq(#E;yBZzLHK SX`1K&00006UB& literal 0 HcmV?d00001 diff --git a/src/Icons/skin/qb_question.png b/src/Icons/skin/qb_question.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf8511fd2da277bcfc09f3460680cbc267e8bb5 GIT binary patch literal 2468 zcmV;V30wAwP)+yNdz27h{q{N%NbHBOwobx>A zJ@4{dLn(zjxpwZ^-(}hM!jQh9y?Vz4xa)1nROb6eBDLKzQ!o<=q*6(=G}NNGt`ZGZ%dk9~MkZzJ@kPhST)u?K zxdO&-&SUiYG+fs~=y?bNm-o_9*D3y--Z=J&1fJb{;ITw%*$al9+H56KFzh7Oq!CeHtCehm_(2GtMEVA9 z;M|pKSXh_`JO@5WxTXB_OFgkjK+Zg!$?h`}ne8UQ6SR%pZRpN55Zpp4VPbOP8hED2 zwXHxqZRs^QGKR5<8wd>>b&X9VVZif!TpYTI)0c(_?m&4Z&MzD-74y5xF=3V$kbsjj zH^uE%60Oa3$Tih)Cy|SA49`K1h`j6yO`rRICZ8^o8!2P z&)47G1*e$DERQKr;su4enhKaC06PK6COesaS}+$0NS;fo8J5if9Artn#jkYqLp$i(Cn4!v;%)AI$)EEI6?jl&ok9bY8T+1`eMfqr~AG^6KdlCpbljNk^> zCQh?p3br+Y#;!y<^HbB#R7<+SPU*q*RTUg)>4+ch{}|mJt*Ec5)&=MHNB)deovYE= zwHl2L^~h#3c`1`+q$+BR0%NC%rK(+94DodtZK?cO>+mv1}`IA zC^91qbaijwt^#I;g~9$SIN$dXzVgK{kU*#j^j^Ax%9=V9-B5dAwn$>8c+-R;kqFC% zVB1k+G4)F+t-@3Yl)L~lMIV(U;M1*jt*epXZpD0#k?i>BgC3kcbqdcs^<{MCS`dUj zZcfkQ?RQS#OJDs4Nru{!Lc-utDnm%fW+NgNvF)gcgsQ!cjARgkA45-dwAySkE5FD8u0ALu1{j`FAkz{ zIeWik^x2rO=o)D+55>G^3 zPti01KS2NBD5~q57kBRX@-8yHhM{7;5MmKaHWR9TTV#}}g3qW>fEjd%2?+a8G9zLe zDit3C)3Tu%SNl%jk8ed{=i`A9+`p|!2d%^E>HDE3s^`f%f&32j+9F;c#fW#xw_aN` zoW%!*s2LSkD)|jNc2xu{X(}Y7H#D}aVkQ`vx-q8r^0n{mW`whJyRz$0kBQtLcQS-J zkhEgbI9j%ea_X@~K#GRr!*+uYl}bcJL{{m#5JfCKtu=x4dXL}@t*g-5-l0#{^JV8) z)B$C175|pC1XM@}aHJc9K?d-e2Td^cWJ;7psklk7Ym&%t( z+9=Il$H0XTapmG!eFUA|>#?ePBeK;E`WRdt8=RXZD5l$_%$lgi6XvaM~$G5zDYo z512HUQ^ehWIei+xdi}7TE2Xz%?R{J$&@xQB+z-oO+5#^RgU^-nk2=J!ZF}NdpUZXK^G!Rw>_Ol4wI}RU z2J{Yzq+>Fc7B8BB#01N)PjJsE@+b=WF7cE|*zld=dxMvHe|zlB-yG-gx!6jgTLqjF z1sPhFRz<53nV;)gw`Sb~TOX}&&V8DKHLJUXhzL9SM3W;~N9LkRgOiMeV<>jMlsRx8aEv=qbSH7>=xMfRg=bDYRO>G^?bS5K; z3Gp|fvE&G1Cc5BwrDE~s#7O_>)eC1XoH=oVZ*I~im)xfWTzlX@V!&MDk;<5md<5i( zzp0@mx3Q|Wp{=s2wklmwnNBUM&`g}-LRgxgFU`+R&CX5T7`c9J=nV1S=c^&wSPVEH igL+CzZG8PpfB^u&s;^GCK{{#x0000_a literal 0 HcmV?d00001 diff --git a/src/Icons/skin/qbittorrent16.png b/src/Icons/skin/qbittorrent16.png new file mode 100644 index 0000000000000000000000000000000000000000..436cce3bd5c35a8afe3c12a2564fc99b6781c3fa GIT binary patch literal 965 zcmV;$13LVPP)_9-qd&O&$1c9Q@jIdzm@Z~eZ|tMl^{RrT z=oQB!$byW!8~3qq+L&}A%+34QuG^H%qucYae!q#{z(*>jVR>;1R^Nv`@D0W>CdA;; z4-&L2A8mVx2YWUwXNcX73zz%@Z-|}`iU&k#2%BPl#6Uw%m?Q~xCP-*?Jw=6uY)BJ58K8b2{ zBvN1|En{{ng|}at$DwKU=VDrXMG`oBEaf;sH(>15!}Hmzxe58)PC1RH8Nl&L(iGQe zv5Hv*b2$-$TfgQ93-2=~+N0btg8vTbh4zAbnTx{}&mUHUFwT!gMLW<^C4R$mdaJi@ neEs7a=ib6nQG-Cx{}o^W5ORRtD3MCE00000NkvXXu0mjfS{%Ix literal 0 HcmV?d00001 diff --git a/src/Icons/skin/qbittorrent22.png b/src/Icons/skin/qbittorrent22.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0deda6a2e17c9b391dc80e60c35749fc59d6fe GIT binary patch literal 1444 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 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/queued.png b/src/Icons/skin/queued.png new file mode 100644 index 0000000000000000000000000000000000000000..125d0e5c4d372d6a163067f1054bb9b7dc138382 GIT binary patch literal 493 zcmVPx#0%A)?L;(MXkIcUS000SaNLh0L00ZR!00ZR#yh}g$00007bV*G`2iOM=6CfHE zz+W%`00D7HL_t(2&rQ+0Ym;#lhw)YDio1h@7o0k{#9Qz}Bf(1p4b~wqQc*K#X4#d|=Ns*4mTw!QFDy7_R>_k`;1`d$()f^`dVPKLsbAb3 jb~z$;th4CN*KL4*LTq1x{uEUd00000NkvXXu0mjfaiZ3= literal 0 HcmV?d00001 diff --git a/src/Icons/skin/seeding.png b/src/Icons/skin/seeding.png new file mode 100644 index 0000000000000000000000000000000000000000..3689a0eb555bf1280382e653927aef4b7fefe961 GIT binary patch literal 427 zcmV;c0aX5pP)T+HaS+V@^TVE@#{Qv*2&kzh^gTz2`XzH0T{LRd^lEJB8fPsOLf#JtT2nMl1 zVjww?8a!dp&S02r!N4yM)c6(^gTz2`AT>yU5grRYY<>(<78@C?>lyHZqrmWdcETSR zE1M7o^sp&1aEV=DuxaFDVCBMZ!0&Gi3`goeF?@Sv05s%2BQRjt7?@a&GZQQSVAuR` z4@i?O_CQ2L<$nfwXB-CXWdQn{5m|@@tHN)u8Hfeg4FJVEWd?kt(171xh&BKqzyN9= VzITaaw2lA(002ovPDHLkV1meDvKIgV literal 0 HcmV?d00001 diff --git a/src/Icons/skin/settings.png b/src/Icons/skin/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fd8bddea5b4ec49300e0fe162a3545e20b1423 GIT binary patch literal 2483 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 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/splash.png b/src/Icons/skin/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..51dc999e550239d9daf373a9b510ad9d09671b32 GIT binary patch literal 77629 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�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 literal 0 HcmV?d00001 diff --git a/src/Icons/skin/stalled.png b/src/Icons/skin/stalled.png new file mode 100644 index 0000000000000000000000000000000000000000..396fcd7db12df97ce17dafb457055c32fd13e169 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=u^>lFzskoK&=l_3uW;=t@S0U00 zsa!{jH*MZ*zxcFq6Ay#dq$9~~`U2-!9=&zA!)fwF!HoIb149Rn4$*~g`W^O2bo_2) zyX$Pmu;1R`V6j3TyOhz)&PJyLOiRyCdd(`fq(RAEK(o(HXI4dH2$#Towk)fr^GrO< z4YS@hhFA(zGZk71EU0jRVeXcU*}H#rzX5uT!PC{x JWt~$(699RKaS#9i literal 0 HcmV?d00001 diff --git a/src/Icons/skin/tabs.gif b/src/Icons/skin/tabs.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8b5b0c6439d0cca7c57645ec33bb400a79eca75 GIT binary patch literal 2060 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 X6F@qbbMf9M00000NkvXXu0mjfL|?;5 literal 0 HcmV?d00001 diff --git a/src/Icons/sphere.png b/src/Icons/sphere.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb92a1150cf57120b5bc4dab8bfab7a41fb442a GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^+#ogwGm!MqPT>SnEa{HEjtmSN`?>!lvI6-P0X`wF zk7PM|dwV~A{8(98xn;|irAwFY-@pIp(W9?ky=rW1eEIU_vuDrt?b~) z=*yQc#l^+*=g&_~O`SS*>b!aLjvP7C(a|ww%9N_Asqc zyLRnbvSi8c-@i9*+_-7erq{1u|NsC0?c2Bcj4eh$H!zk2`2{mLJiCzwvL>2=b zE)2qq4727)00r4gJbhi+ue0zAix^E4T^$P)^7nLc4B@z*oS?vGpvkq#$Z^K2LvLh~ zf?g$To3O*EyK9ZcjI(Rb96rAO5Ko%%ry}lxlZH(0fhdEP)YH7<}OQtKa`in=b!%@LTr3tmVr8=dXVM$Extb(_jBhoTmL>xccS)+xLI|U$E-M ze-oz}{~tX41=qj~WBlh1YG7gEWZ>fFX1ICx3&ZCxzZib~W@fl_;|s&7Lo*v07#J9s zV2ZC_zsq2tuf!lEz`>xTz{ema%Ee%yr@(OY`dzr~EHH+MhzNtRzA%HVBs+tIC=0{e z4}TdRJ>_P&d{qRl7;dt@t~|rdJD(Y}R5=)UxS1GK71$Z>Jp96-ry~bf%m`!Lef0Bx zR`C`FX=zCYEe$D#>o=b>Jbn6{VQP;zgR&euBZ^{}h7}v0Fq}AbgTcyNgCWdc2Ck5{ Z003k@U_tDpTVVhI002ovPDHLkV1f<`p5g!i literal 0 HcmV?d00001 diff --git a/src/Icons/uparrow.png b/src/Icons/uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c2b99cc71b6c08c7d4acfb08d60df506883cff GIT binary patch literal 787 zcmV+u1MK{XP)chFW`8hR?qkz}QBfnc+53m zGGXviLpAj0UkJ^P=Etqqe=^*kyNrS1#WQe({(Rd2HXI;;zy_-&gA9eZ^q-~)gOwb1 zmx2sOH~1Ye08Tvk!SH+OA_j(MPk@I1b^PH5F_nGD{_n=q*IurS>F zfIn@214iPjuM7-tzr#d07#O|67?|fzHu(4b=X#)kBR~K#0>icc-+!ip7m~&d%)Gn| z%&d44J+Qp`2{iQQZyX9J9Z{H>W1P~)I6a4?FXw2}JM-VLc52*PU5dZ$i z!0;DHvjS5(Gcdr|fS8Gqa8~|(_b$Wh>C+eh0*D2e&>2L8c^H^jsZ&P$QI%qN4Wt1A zh~?j(zYqT2y`mtlufxE?Mw#iqzJ6!8vVJ3o`2Zk*80CXDg0km&U{X z|A&eF`GX=3QwNs+^B39t2S6MM5I~HyszCq(h-T$6KmgIqV1NLknZW=71^~9qG6x3P R4r>4a002ovPDHLkV1mCmX)^!- literal 0 HcmV?d00001 diff --git a/src/Icons/url.png b/src/Icons/url.png new file mode 100644 index 0000000000000000000000000000000000000000..542ac36bb852514213a2824b7903aa900d18afd2 GIT binary patch literal 722 zcmV;@0xkWCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXV` z2>~MTFL<~B00L4;L_t(2&n?o)P7`qez~SG2wsxF06qzp2uogvu2r(v@04gWq5;ZZY z7vt3j(8wF$*~EiaFB-#1F`DQ>5AJ9%Xi7}j0+gkc($aR?X*)As{GQ(5%<2~i6u<7;@lGTt=FzIe&8R*XtGj@skB|`FzqQg~@ zY}X|YU$(>oTnn`_=timG6KdX^*rIhrr+pxZ9#b)gifC1-ZZp~K+w4$i^o{Nu9ZJmR zGQa4$xX-}dd0NaIs@6wMicxdAs0QoU(o!`%6+G zkwp~8ZJ~gHV>8%Iq5|IoC%v0_h2b1A7fS|4_ynsi0_iiu7s9PsOhiY}Gabx%Iyp_J;iAZI|4x zL}6naYxxnzyB{)q@X+LaDx&HWzhhRBU?!EY$XsZq;PX>T3#!Xo)K;HRUVKAtqbUAY z3ZR<3D77)P$QbpW4xHc-T*pQ_+(G2NA~Nr(Y^8w1f3^PhuX(>TzyJUM07*qoM6N<$ Ef@_{b_5c6? literal 0 HcmV?d00001 diff --git a/src/MainWindow.ui b/src/MainWindow.ui new file mode 100644 index 000000000..e3fe70399 --- /dev/null +++ b/src/MainWindow.ui @@ -0,0 +1,275 @@ + + + MainWindow + + + + 0 + 0 + 914 + 563 + + + + Qt::CustomContextMenu + + + + + + + + + + + 0 + 0 + 914 + 23 + + + + + &Edit + + + + + + + + + + + + + + + + + &Help + + + + + + + + + Options + + + + + + + &File + + + + + + + + + + + + + + true + + + Qt::NoContextMenu + + + false + + + Qt::Horizontal + + + + 32 + 32 + + + + false + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + + + + + + + + Open + + + + + Exit + + + + + Preferences + + + + + About + + + + + Start + + + + + Pause + + + + + Delete + + + + + Pause All + + + + + Start All + + + + + Visit website + + + + + Delete Permanently + + + + + Torrent Properties + + + + + Download from URL + + + + + Create torrent + + + + + Preview file + + + + + Clear log + + + + + Report a bug + + + + + Set upload limit + + + + + Set download limit + + + + + Documentation + + + + + Set global download limit + + + + + Set global upload limit + + + + + + :/Icons/skin/decrease.png:/Icons/skin/decrease.png + + + Decrease priority + + + false + + + + + + :/Icons/skin/increase.png:/Icons/skin/increase.png + + + Increase priority + + + false + + + + + + :/Icons/oxygen/log.png:/Icons/oxygen/log.png + + + Console + + + + + + + + diff --git a/src/PreviewListDelegate.h b/src/PreviewListDelegate.h new file mode 100644 index 000000000..fb3f7dbb7 --- /dev/null +++ b/src/PreviewListDelegate.h @@ -0,0 +1,88 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PREVIEWLISTDELEGATE_H +#define PREVIEWLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for properties list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 + +class PreviewListDelegate: public QItemDelegate { + Q_OBJECT + + public: + PreviewListDelegate(QObject *parent=0) : QItemDelegate(parent){} + + ~PreviewListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + + switch(index.column()){ + case SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + case PROGRESS:{ + float progress = index.data().toDouble()*100.; + QStyleOptionProgressBarV2 newopt; + newopt.rect = opt.rect; + newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + break; + } + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; + } +}; + +#endif diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h new file mode 100644 index 000000000..6bd694c5d --- /dev/null +++ b/src/PropListDelegate.h @@ -0,0 +1,235 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PROPLISTDELEGATE_H +#define PROPLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for properties list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 +#define PRIORITY 3 +#define INDEX 4 + +#define IGNORED 0 +#define NORMAL 1 +#define HIGH 2 +#define MAXIMUM 7 + +class PropListDelegate: public QItemDelegate { + Q_OBJECT + + private: + bool* filteredFilesChanged; + + public: + PropListDelegate(QObject *parent=0, bool* filteredFilesChanged=0) : QItemDelegate(parent){ + this->filteredFilesChanged = filteredFilesChanged; + } + + ~PropListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; + switch(index.column()){ + case SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + case PROGRESS:{ + QStyleOptionProgressBarV2 newopt; + float progress = index.data().toDouble()*100.; + newopt.rect = opt.rect; + newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + break; + } + case PRIORITY:{ + QStyleOptionComboBox newopt; + newopt.rect = opt.rect; + switch(index.data().toInt()){ + case IGNORED: + newopt.currentText = tr("Ignored"); + break; + case NORMAL: + newopt.currentText = tr("Normal", "Normal (priority)"); + break; + case HIGH: + newopt.currentText = tr("High", "High (priority)"); + break; + case MAXIMUM: + newopt.currentText = tr("Maximum", "Maximum (priority)"); + break; + default: + qDebug("Unhandled priority, setting NORMAL"); + newopt.currentText = tr("Normal", "Normal (priority)"); + } + newopt.state |= QStyle::State_Enabled; + QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &newopt, + painter); + opt.palette.setColor(QPalette::Text, QColor("black")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + painter->drawText(option.rect, Qt::AlignLeft, QString::fromUtf8(" ")+newopt.currentText); + break; + } + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex & index) const { + if(index.column() != PRIORITY) return 0; + QComboBox* editor = new QComboBox(parent); + editor->setFocusPolicy(Qt::StrongFocus); + editor->addItem(tr("Ignored")); + editor->addItem(tr("Normal", "Normal (priority)")); + editor->addItem(tr("High", "High (priority)")); + editor->addItem(tr("Maximum", "Maximum (priority)")); + return editor; + } + + void setEditorData(QWidget *editor, const QModelIndex &index) const { + unsigned short val = index.model()->data(index, Qt::DisplayRole).toInt(); + QComboBox *combobox = static_cast(editor); + qDebug("Set Editor data: Prio is %d", val); + switch(val){ + case IGNORED: + combobox->setCurrentIndex(0); + break; + case NORMAL: + combobox->setCurrentIndex(1); + break; + case HIGH: + combobox->setCurrentIndex(2); + break; + case MAXIMUM: + combobox->setCurrentIndex(3); + break; + default: + qDebug("Unhandled priority, setting to NORMAL"); + combobox->setCurrentIndex(1); + } + } + + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QVariant value = index.data(Qt::FontRole); + QFont fnt = value.isValid() ? qvariant_cast(value) : option.font; + QFontMetrics fontMetrics(fnt); + const QString text = index.data(Qt::DisplayRole).toString(); + QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); + return textRect.size(); + } + + public slots: + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + QComboBox *combobox = static_cast(editor); + int value = combobox->currentIndex(); + qDebug("Setting combobox value in index: %d", value); + unsigned short old_val = index.model()->data(index, Qt::DisplayRole).toInt(); + switch(value){ + case 0: + if(old_val != IGNORED){ + model->setData(index, QVariant(IGNORED)); + if(filteredFilesChanged != 0) + *filteredFilesChanged = true; + } else { + // XXX: hack to force the model to send the itemChanged() signal + model->setData(index, QVariant(NORMAL)); + model->setData(index, QVariant(IGNORED)); + } + break; + case 1: +// if(old_val != NORMAL){ +// model->setData(index, QVariant(NORMAL)); +// if(filteredFilesChanged != 0) +// *filteredFilesChanged = true; +// } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(NORMAL)); + if(filteredFilesChanged != 0) + *filteredFilesChanged = true; +// } + break; + case 2: + if(old_val != HIGH){ + model->setData(index, QVariant(HIGH)); + if(filteredFilesChanged != 0) + *filteredFilesChanged = true; + } else { + model->setData(index, QVariant(NORMAL)); + model->setData(index, QVariant(HIGH)); + } + break; + case 3: + if(old_val != MAXIMUM){ + model->setData(index, QVariant(MAXIMUM)); + if(filteredFilesChanged != 0) + *filteredFilesChanged = true; + } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(MAXIMUM)); + } + break; + default: + if(old_val != NORMAL){ + model->setData(index, QVariant(NORMAL)); + if(filteredFilesChanged != 0) + *filteredFilesChanged = true; + } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(NORMAL)); + } + } + } + + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { + editor->setGeometry(option.rect); + } + +}; + +#endif diff --git a/src/SearchListDelegate.h b/src/SearchListDelegate.h new file mode 100644 index 000000000..694f9aed7 --- /dev/null +++ b/src/SearchListDelegate.h @@ -0,0 +1,75 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCHLISTDELEGATE_H +#define SEARCHLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for search results list columns +#define NAME 0 +#define SIZE 1 +#define SEEDERS 2 +#define LEECHERS 3 +#define ENGINE 4 + +class SearchListDelegate: public QItemDelegate { + Q_OBJECT + + public: + SearchListDelegate(QObject *parent=0) : QItemDelegate(parent){} + + ~SearchListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + switch(index.column()){ + case SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; + } +}; + +#endif diff --git a/src/SearchTab.cpp b/src/SearchTab.cpp new file mode 100644 index 000000000..23b6bd197 --- /dev/null +++ b/src/SearchTab.cpp @@ -0,0 +1,150 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include + +#include "SearchTab.h" +#include "SearchListDelegate.h" +#include "misc.h" +#include "searchEngine.h" + +#define SEARCH_NAME 0 +#define SEARCH_SIZE 1 +#define SEARCH_SEEDERS 2 +#define SEARCH_LEECHERS 3 +#define SEARCH_ENGINE 4 + +SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent) +{ + box=new QVBoxLayout(); + results_lbl=new QLabel(); + resultsBrowser = new QTreeView(); + resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); + box->addWidget(results_lbl); + box->addWidget(resultsBrowser); + + setLayout(box); + // Set Search results list model + SearchListModel = new QStandardItemModel(0,6); + SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); + SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); + SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine")); + + proxyModel = new QSortFilterProxyModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(SearchListModel); + resultsBrowser->setModel(proxyModel); + + SearchDelegate = new SearchListDelegate(); + resultsBrowser->setItemDelegate(SearchDelegate); + + resultsBrowser->hideColumn(URL_COLUMN); // Hide url column + + resultsBrowser->setRootIsDecorated(false); + resultsBrowser->setAllColumnsShowFocus(true); + resultsBrowser->setSortingEnabled(true); + + // Connect signals to slots (search part) + connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(downloadSelectedItem(const QModelIndex&))); + + // Load last columns width for search results list + if(!loadColWidthResultsList()){ + resultsBrowser->header()->resizeSection(0, 275); + } + + // Sort by Seeds + resultsBrowser->sortByColumn(SEEDERS, Qt::DescendingOrder); +} + +void SearchTab::downloadSelectedItem(const QModelIndex& index) { + QString engine_url = proxyModel->data(proxyModel->index(index.row(), ENGINE_URL_COLUMN)).toString(); + QString torrent_url = proxyModel->data(proxyModel->index(index.row(), URL_COLUMN)).toString(); + setRowColor(index.row(), "red"); + parent->downloadTorrent(engine_url, torrent_url); +} + +SearchTab::~SearchTab() { + delete box; + delete results_lbl; + delete resultsBrowser; + delete SearchListModel; + delete proxyModel; + delete SearchDelegate; +} + +QHeaderView* SearchTab::header() const { + return resultsBrowser->header(); +} + +bool SearchTab::loadColWidthResultsList() { + QSettings settings("qBittorrent", "qBittorrent"); + QString line = settings.value("SearchResultsColsWidth", QString()).toString(); + if(line.isEmpty()) + return false; + QStringList width_list = line.split(' '); + if(width_list.size() < SearchListModel->columnCount()) + return false; + unsigned int listSize = width_list.size(); + for(unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + } + return true; +} + +QLabel* SearchTab::getCurrentLabel() +{ + return results_lbl; +} + +QTreeView* SearchTab::getCurrentTreeView() +{ + return resultsBrowser; +} + +QStandardItemModel* SearchTab::getCurrentSearchListModel() +{ + return SearchListModel; +} + +// Set the color of a row in data model +void SearchTab::setRowColor(int row, QString color){ + for(int i=0; icolumnCount(); ++i){ + proxyModel->setData(proxyModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); + } +} + + diff --git a/src/SearchTab.h b/src/SearchTab.h new file mode 100644 index 000000000..6762c257a --- /dev/null +++ b/src/SearchTab.h @@ -0,0 +1,75 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCH_TAB_H +#define SEARCH_TAB_H + +#include "ui_search.h" + +#define ENGINE_URL_COLUMN 4 +#define URL_COLUMN 5 + +class SearchListDelegate; +class SearchEngine; +class QTreeView; +class QHeaderView; +class QStandardItemModel; +class QSortFilterProxyModel; + +class SearchTab: public QWidget, public Ui::search_engine { + Q_OBJECT + +private: + QVBoxLayout *box; + QLabel *results_lbl; + QTreeView *resultsBrowser; + QStandardItemModel *SearchListModel; + QSortFilterProxyModel *proxyModel; + SearchListDelegate *SearchDelegate; + SearchEngine *parent; + +protected slots: + void downloadSelectedItem(const QModelIndex& index); + +public: + SearchTab(SearchEngine *parent); + ~SearchTab(); + bool loadColWidthResultsList(); + QLabel * getCurrentLabel(); + QStandardItemModel * getCurrentSearchListModel(); + QTreeView * getCurrentTreeView(); + void setRowColor(int row, QString color); + QHeaderView* header() const; + + +}; + +#endif + diff --git a/src/TrackersAdditionDlg.h b/src/TrackersAdditionDlg.h new file mode 100644 index 000000000..1a4d318d5 --- /dev/null +++ b/src/TrackersAdditionDlg.h @@ -0,0 +1,62 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TRACKERSADDITION_H +#define TRACKERSADDITION_H + +#include +#include +#include "ui_trackersAdd.h" + +class TrackersAddDlg : public QDialog, private Ui::TrackersAdditionDlg{ + Q_OBJECT + + public: + TrackersAddDlg(QWidget *parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + show(); + } + + ~TrackersAddDlg(){} + + signals: + void TrackersToAdd(QStringList trackers); + + public slots: + void on_buttonBox_accepted() { + QStringList trackers = trackers_list->toPlainText().trimmed().split("\n"); + if(trackers.size()) { + emit TrackersToAdd(trackers); + } + } +}; + +#endif diff --git a/src/about.ui b/src/about.ui new file mode 100644 index 000000000..20714a8ba --- /dev/null +++ b/src/about.ui @@ -0,0 +1,422 @@ + + + Christophe Dumez + AboutDlg + + + + 0 + 0 + 504 + 320 + + + + + 504 + 320 + + + + + 504 + 320 + + + + About qBittorrent + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + + + + + 0 + 0 + + + + <h3><b>qBittorrent</b></h3> + + + Qt::RichText + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + + About + + + + + 380 + 70 + 94 + 162 + + + + + + + + + + 0 + 30 + 481 + 102 + + + + + 0 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + Qt::RichText + + + true + + + Qt::AlignCenter + + + true + + + true + + + + + + Author + + + + 6 + + + + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + 6 + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + Name: + + + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + Country: + + + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + Birthday: + + + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + Occupation: + + + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + E-mail: + + + + + + + + Sans Serif + 9 + 50 + false + false + true + false + + + + Home page: + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + 6 + + + + + Christophe Dumez + + + + + + + France + + + + + + + 03/05/1985 + + + + + + + Student in computer science + + + + + + + chris@qbittorrent.org + + + + + + + http://www.dchris.eu + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Thanks to + + + + 6 + + + + + + + + + Translation + + + + 6 + + + + + QTextEdit::NoWrap + + + + + + + + License + + + + 6 + + + + + + + + + + + + + + diff --git a/src/about_imp.h b/src/about_imp.h new file mode 100644 index 000000000..190688094 --- /dev/null +++ b/src/about_imp.h @@ -0,0 +1,445 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef ABOUT_H +#define ABOUT_H + +#include "ui_about.h" +#include + +class about : public QDialog, private Ui::AboutDlg{ + Q_OBJECT + + public: + ~about() { + qDebug("Deleting about dlg"); + } + + about(QWidget *parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + // Set icons + logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/qbittorrent22.png"))); + mascot_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/mascot.png"))); + //Title + lb_name->setText(QString::fromUtf8("

")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"

")); + // Thanks + te_thanks->append(QString::fromUtf8("")); + te_thanks->append(QString::fromUtf8("
  • I would like to thank sourceforge.net for hosting qBittorrent project.
  • ")); + te_thanks->append(QString::fromUtf8("
  • I am happy that Ishan Arora and Arnaud Demaizière are contributing to the project as developers. Their help is greatly appreciated
  • ")); + te_thanks->append(QString::fromUtf8("
  • I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, RPM packager, for his help and support.
  • ")); + te_thanks->append(QString::fromUtf8("
  • I am grateful to Peter Koeleman (peter@qbittorrent.org) who is helping port qBittorrent to Windows.
  • ")); + te_thanks->append(QString::fromUtf8("
  • Thanks a lot to our graphist Mateusz Toboła (tobejodok@qbittorrent.org) for his great work.


")); + te_thanks->scrollToAnchor(QString::fromUtf8("top")); + // Translation + te_translation->append(QString::fromUtf8("")); + te_translation->append(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+QString::fromUtf8("
")); + te_translation->append(QString::fromUtf8( + "- Brazilian: Nick Marinho (nickmarinho@gmail.com)
\ + - Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
\ + - Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
\ + - Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
\ + - Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
\ + - Czech: Jirka Vilim (web@tets.cz)
\ + - Danish: Mathias Nielsen (comoneo@gmail.com)
\ + - Dutch: Joost Schipper (heavyjoost@users.sourceforge.net) and Peter Koeleman (peter@peerweb.nl)
\ + - Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net) and Pekka Niemi (pekka.niemi@iki.fi)
\ + - German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
\ + - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net)
\ + - Hungarian: Majoros Péter (majoros.peterj@gmail.com)
\ + - Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
\ + - Japanese: Nardog (nardog@e2umail.com)
\ + - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
\ + - Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
\ + - Polish: Jarek Smieja (ajep9691@wp.pl)
\ + - Portuguese: Nick Marinho (nickmarinho@gmail.com)
\ + - Romanian: Obada Denis (obadadenis@users.sourceforge.net)
\ + - Russian: Nick Khazov (m2k3d0n@users.sourceforge.net) and Alexey Morsov (samurai@ricom.ru)
\ + - Slovak: helix84
\ + - Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) and Gabriel de Oliveira (deadloop@hotmail.com)
\ + - Swedish: Daniel Nylander (po@danielnylander.se)
\ + - Turkish: Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)
\ + - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net)

")); + te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language.")); + te_translation->scrollToAnchor(QString::fromUtf8("top")); + // License + te_license->append(QString::fromUtf8("")); + te_license->append(QString::fromUtf8("qBittorrent is licensed under the GNU General Public License version 2 with the\ +addition of the following special exception:\ +

\ +In addition, as a special exception, the copyright holders give permission to\ +link this program with the OpenSSL project\'s \"OpenSSL\" library (or with\ +modified versions of it that use the same license as the \"OpenSSL\" library),\ +and distribute the linked executables. 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), 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.\ +

\ +
GNU GENERAL PUBLIC LICENSE

\ +
Version 2, June 1991

\ + Copyright (C) 1989, 1991 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.
\ +
\ +
Preamble

\ + The licenses for most software are designed to take away your
\ + freedom to share and change it. By contrast, the GNU General Public
\ + License is intended to guarantee your freedom to share and change free
\ + software--to make sure the software is free for all its users. This
\ + General Public License applies to most of the Free Software
\ + Foundation's software and to any other program whose authors commit to
\ + using it. (Some other Free Software Foundation software is covered by
\ + the GNU Library General Public License instead.) You can apply it to
\ + your programs, too.
\ +
\ + When we speak of free software, we are referring to freedom, not
\ + price. Our General Public Licenses are designed to make sure that you
\ + have the freedom to distribute copies of free software (and charge for
\ + this service if you wish), that you receive source code or can get it
\ + if you want it, that you can change the software or use pieces of it
\ + in new free programs; and that you know you can do these things.
\ +
\ + To protect your rights, we need to make restrictions that forbid
\ + anyone to deny you these rights or to ask you to surrender the rights.
\ + These restrictions translate to certain responsibilities for you if you
\ + distribute copies of the software, or if you modify it.
\ +
\ + For example, if you distribute copies of such a program, whether
\ + gratis or for a fee, you must give the recipients all the rights that
\ + you have. You must make sure that they, too, receive or can get the
\ + source code. And you must show them these terms so they know their
\ + rights.
\ +
\ + We protect your rights with two steps: (1) copyright the software, and
\ + (2) offer you this license which gives you legal permission to copy,
\ + distribute and/or modify the software.
\ +
\ + Also, for each author's protection and ours, we want to make certain
\ + that everyone understands that there is no warranty for this free
\ + software. If the software is modified by someone else and passed on, we
\ + want its recipients to know that what they have is not the original, so
\ + that any problems introduced by others will not reflect on the original
\ + authors' reputations.
\ +
\ + Finally, any free program is threatened constantly by software
\ + patents. We wish to avoid the danger that redistributors of a free
\ + program will individually obtain patent licenses, in effect making the
\ + program proprietary. To prevent this, we have made it clear that any
\ + patent must be licensed for everyone's free use or not licensed at all.
\ +
\ + The precise terms and conditions for copying, distribution and
\ + modification follow.
\ +
\ +
GNU GENERAL PUBLIC LICENSE

\ +
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

\ + 0. This License applies to any program or other work which contains
\ + a notice placed by the copyright holder saying it may be distributed
\ + under the terms of this General Public License. The 'Program', below,
\ + refers to any such program or work, and a 'work based on the Program'
\ + means either the Program or any derivative work under copyright law:
\ + that is to say, a work containing the Program or a portion of it,
\ + either verbatim or with modifications and/or translated into another
\ + language. (Hereinafter, translation is included without limitation in
\ + the term 'modification'.) Each licensee is addressed as 'you'.
\ +
\ + Activities other than copying, distribution and modification are not
\ + covered by this License; they are outside its scope. The act of
\ + running the Program is not restricted, and the output from the Program
\ + is covered only if its contents constitute a work based on the
\ + Program (independent of having been made by running the Program).
\ + Whether that is true depends on what the Program does.
\ +
\ + 1. You may copy and distribute verbatim copies of the Program's
\ + source code as you receive it, in any medium, provided that you
\ + conspicuously and appropriately publish on each copy an appropriate
\ + copyright notice and disclaimer of warranty; keep intact all the
\ + notices that refer to this License and to the absence of any warranty;
\ + and give any other recipients of the Program a copy of this License
\ + along with the Program.
\ +
\ + You may charge a fee for the physical act of transferring a copy, and
\ + you may at your option offer warranty protection in exchange for a fee.
\ +
\ + 2. You may modify your copy or copies of the Program or any portion
\ + of it, thus forming a work based on the Program, and copy and
\ + distribute such modifications or work under the terms of Section 1
\ + above, provided that you also meet all of these conditions:
\ +
\ + a) You must cause the modified files to carry prominent notices
\ + stating that you changed the files and the date of any change.
\ +
\ + b) You must cause any work that you distribute or publish, that in
\ + whole or in part contains or is derived from the Program or any
\ + part thereof, to be licensed as a whole at no charge to all third
\ + parties under the terms of this License.
\ +
\ + c) If the modified program normally reads commands interactively
\ + when run, you must cause it, when started running for such
\ + interactive use in the most ordinary way, to print or display an
\ + announcement including an appropriate copyright notice and a
\ + notice that there is no warranty (or else, saying that you provide
\ + a warranty) and that users may redistribute the program under
\ + these conditions, and telling the user how to view a copy of this
\ + License. (Exception: if the Program itself is interactive but
\ + does not normally print such an announcement, your work based on
\ + the Program is not required to print an announcement.)
\ +
\ + These requirements apply to the modified work as a whole. If
\ + identifiable sections of that work are not derived from the Program,
\ + and can be reasonably considered independent and separate works in
\ + themselves, then this License, and its terms, do not apply to those
\ + sections when you distribute them as separate works. But when you
\ + distribute the same sections as part of a whole which is a work based
\ + on the Program, the distribution of the whole must be on the terms of
\ + this License, whose permissions for other licensees extend to the
\ + entire whole, and thus to each and every part regardless of who wrote it.
\ +
\ + Thus, it is not the intent of this section to claim rights or contest
\ + your rights to work written entirely by you; rather, the intent is to
\ + exercise the right to control the distribution of derivative or
\ + collective works based on the Program.
\ +
\ + In addition, mere aggregation of another work not based on the Program
\ + with the Program (or with a work based on the Program) on a volume of
\ + a storage or distribution medium does not bring the other work under
\ + the scope of this License.
\ +
\ + 3. You may copy and distribute the Program (or a work based on it,
\ + under Section 2) in object code or executable form under the terms of
\ + Sections 1 and 2 above provided that you also do one of the following:
\ +
\ + a) Accompany it with the complete corresponding machine-readable
\ + source code, which must be distributed under the terms of Sections
\ + 1 and 2 above on a medium customarily used for software interchange; or,
\ +
\ + b) Accompany it with a written offer, valid for at least three
\ + years, to give any third party, for a charge no more than your
\ + cost of physically performing source distribution, a complete
\ + machine-readable copy of the corresponding source code, to be
\ + distributed under the terms of Sections 1 and 2 above on a medium
\ + customarily used for software interchange; or,
\ +
\ + c) Accompany it with the information you received as to the offer
\ + to distribute corresponding source code. (This alternative is
\ + allowed only for noncommercial distribution and only if you
\ + received the program in object code or executable form with such
\ + an offer, in accord with Subsection b above.)
\ +
\ + The source code for a work means the preferred form of the work for
\ + making modifications to it. For an executable work, complete source
\ + code means all the source code for all modules it contains, plus any
\ + associated interface definition files, plus the scripts used to
\ + control compilation and installation of the executable. However, as a
\ + special exception, the source code distributed need not include
\ + anything that is normally distributed (in either source or binary
\ + form) with the major components (compiler, kernel, and so on) of the
\ + operating system on which the executable runs, unless that component
\ + itself accompanies the executable.
\ +
\ + If distribution of executable or object code is made by offering
\ + access to copy from a designated place, then offering equivalent
\ + access to copy the source code from the same place counts as
\ + distribution of the source code, even though third parties are not
\ + compelled to copy the source along with the object code.
\ +
\ + 4. You may not copy, modify, sublicense, or distribute the Program
\ + except as expressly provided under this License. Any attempt
\ + otherwise to copy, modify, sublicense or distribute the Program is
\ + void, and will automatically terminate your rights under this License.
\ + However, parties who have received copies, or rights, from you under
\ + this License will not have their licenses terminated so long as such
\ + parties remain in full compliance.
\ +
\ + 5. You are not required to accept this License, since you have not
\ + signed it. However, nothing else grants you permission to modify or
\ + distribute the Program or its derivative works. These actions are
\ + prohibited by law if you do not accept this License. Therefore, by
\ + modifying or distributing the Program (or any work based on the
\ + Program), you indicate your acceptance of this License to do so, and
\ + all its terms and conditions for copying, distributing or modifying
\ + the Program or works based on it.
\ +
\ + 6. Each time you redistribute the Program (or any work based on the
\ + Program), the recipient automatically receives a license from the
\ + original licensor to copy, distribute or modify the Program subject to
\ + these terms and conditions. You may not impose any further
\ + restrictions on the recipients' exercise of the rights granted herein.
\ + You are not responsible for enforcing compliance by third parties to
\ + this License.
\ +
\ + 7. If, as a consequence of a court judgment or allegation of patent
\ + infringement or for any other reason (not limited to patent issues),
\ + conditions are imposed on you (whether by court order, agreement or
\ + otherwise) that contradict the conditions of this License, they do not
\ + excuse you from the conditions of this License. If you cannot
\ + distribute so as to satisfy simultaneously your obligations under this
\ + License and any other pertinent obligations, then as a consequence you
\ + may not distribute the Program at all. For example, if a patent
\ + license would not permit royalty-free redistribution of the Program by
\ + all those who receive copies directly or indirectly through you, then
\ + the only way you could satisfy both it and this License would be to
\ + refrain entirely from distribution of the Program.
\ +
\ + If any portion of this section is held invalid or unenforceable under
\ + any particular circumstance, the balance of the section is intended to
\ + apply and the section as a whole is intended to apply in other
\ + circumstances.
\ +
\ + It is not the purpose of this section to induce you to infringe any
\ + patents or other property right claims or to contest validity of any
\ + such claims; this section has the sole purpose of protecting the
\ + integrity of the free software distribution system, which is
\ + implemented by public license practices. Many people have made
\ + generous contributions to the wide range of software distributed
\ + through that system in reliance on consistent application of that
\ + system; it is up to the author/donor to decide if he or she is willing
\ + to distribute software through any other system and a licensee cannot
\ + impose that choice.
\ +
\ + This section is intended to make thoroughly clear what is believed to
\ + be a consequence of the rest of this License.
\ +
\ + 8. If the distribution and/or use of the Program is restricted in
\ + certain countries either by patents or by copyrighted interfaces, the
\ + original copyright holder who places the Program under this License
\ + may add an explicit geographical distribution limitation excluding
\ + those countries, so that distribution is permitted only in or among
\ + countries not thus excluded. In such case, this License incorporates
\ + the limitation as if written in the body of this License.
\ +
\ + 9. The Free Software Foundation may publish revised and/or new versions
\ + of the General Public License from time to time. Such new versions will
\ + be similar in spirit to the present version, but may differ in detail to
\ + address new problems or concerns.
\ +
\ + Each version is given a distinguishing version number. If the Program
\ + specifies a version number of this License which applies to it and 'any
\ + later version', you have the option of following the terms and conditions
\ + either of that version or of any later version published by the Free
\ + Software Foundation. If the Program does not specify a version number of
\ + this License, you may choose any version ever published by the Free Software
\ + Foundation.
\ +
\ + 10. If you wish to incorporate parts of the Program into other free
\ + programs whose distribution conditions are different, write to the author
\ + to ask for permission. For software which is copyrighted by the Free
\ + Software Foundation, write to the Free Software Foundation; we sometimes
\ + make exceptions for this. Our decision will be guided by the two goals
\ + of preserving the free status of all derivatives of our free software and
\ + of promoting the sharing and reuse of software generally.
\ +
\ +
NO WARRANTY

\ + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
\ + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
\ + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
\ + PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
\ + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\ + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
\ + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
\ + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
\ + REPAIR OR CORRECTION.
\ +
\ + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
\ + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
\ + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
\ + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
\ + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
\ + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
\ + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
\ + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
\ + POSSIBILITY OF SUCH DAMAGES.
\ +
\ +
END OF TERMS AND CONDITIONS

\ +
How to Apply These Terms to Your New Programs

\ + If you develop a new program, and you want it to be of the greatest
\ + possible use to the public, the best way to achieve this is to make it
\ + free software which everyone can redistribute and change under these terms.
\ +
\ + To do so, attach the following notices to the program. It is safest
\ + to attach them to the start of each source file to most effectively
\ + convey the exclusion of warranty; and each file should have at least
\ + the 'copyright' line and a pointer to where the full notice is found.
\ +
\ +
\ + Copyright (C)
\ +
\ + This program is free software; you can redistribute it and/or modify
\ + it under the terms of the GNU General Public License as published by
\ + the Free Software Foundation; either version 2 of the License, or
\ + (at your option) any later version.
\ +
\ + This program is distributed in the hope that it will be useful,
\ + but WITHOUT ANY WARRANTY; without even the implied warranty of
\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\ + GNU General Public License for more details.
\ +
\ + You should have received a copy of the GNU General Public License
\ + along with this program; if not, write to the Free Software
\ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\ +
\ +
\ + Also add information on how to contact you by electronic and paper mail.
\ +
\ + If the program is interactive, make it output a short notice like this
\ + when it starts in an interactive mode:
\ +
\ + Gnomovision version 69, Copyright (C) year name of author
\ + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
\ + This is free software, and you are welcome to redistribute it
\ + under certain conditions; type `show c' for details.
\ +
\ + The hypothetical commands `show w' and `show c' should show the appropriate
\ + parts of the General Public License. Of course, the commands you use may
\ + be called something other than `show w' and `show c'; they could even be
\ + mouse-clicks or menu items--whatever suits your program.
\ +
\ + You should also get your employer (if you work as a programmer) or your
\ + school, if any, to sign a 'copyright disclaimer' for the program, if
\ + necessary. Here is a sample; alter the names:
\ +
\ + Yoyodyne, Inc., hereby disclaims all copyright interest in the program
\ + `Gnomovision' (which makes passes at compilers) written by James Hacker.
\ +
\ + 'signature of Ty Coon', 1 April 1989
\ + Ty Coon, President of Vice
\ +
\ + This General Public License does not permit incorporating your program into
\ + proprietary programs. If your program is a subroutine library, you may
\ + consider it more useful to permit linking proprietary applications with the
\ + library. If this is what you want to do, use the GNU Library General
\ + Public License instead of this License.
")); + te_license->scrollToAnchor(QString::fromUtf8("top")); + show(); + } +}; + +#endif diff --git a/src/addTorrentDialog.ui b/src/addTorrentDialog.ui new file mode 100644 index 000000000..7f0004d21 --- /dev/null +++ b/src/addTorrentDialog.ui @@ -0,0 +1,291 @@ + + + addTorrentDialog + + + + 0 + 0 + 511 + 461 + + + + Torrent addition dialog + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Save path: + + + + + + + 6 + + + 0 + + + + + + + + ... + + + + + + + + + + + Torrent size: + + + + + + + Unknown + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Free disk space: + + + + + + + Unknown + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 75 + true + + + + Torrent content: + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::AllEditTriggers + + + QAbstractItemView::ExtendedSelection + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Collapse all + + + + + + + Expand all + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Download in sequential order (slower but good for previewing) + + + + + + + Add to download list in paused state + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Ignored + + + + + Normal + + + + + High + + + + + Maximum + + + + + + diff --git a/src/allocationDlg.h b/src/allocationDlg.h new file mode 100644 index 000000000..9609c3fa7 --- /dev/null +++ b/src/allocationDlg.h @@ -0,0 +1,188 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef BANDWIDTH_ALLOCATION_H +#define BANDWIDTH_ALLOCATION_H + +#include +#include +#include +#include "ui_bandwidth_limit.h" +#include "misc.h" +#include "bittorrent.h" + +using namespace libtorrent; + +class BandwidthAllocationDialog : public QDialog, private Ui_bandwidth_dlg { + Q_OBJECT + + public: + BandwidthAllocationDialog(QWidget *parent, bool uploadMode, bittorrent *BTSession, QStringList hashes): QDialog(parent), uploadMode(uploadMode), hashes(hashes){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + qDebug("Bandwidth allocation dialog creation"); + this->BTSession = BTSession; + if(hashes.size() == 0) + global = true; + else + global = false; + if(uploadMode) + lblTitle->setText(tr("Upload limit:")); + else + lblTitle->setText(tr("Download limit:")); + connect(bandwidthSlider, SIGNAL(valueChanged(int)), this, SLOT(updateBandwidthLabel(int))); + if(!global){ + unsigned int nbTorrents = hashes.size(); + if(!nbTorrents) close(); + int val = 0; + int max = -1; + if(nbTorrents == 1){ + QTorrentHandle h = BTSession->getTorrentHandle(hashes.at(0)); + if(uploadMode){ + if(h.upload_limit() > 0) + val = (int)(h.upload_limit() / 1024.); + if(BTSession->getSession()->upload_rate_limit() > 0) + max = (int)(BTSession->getSession()->upload_rate_limit() / 1024.); + }else{ + if(h.download_limit() > 0) + val = (int)(h.download_limit() / 1024.); + if(BTSession->getSession()->download_rate_limit() > 0){ + qDebug("there is a global download rate limit at: %d kb/s", (int)(BTSession->getSession()->download_rate_limit() / 1024.)); + max = (int)(BTSession->getSession()->download_rate_limit() / 1024.); + } + } + if(max != -1) + bandwidthSlider->setMaximum(max); + qDebug("Bandwidth limit: %d", val); + if(val > bandwidthSlider->maximum()) + val = bandwidthSlider->maximum(); + else if(val < bandwidthSlider->minimum()) + val = 0; + bandwidthSlider->setValue(val); + if(val == 0) { + limit_lbl->setText(tr("Unlimited", "Unlimited (bandwidth)")); + kb_lbl->setText(QString::fromUtf8("")); + } else { + limit_lbl->setText(misc::toQString(val)); + } + }else{ + qDebug("More than one torrent selected, no initilization"); + bandwidthSlider->setValue(0); + limit_lbl->setText(tr("Unlimited", "Unlimited (bandwidth)")); + kb_lbl->setText(QString::fromUtf8("")); + } + }else{ + // Global limit + int val = 0; + session *s = BTSession->getSession(); + if(uploadMode){ + if(s->upload_rate_limit() > 0) + val = (int)(s->upload_rate_limit()/1024.); + }else{ + if(s->download_rate_limit() > 0) + val = (int)(s->download_rate_limit()/1024.); + } + if(val == 0){ + bandwidthSlider->setValue(0); + limit_lbl->setText(tr("Unlimited", "Unlimited (bandwidth)")); + kb_lbl->setText(QString::fromUtf8("")); + }else{ + bandwidthSlider->setValue(val); + } + } + connect(buttonBox, SIGNAL(accepted()), this, SLOT(setBandwidth())); + show(); + } + + ~BandwidthAllocationDialog(){ + qDebug("Deleting bandwidth allocation dialog"); + } + + protected slots: + void updateBandwidthLabel(int val){ + if(val == 0){ + limit_lbl->setText(tr("Unlimited", "Unlimited (bandwidth)")); + kb_lbl->setText(QString::fromUtf8("")); + }else{ + limit_lbl->setText(misc::toQString(val)); + kb_lbl->setText(tr("KiB/s")); + } + } + + void setBandwidth(){ + qDebug("setBandwidth called"); + int val = bandwidthSlider->value(); + if(!global){ + QString hash; + if(uploadMode) { + foreach(hash, hashes) { + if(!val) + BTSession->setUploadLimit(hash, -1); + else + BTSession->setUploadLimit(hash, val*1024); + qDebug("Setting upload limit"); + } + } else { + foreach(hash, hashes) { + if(!val) + BTSession->setDownloadLimit(hash, -1); + else + BTSession->setDownloadLimit(hash, val*1024); + qDebug("Setting download limit"); + } + } + }else{ + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + session *s = BTSession->getSession(); + if(uploadMode){ + if(!val) + s->set_upload_rate_limit(-1); + else + s->set_upload_rate_limit(val*1024); + settings.setValue(QString::fromUtf8("Preferences/Connection/GlobalUPLimit"), val); + }else{ + if(!val) + s->set_download_rate_limit(-1); + else + s->set_download_rate_limit(val*1024); + settings.setValue(QString::fromUtf8("Preferences/Connection/GlobalDLLimit"), val); + } + } + close(); + } + + private: + bool uploadMode; + bool global; + bittorrent *BTSession; + QStringList hashes; +}; + +#endif diff --git a/src/arborescence.h b/src/arborescence.h new file mode 100644 index 000000000..5b6ff0f87 --- /dev/null +++ b/src/arborescence.h @@ -0,0 +1,270 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef ARBORESCENCE_H +#define ARBORESCENCE_H + +#include +#include +#include +#include "misc.h" + +class torrent_file { +private: + torrent_file *parent; + bool is_dir; + QString rel_path; + QList children; + size_type size; + float progress; + int priority; + int index; // Index in torrent_info + +public: + torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){ + qDebug("created a file with index %d", index); + rel_path = QDir::cleanPath(path); + Q_ASSERT(progress >= 0.); + Q_ASSERT(progress <= 1.); + if(parent) { + parent->updateProgress(); + parent->updatePriority(priority); + } + } + + ~torrent_file() { + qDeleteAll(children); + } + + QString path() const { + return rel_path; + } + + QString name() const { + return rel_path.split(QDir::separator()).last(); + } + + void updateProgress() { + Q_ASSERT(is_dir); + if(children.isEmpty()) { + progress = 0.; + return; + } + double wanted = 0.; + double done = 0.; + foreach(const torrent_file *child, children) { + wanted += child->getSize(); + done += child->getSize()*child->getProgress(); + } + progress = done / wanted; + Q_ASSERT(progress >= 0.); + Q_ASSERT(progress <= 1.); + } + + void updatePriority(int prio) { + Q_ASSERT(is_dir); + foreach(const torrent_file *child, children) { + if(child->getPriority() != prio) return; + } + priority = prio; + } + + int getPriority() const { + return priority; + } + + size_type getSize() const { + return size; + } + + float getProgress() const { + return progress; + } + + int getIndex() const { + return index; + } + + bool isDir() const { + return is_dir; + } + + bool hasChildren() const { + return (!children.isEmpty()); + } + + QList getChildren() const { + return children; + } + + const torrent_file* getChild(QString fileName) const { + Q_ASSERT(is_dir); + foreach(const torrent_file *f, children) { + if(f->name() == fileName) return f; + } + return 0; + } + + void addBytes(size_type b) { + size += b; + if(parent) + parent->addBytes(b); + } + + torrent_file* addChild(QString fileName, bool dir, size_type size=0, int index = -1, float progress=0., int priority=1) { + Q_ASSERT(is_dir); + qDebug("Adding a new child of size: %ld", (long)size); + torrent_file *f = new torrent_file(this, QDir::cleanPath(rel_path+QDir::separator()+fileName), dir, size, index, progress, priority); + children << f; + if(size) { + addBytes(size); + } + return f; + } + + bool removeFromFS(QString saveDir) const { + QString full_path = saveDir + QDir::separator() + rel_path; + if(!QFile::exists(full_path)) { + qDebug("%s does not exist, no need to remove it", full_path.toLocal8Bit().data()); + return true; + } + bool success = true; + qDebug("We have %d children", children.size()); + foreach(const torrent_file *f, children) { + bool s = f->removeFromFS(saveDir); + success = s && success; + } + if(is_dir) { + qDebug("trying to remove directory: %s", full_path.toLocal8Bit().data()); + QDir dir(full_path); + dir.rmdir(full_path); + } else { + qDebug("trying to remove file: %s", full_path.toLocal8Bit().data()); + bool s = QFile::remove(full_path); + success = s && success; + } + return success; + } +}; + +class arborescence { +private: + torrent_file *root; + +public: + arborescence(boost::intrusive_ptr t) { + torrent_info::file_iterator fi = t->begin_files(); + if(t->num_files() > 1) { + root = new torrent_file(0, misc::toQString(t->name()), true); + } else { + // XXX: Will crash if there is no file in torrent + root = new torrent_file(0, misc::toQString(t->name()), false, fi->size, 0); + return; + } + int i = 0; + while(fi != t->end_files()) { + QString path = QDir::cleanPath(misc::toQString(fi->path.string())); + addFile(path, fi->size, i); + fi++; + ++i; + } + qDebug("real size: %ld, tree size: %ld", (long)t->total_size(), (long)root->getSize()); + Q_ASSERT(root->getSize() == t->total_size()); + } + + arborescence(torrent_info const& t, std::vector fp, std::vector files_priority) { + torrent_info::file_iterator fi = t.begin_files(); + if(t.num_files() > 1) { + qDebug("More than one file in the torrent, setting a folder as root"); + root = new torrent_file(0, misc::toQString(t.name()), true); + } else { + // XXX: Will crash if there is no file in torrent + qDebug("one file in the torrent, setting it as root with index 0"); + root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((double)fp[0])/t.file_at(0).size, files_priority.at(0)); + return; + } + int i = 0; + while(fi != t.end_files()) { + QString path = QDir::cleanPath(misc::toQString(fi->path.string())); + addFile(path, fi->size, i, ((double)fp[i])/t.file_at(i).size, files_priority.at(i)); + fi++; + ++i; + } + qDebug("real size: %ld, tree size: %ld", (long)t.total_size(), (long)root->getSize()); + Q_ASSERT(root->getSize() == t.total_size()); + } + + ~arborescence() { + delete root; + } + + torrent_file* getRoot() const { + return root; + } + + bool removeFromFS(QString saveDir) { + if(!QFile::exists(saveDir+QDir::separator()+root->path())) return true; + bool success = root->removeFromFS(saveDir); + QDir root_dir(root->path()); + root_dir.rmdir(saveDir+QDir::separator()+root->path()); + return success; + } + +protected: + void addFile(QString path, size_type file_size, int index, float progress=0., int priority=1) { + Q_ASSERT(root->isDir()); + path = QDir::cleanPath(path); + //Q_ASSERT(path.startsWith(root->path())); + QString relative_path = path.remove(0, root->path().size()); + if(relative_path.at(0) ==QDir::separator()) + relative_path.remove(0, 1); + QStringList fileNames = relative_path.split(QDir::separator()); + torrent_file *dad = root; + unsigned int nb_i = 0; + unsigned int size = fileNames.size(); + foreach(const QString &fileName, fileNames) { + ++nb_i; + if(fileName == ".") continue; + const torrent_file* child = dad->getChild(fileName); + if(!child) { + if(nb_i != size) { + // Folder + child = dad->addChild(fileName, true); + } else { + // File + child = dad->addChild(fileName, false, file_size, index, progress, priority); + } + } + dad = (torrent_file*)child; + } + } +}; + +#endif diff --git a/src/bandwidth_limit.ui b/src/bandwidth_limit.ui new file mode 100644 index 000000000..62ea9c192 --- /dev/null +++ b/src/bandwidth_limit.ui @@ -0,0 +1,113 @@ + + bandwidth_dlg + + + + 0 + 0 + 222 + 129 + + + + Bandwidth allocation + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + KiB/s + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 1000 + + + 0 + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + + + buttonBox + rejected() + bandwidth_dlg + reject() + + + 212 + 83 + + + 221 + 98 + + + + + diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp new file mode 100644 index 000000000..085d0da90 --- /dev/null +++ b/src/bittorrent.cpp @@ -0,0 +1,1766 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "bittorrent.h" +#include "misc.h" +#include "downloadThread.h" +#include "filterParserThread.h" +#include "torrentPersistentData.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_TRACKER_ERRORS 2 +#define MAX_RATIO 100. + +// Main constructor +bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause(false), maxConnecsPerTorrent(500), maxUploadsPerTorrent(4), ratio_limit(-1), UPnPEnabled(false), NATPMPEnabled(false), LSDEnabled(false), queueingEnabled(false) { + // To avoid some exceptions + fs::path::default_name_check(fs::no_check); + // Creating bittorrent session + // Check if we should spoof utorrent + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(settings.value(QString::fromUtf8("Preferences/Bittorrent/AzureusSpoof"), false).toBool()) { + s = new session(fingerprint("UT", 1, 8, 4, 0), 0); + qDebug("Peer ID: %s", fingerprint("UT", 1, 8, 4, 0).to_string().c_str()); + } else { + s = new session(fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0), 0); + qDebug("Peer ID: %s", fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0).to_string().c_str()); + } + + // Set severity level of libtorrent session + //s->set_alert_mask(alert::all_categories & ~alert::progress_notification); + s->set_alert_mask(alert::error_notification | alert::peer_notification | alert::port_mapping_notification | alert::storage_notification | alert::tracker_notification | alert::status_notification | alert::ip_block_notification); + // Load previous state + loadSessionState(); + // Enabling plugins + s->add_extension(&create_metadata_plugin); + s->add_extension(&create_ut_metadata_plugin); + s->add_extension(&create_ut_pex_plugin); + s->add_extension(&create_smart_ban_plugin); + timerAlerts = new QTimer(); + connect(timerAlerts, SIGNAL(timeout()), this, SLOT(readAlerts())); + timerAlerts->start(3000); + // To download from urls + downloader = new downloadThread(this); + connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processDownloadedFile(QString, QString))); + connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(handleDownloadFailure(QString, QString))); + BigRatioTimer = 0; + filterParser = 0; + FSWatcher = 0; + qDebug("* BTSession constructed"); +} + +// Main destructor +bittorrent::~bittorrent() { + qDebug("BTSession deletion"); + // Do some BT related saving + // XXX: Done in GUI now (earlier = safer) + /*saveDHTEntry(); + saveSessionState(); + tResumeData();*/ + // Disable directory scanning + disableDirectoryScanning(); + // Delete our objects + delete timerAlerts; + if(BigRatioTimer) + delete BigRatioTimer; + if(filterParser) + delete filterParser; + delete downloader; + if(FSWatcher) { + delete FSWatcher; + delete FSMutex; + } + // Delete BT session + qDebug("Deleting session"); + delete s; + qDebug("Session deleted"); +} + +void bittorrent::preAllocateAllFiles(bool b) { + bool change = (preAllocateAll != b); + if(change) { + qDebug("PreAllocateAll changed, reloading all torrents!"); + preAllocateAll = b; + } +} + +void bittorrent::deleteBigRatios() { + if(ratio_limit == -1) return; + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(h.is_seed()) { + QString hash = h.hash(); + float ratio = getRealRatio(hash); + if(ratio <= MAX_RATIO && ratio > ratio_limit) { + QString fileName = h.name(); + addConsoleMessage(tr("%1 reached the maximum ratio you set.").arg(fileName)); + deleteTorrent(hash); + //emit torrent_ratio_deleted(fileName); + } + } + } +} + +void bittorrent::setDownloadLimit(QString hash, long val) { + QTorrentHandle h = getTorrentHandle(hash); + if(h.is_valid()) { + h.set_download_limit(val); + TorrentPersistentData::saveSpeedLimits(h); + } +} + +bool bittorrent::isQueueingEnabled() const { + return queueingEnabled; +} + +void bittorrent::increaseDlTorrentPriority(QString hash) { + Q_ASSERT(queueingEnabled); + QTorrentHandle h = getTorrentHandle(hash); + if(h.queue_position() > 0) + h.queue_position_up(); +} + +void bittorrent::decreaseDlTorrentPriority(QString hash) { + Q_ASSERT(queueingEnabled); + QTorrentHandle h = getTorrentHandle(hash); + h.queue_position_down(); +} + +void bittorrent::setUploadLimit(QString hash, long val) { + qDebug("Set upload limit rate to %ld", val); + QTorrentHandle h = getTorrentHandle(hash); + if(h.is_valid()) { + h.set_upload_limit(val); + TorrentPersistentData::saveSpeedLimits(h); + } +} + +void bittorrent::handleDownloadFailure(QString url, QString reason) { + emit downloadFromUrlFailure(url, reason); + // Clean up + int index = url_skippingDlg.indexOf(url); + if(index >= 0) + url_skippingDlg.removeAt(index); + if(savepath_fromurl.contains(url)) + savepath_fromurl.remove(url); +} + +void bittorrent::startTorrentsInPause(bool b) { + addInPause = b; +} + +void bittorrent::setQueueingEnabled(bool enable) { + if(queueingEnabled != enable) { + qDebug("Queueing system is changing state..."); + queueingEnabled = enable; + } +} + +int bittorrent::getDlTorrentPriority(QString hash) const { + Q_ASSERT(queueingEnabled); + QTorrentHandle h = getTorrentHandle(hash); + return h.queue_position(); +} + +int bittorrent::getUpTorrentPriority(QString hash) const { + Q_ASSERT(queueingEnabled); + QTorrentHandle h = getTorrentHandle(hash); + return h.queue_position(); +} + +// Calculate the ETA using GASA +// GASA: global Average Speed Algorithm +qlonglong bittorrent::getETA(QString hash) const { + QTorrentHandle h = getTorrentHandle(hash); + if(!h.is_valid()) return -1; + switch(h.state()) { + case torrent_status::downloading: { + if(h.active_time() == 0) + return -1; + double avg_speed = (double)h.all_time_download() / h.active_time(); + return (qlonglong) floor((double) (h.actual_size() - h.total_wanted_done()) / avg_speed); + } + default: + return -1; + } +} + +std::vector bittorrent::getTorrents() const { + return s->get_torrents(); +} + +// Return the torrent handle, given its hash +QTorrentHandle bittorrent::getTorrentHandle(QString hash) const{ + return QTorrentHandle(s->find_torrent(misc::fromString((hash.toStdString())))); +} + +unsigned int bittorrent::getFinishedPausedTorrentsNb() const { + unsigned int nbPaused = 0; + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(h.is_seed() && h.is_paused()) { + ++nbPaused; + } + } + return nbPaused; +} + +unsigned int bittorrent::getUnfinishedPausedTorrentsNb() const { + unsigned int nbPaused = 0; + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(!h.is_seed() && h.is_paused()) { + ++nbPaused; + } + } + return nbPaused; +} + +// Delete a torrent from the session, given its hash +// permanent = true means that the torrent will be removed from the hard-drive too +void bittorrent::deleteTorrent(QString hash, bool permanent) { + qDebug("Deleting torrent with hash: %s", hash.toLocal8Bit().data()); + QTorrentHandle h = getTorrentHandle(hash); + if(!h.is_valid()) { + qDebug("/!\\ Error: Invalid handle"); + return; + } + QString savePath = h.save_path(); + QString fileName = h.name(); + // Remove it from session + if(permanent) + s->remove_torrent(h.get_torrent_handle(), session::delete_files); + else + s->remove_torrent(h.get_torrent_handle()); + // Remove it from torrent backup directory + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList filters; + filters << hash+".*"; + QStringList files = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted); + foreach(const QString &file, files) { + torrentBackup.remove(file); + } + TorrentPersistentData::deletePersistentData(hash); + // Remove tracker errors + trackersErrors.remove(hash); + if(permanent) + addConsoleMessage(tr("'%1' was removed permanently.", "'xxx.avi' was removed permanently.").arg(fileName)); + else + addConsoleMessage(tr("'%1' was removed.", "'xxx.avi' was removed.").arg(fileName)); + emit deletedTorrent(hash); +} + +void bittorrent::pauseAllTorrents() { + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(!h.is_paused()) { + h.pause(); + emit pausedTorrent(h); + } + } +} + +void bittorrent::resumeAllTorrents() { + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(h.is_paused()) { + h.resume(); + emit resumedTorrent(h); + } + } +} + +void bittorrent::pauseTorrent(QString hash) { + QTorrentHandle h = getTorrentHandle(hash); + if(!h.is_paused()) { + h.pause(); + emit pausedTorrent(h); + } +} + +void bittorrent::resumeTorrent(QString hash) { + QTorrentHandle h = getTorrentHandle(hash); + if(h.is_paused()) { + h.resume(); + emit resumedTorrent(h); + } +} + +void bittorrent::loadWebSeeds(QString hash) { + QVariantList url_seeds = TorrentPersistentData::getUrlSeeds(hash); + QTorrentHandle h = getTorrentHandle(hash); + // First remove from the torrent the url seeds that were deleted + // in a previous session + QStringList seeds_to_delete; + QStringList existing_seeds = h.url_seeds(); + foreach(const QString &existing_seed, existing_seeds) { + if(!url_seeds.contains(existing_seed.toLocal8Bit())) { + seeds_to_delete << existing_seed; + } + } + foreach(const QString &existing_seed, seeds_to_delete) { + h.remove_url_seed(existing_seed); + } + // Add the ones that were added in a previous session + foreach(const QVariant &var_url_seed, url_seeds) { + QString url_seed = var_url_seed.toString(); + if(!url_seed.isEmpty()) { + // XXX: Should we check if it is already in the list before adding it + // or is libtorrent clever enough to know + h.add_url_seed(url_seed); + } + } +} + +QTorrentHandle bittorrent::addMagnetUri(QString magnet_uri, bool resumed) { + QTorrentHandle h; + QString hash = misc::magnetUriToHash(magnet_uri); + if(hash.isEmpty()) { + addConsoleMessage(tr("'%1' is not a valid magnet URI.").arg(magnet_uri)); + return h; + } + if(resumed) { + qDebug("Resuming magnet URI: %s", hash.toLocal8Bit().data()); + } else { + qDebug("Adding new magnet URI"); + } + + bool fastResume=false; + Q_ASSERT(magnet_uri.startsWith("magnet:")); + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + // Checking if BT_backup Dir exists + // create it if it is not + if(! torrentBackup.exists()) { + if(! torrentBackup.mkpath(torrentBackup.path())) { + std::cerr << "Couldn't create the directory: '" << torrentBackup.path().toLocal8Bit().data() << "'\n"; + exit(1); + } + } + + // Check if torrent is already in download list + if(s->find_torrent(sha1_hash(hash.toLocal8Bit().data())).is_valid()) { + qDebug("/!\\ Torrent is already in download list"); + // Update info Bar + addConsoleMessage(tr("'%1' is already in download list.", "e.g: 'xxx.avi' is already in download list.").arg(magnet_uri)); + return h; + } + + add_torrent_params p; + //Getting fast resume data if existing + std::vector buf; + if(resumed) { + qDebug("Trying to load fastresume data: %s", (torrentBackup.path()+QDir::separator()+hash+QString(".fastresume")).toLocal8Bit().data()); + if (load_file((torrentBackup.path()+QDir::separator()+hash+QString(".fastresume")).toLocal8Bit().data(), buf) == 0) { + fastResume = true; + p.resume_data = &buf; + qDebug("Successfuly loaded"); + } + } + QString savePath = getSavePath(hash); + qDebug("addMagnetURI: using save_path: %s", savePath.toLocal8Bit().data()); + if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) { + p.save_path = savePath.toLocal8Bit().data(); + } else { + p.save_path = defaultTempPath.toLocal8Bit().data(); + } + // Preallocate all? + if(preAllocateAll) + p.storage_mode = storage_mode_allocate; + else + p.storage_mode = storage_mode_sparse; + // Start in pause + p.paused = false; + p.duplicate_is_error = false; // Already checked + p.auto_managed = false; // Because it is added in paused state + // Adding torrent to bittorrent session + try { + h = QTorrentHandle(add_magnet_uri(*s, magnet_uri.toStdString(), p)); + }catch(std::exception e){ + qDebug("Error: %s", e.what()); + } + // Check if it worked + if(!h.is_valid()) { + // No need to keep on, it failed. + qDebug("/!\\ Error: Invalid handle"); + return h; + } + Q_ASSERT(h.hash() == hash); + // Connections limit per torrent + h.set_max_connections(maxConnecsPerTorrent); + // Uploads limit per torrent + h.set_max_uploads(maxUploadsPerTorrent); + // Load filtered files + if(resumed) { + // Load custom url seeds + loadWebSeeds(hash); + // Load speed limit from hard drive + loadTorrentSpeedLimits(hash); + // Load trackers + loadTrackerFile(hash); + // XXX: only when resuming because torrentAddition dialog is not supported yet + loadFilesPriorities(h); + } else { + // Sequential download + if(TorrentTempData::hasTempData(hash)) { + qDebug("addMagnetUri: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(hash)); + } + // Save persistent data for new torrent + Q_ASSERT(h.is_valid()); + qDebug("addMagnetUri: hash: %s", h.hash().toLocal8Bit().data()); + TorrentPersistentData::saveTorrentPersistentData(h, true); + qDebug("Persistent data saved"); + // Save save_path + if(!defaultTempPath.isEmpty()) { + qDebug("addMagnetUri: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(hash, savePath); + } + } + if(!addInPause && !fastResume) { + // Start torrent because it was added in paused state + h.resume(); + } + // Send torrent addition signal + if(fastResume) + addConsoleMessage(tr("'%1' resumed. (fast resume)", "'/home/y/xxx.torrent' was resumed. (fast resume)").arg(magnet_uri)); + else + addConsoleMessage(tr("'%1' added to download list.", "'/home/y/xxx.torrent' was added to download list.").arg(magnet_uri)); + emit addedTorrent(h); + return h; +} + +// Add a torrent to the bittorrent session +QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString from_url, bool resumed) { + QTorrentHandle h; + bool fastResume=false; + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QString file, dest_file, hash; + boost::intrusive_ptr t; + + // Checking if BT_backup Dir exists + // create it if it is not + if(! torrentBackup.exists()) { + if(! torrentBackup.mkpath(torrentBackup.path())) { + std::cerr << "Couldn't create the directory: '" << torrentBackup.path().toLocal8Bit().data() << "'\n"; + exit(1); + } + } + // Processing torrents + file = path.trimmed().replace("file://", "", Qt::CaseInsensitive); + if(file.isEmpty()) { + return h; + } + Q_ASSERT(!file.startsWith("http://", Qt::CaseInsensitive) && !file.startsWith("https://", Qt::CaseInsensitive) && !file.startsWith("ftp://", Qt::CaseInsensitive)); + + qDebug("Adding %s to download list", file.toLocal8Bit().data()); + try { + // Getting torrent file informations + t = new torrent_info(file.toLocal8Bit().data()); + } catch(std::exception&) { + if(!from_url.isNull()) { + addConsoleMessage(tr("Unable to decode torrent file: '%1'", "e.g: Unable to decode torrent file: '/home/y/xxx.torrent'").arg(from_url), QString::fromUtf8("red")); + //emit invalidTorrent(from_url); + QFile::remove(file); + }else{ + addConsoleMessage(tr("Unable to decode torrent file: '%1'", "e.g: Unable to decode torrent file: '/home/y/xxx.torrent'").arg(file), QString::fromUtf8("red")); + //emit invalidTorrent(file); + } + addConsoleMessage(tr("This file is either corrupted or this isn't a torrent."),QString::fromUtf8("red")); + if(fromScanDir) { + // Remove file + QFile::remove(file); + } + return h; + } + qDebug(" -> Hash: %s", misc::toString(t->info_hash()).c_str()); + qDebug(" -> Name: %s", t->name().c_str()); + hash = misc::toQString(t->info_hash()); + + // Check if torrent is already in download list + if(s->find_torrent(t->info_hash()).is_valid()) { + qDebug("/!\\ Torrent is already in download list"); + // Update info Bar + if(!fromScanDir) { + if(!from_url.isNull()) { + // If download from url, remove temp file + QFile::remove(file); + addConsoleMessage(tr("'%1' is already in download list.", "e.g: 'xxx.avi' is already in download list.").arg(from_url)); + //emit duplicateTorrent(from_url); + }else{ + addConsoleMessage(tr("'%1' is already in download list.", "e.g: 'xxx.avi' is already in download list.").arg(file)); + //emit duplicateTorrent(file); + } + }else{ + // Delete torrent from scan dir + QFile::remove(file); + } + return h; + } + add_torrent_params p; + //Getting fast resume data if existing + std::vector buf; + if(resumed) { + qDebug("Trying to load fastresume data: %s", (torrentBackup.path()+QDir::separator()+hash+QString(".fastresume")).toLocal8Bit().data()); + if (load_file((torrentBackup.path()+QDir::separator()+hash+QString(".fastresume")).toLocal8Bit().data(), buf) == 0) { + fastResume = true; + p.resume_data = &buf; + qDebug("Successfuly loaded"); + } + } + QString savePath; + if(!from_url.isEmpty() && savepath_fromurl.contains(from_url)) { + // Enforcing the save path defined before URL download (from RSS for example) + savePath = savepath_fromurl.take(from_url); + } else { + savePath = getSavePath(hash); + } + qDebug("addTorrent: using save_path: %s", savePath.toLocal8Bit().data()); + if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) { + p.save_path = savePath.toLocal8Bit().data(); + } else { + p.save_path = defaultTempPath.toLocal8Bit().data(); + } + // TODO: Remove in v1.6.0: For backward compatibility only + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".finished")) { + p.save_path = savePath.toLocal8Bit().data(); + QFile::remove(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".finished"); + } + p.ti = t; + // Preallocate all? + if(preAllocateAll) + p.storage_mode = storage_mode_allocate; + else + p.storage_mode = storage_mode_sparse; + // Start in pause + p.paused = true; + p.duplicate_is_error = false; // Already checked + p.auto_managed = false; // Because it is added in paused state + // Adding torrent to bittorrent session + try { + h = QTorrentHandle(s->add_torrent(p)); + }catch(std::exception e){ + qDebug("Error: %s", e.what()); + } + // Check if it worked + if(!h.is_valid()) { + // No need to keep on, it failed. + qDebug("/!\\ Error: Invalid handle"); + // If download from url, remove temp file + if(!from_url.isNull()) QFile::remove(file); + return h; + } + // Connections limit per torrent + h.set_max_connections(maxConnecsPerTorrent); + // Uploads limit per torrent + h.set_max_uploads(maxUploadsPerTorrent); + // Load filtered files + loadFilesPriorities(h); + if(resumed) { + // Load custom url seeds + loadWebSeeds(hash); + // Load speed limit from hard drive + loadTorrentSpeedLimits(hash); + // Load trackers + loadTrackerFile(hash); + } else { + // Sequential download + if(TorrentTempData::hasTempData(hash)) { + qDebug("addTorrent: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(hash)); + } + // Save persistent data for new torrent + TorrentPersistentData::saveTorrentPersistentData(h); + // Save save_path + if(!defaultTempPath.isEmpty()) { + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(hash, savePath); + } + } + QString newFile = torrentBackup.path() + QDir::separator() + hash + ".torrent"; + if(file != newFile) { + // Delete file from torrentBackup directory in case it exists because + // QFile::copy() do not overwrite + QFile::remove(newFile); + // Copy it to torrentBackup directory + QFile::copy(file, newFile); + } + if(!addInPause && !fastResume) { + // Start torrent because it was added in paused state + h.resume(); + } + // If download from url, remove temp file + if(!from_url.isNull()) QFile::remove(file); + // Delete from scan dir to avoid trying to download it again + if(fromScanDir) { + QFile::remove(file); + } + // Send torrent addition signal + if(!from_url.isNull()) { + if(fastResume) + addConsoleMessage(tr("'%1' resumed. (fast resume)", "'/home/y/xxx.torrent' was resumed. (fast resume)").arg(from_url)); + else + addConsoleMessage(tr("'%1' added to download list.", "'/home/y/xxx.torrent' was added to download list.").arg(from_url)); + }else{ + if(fastResume) + addConsoleMessage(tr("'%1' resumed. (fast resume)", "'/home/y/xxx.torrent' was resumed. (fast resume)").arg(file)); + else + addConsoleMessage(tr("'%1' added to download list.", "'/home/y/xxx.torrent' was added to download list.").arg(file)); + } + emit addedTorrent(h); + return h; +} + + + +// Check if the user filtered files in this torrent. +bool bittorrent::has_filtered_files(QString hash) const{ + QVariantList files_priority = TorrentPersistentData::getFilesPriority(hash); + foreach(QVariant var_prio, files_priority) { + int priority = var_prio.toInt(); + if( priority < 0 || priority > 7) { + priority = 1; + } + if(!priority) + return true; + } + return false; +} + +// Set the maximum number of opened connections +void bittorrent::setMaxConnections(int maxConnec) { + s->set_max_connections(maxConnec); +} + +void bittorrent::setMaxConnectionsPerTorrent(int max) { + maxConnecsPerTorrent = max; + // Apply this to all session torrents + std::vector handles = s->get_torrents(); + unsigned int nbHandles = handles.size(); + for(unsigned int i=0; i handles = s->get_torrents(); + unsigned int nbHandles = handles.size(); + for(unsigned int i=0; istart_upnp(); + UPnPEnabled = true; + } + } else { + if(UPnPEnabled) { + qDebug("Disabling UPnP"); + s->stop_upnp(); + UPnPEnabled = false; + } + } +} + +void bittorrent::enableNATPMP(bool b) { + if(b) { + if(!NATPMPEnabled) { + qDebug("Enabling NAT-PMP"); + s->start_natpmp(); + NATPMPEnabled = true; + } + } else { + if(NATPMPEnabled) { + qDebug("Disabling NAT-PMP"); + s->stop_natpmp(); + NATPMPEnabled = false; + } + } +} + +void bittorrent::enableLSD(bool b) { + if(b) { + if(!LSDEnabled) { + qDebug("Enabling LSD"); + s->start_lsd(); + LSDEnabled = true; + } + } else { + if(LSDEnabled) { + qDebug("Disabling LSD"); + s->stop_lsd(); + LSDEnabled = false; + } + } +} + +void bittorrent::loadSessionState() { + boost::filesystem::ifstream ses_state_file((misc::qBittorrentPath()+QString::fromUtf8("ses_state")).toLocal8Bit().data() + , std::ios_base::binary); + ses_state_file.unsetf(std::ios_base::skipws); + s->load_state(bdecode( + std::istream_iterator(ses_state_file) + , std::istream_iterator())); +} + +void bittorrent::saveSessionState() { + qDebug("Saving session state to disk..."); + entry session_state = s->state(); + boost::filesystem::ofstream out((misc::qBittorrentPath()+QString::fromUtf8("ses_state")).toLocal8Bit().data() + , std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), session_state); +} + +// Enable DHT +bool bittorrent::enableDHT(bool b) { + if(b) { + if(!DHTEnabled) { + entry dht_state; + QString dht_state_path = misc::qBittorrentPath()+QString::fromUtf8("dht_state"); + if(QFile::exists(dht_state_path)) { + boost::filesystem::ifstream dht_state_file(dht_state_path.toLocal8Bit().data(), std::ios_base::binary); + dht_state_file.unsetf(std::ios_base::skipws); + try{ + dht_state = bdecode(std::istream_iterator(dht_state_file), std::istream_iterator()); + }catch (std::exception&) {} + } + try { + s->start_dht(dht_state); + s->add_dht_router(std::make_pair(std::string("router.bittorrent.com"), 6881)); + s->add_dht_router(std::make_pair(std::string("router.utorrent.com"), 6881)); + s->add_dht_router(std::make_pair(std::string("router.bitcomet.com"), 6881)); + DHTEnabled = true; + qDebug("DHT enabled"); + }catch(std::exception e) { + qDebug("Could not enable DHT, reason: %s", e.what()); + return false; + } + } + } else { + if(DHTEnabled) { + DHTEnabled = false; + s->stop_dht(); + qDebug("DHT disabled"); + } + } + return true; +} + +void bittorrent::loadTorrentSpeedLimits(QString hash) { + QTorrentHandle h = getTorrentHandle(hash); + qDebug("Loading speedLimits file for %s", hash.toLocal8Bit().data()); + h.set_download_limit(TorrentPersistentData::getDownloadLimit(hash)); + h.set_upload_limit(TorrentPersistentData::getUploadLimit(hash)); +} + +// Read pieces priorities from hard disk +// and ask QTorrentHandle to consider them +void bittorrent::loadFilesPriorities(QTorrentHandle &h) { + qDebug("Applying files priority"); + if(!h.is_valid()) { + qDebug("/!\\ Error: Invalid handle"); + return; + } + std::vector v; + QVariantList files_priority; + if(TorrentTempData::hasTempData(h.hash())) { + files_priority = TorrentTempData::getFilesPriority(h.hash()); + } else { + files_priority = TorrentPersistentData::getFilesPriority(h.hash()); + } + foreach(const QVariant &var_prio, files_priority) { + int priority = var_prio.toInt(); + if( priority < 0 || priority > 7) { + priority = 1; + } + qDebug("Setting file piority to %d", priority); + v.push_back(priority); + } + h.prioritize_files(v); +} + +float bittorrent::getRealRatio(QString hash) const{ + QTorrentHandle h = getTorrentHandle(hash); + Q_ASSERT(h.all_time_download() >= 0); + Q_ASSERT(h.all_time_upload() >= 0); + if(h.all_time_download() == 0) { + if(h.all_time_upload() == 0) + return 0; + return 101; + } + float ratio = (float)h.all_time_upload()/(float)h.all_time_download(); + Q_ASSERT(ratio >= 0.); + if(ratio > 100.) + ratio = 100.; + return ratio; +} + +// Only save fast resume data for unfinished and unpaused torrents (Optimization) +// Called periodically and on exit +void bittorrent::saveFastResumeData() { + // Stop listening for alerts + timerAlerts->stop(); + int num_resume_data = 0; + // Pause session + s->pause(); + std::vector torrents = s->get_torrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid() || !h.has_metadata()) continue; + if(isQueueingEnabled()) + TorrentPersistentData::savePriority(h); + if(h.is_paused()) continue; + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) continue; + h.save_resume_data(); + ++num_resume_data; + } + while (num_resume_data > 0) { + alert const* a = s->wait_for_alert(seconds(30)); + if (a == 0) { + std::cerr << " aborting with " << num_resume_data << " outstanding " + "torrents to save resume data for" << std::endl; + break; + } + // Saving fastresume data can fail + save_resume_data_failed_alert const* rda = dynamic_cast(a); + if (rda) { + --num_resume_data; + s->pop_alert(); + // Remove torrent from session + s->remove_torrent(rda->handle); + continue; + } + save_resume_data_alert const* rd = dynamic_cast(a); + if (!rd) { + s->pop_alert(); + continue; + } + // Saving fast resume data was successful + --num_resume_data; + if (!rd->resume_data) continue; + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QTorrentHandle h(rd->handle); + // Remove old fastresume file if it exists + QFile::remove(torrentBackup.path()+QDir::separator()+ h.hash() + ".fastresume"); + QString file = h.hash()+".fastresume"; + boost::filesystem::ofstream out(fs::path(torrentBackup.path().toLocal8Bit().data()) / file.toLocal8Bit().data(), std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), *rd->resume_data); + // Remove torrent from session + s->remove_torrent(rd->handle); + s->pop_alert(); + } +} + +QStringList bittorrent::getConsoleMessages() const { + return consoleMessages; +} + +QStringList bittorrent::getPeerBanMessages() const { + return peerBanMessages; +} + +void bittorrent::addConsoleMessage(QString msg, QColor color) { + if(consoleMessages.size() > 100) { + consoleMessages.removeFirst(); + } + consoleMessages.append(QString::fromUtf8("")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8(" - ") + msg + QString::fromUtf8("")); +} + +void bittorrent::addPeerBanMessage(QString ip, bool from_ipfilter) { + if(peerBanMessages.size() > 100) { + peerBanMessages.removeFirst(); + } + if(from_ipfilter) + peerBanMessages.append(QString::fromUtf8("")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8(" - ")+tr("%1 was blocked due to your IP filter", "x.y.z.w was blocked").arg(ip)); + else + peerBanMessages.append(QString::fromUtf8("")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8(" - ")+tr("%1 was banned due to corrupt pieces", "x.y.z.w was banned").arg(ip)); +} + +bool bittorrent::isFilePreviewPossible(QString hash) const{ + // See if there are supported files in the torrent + QTorrentHandle h = getTorrentHandle(hash); + if(!h.is_valid()) { + qDebug("/!\\ Error: Invalid handle"); + return false; + } + unsigned int nbFiles = h.num_files(); + for(unsigned int i=0; ilock(); + qDebug("Scanning directory: %s", scan_dir.toLocal8Bit().data()); + QDir dir(scan_dir); + QStringList filters; + filters << "*.torrent"; + QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted); + foreach(const QString &file, files) { + QString fullPath = dir.path()+QDir::separator()+file; + QFile torrent(fullPath); + qDebug("Adding for scan_dir: %s", fullPath.toLocal8Bit().data()); + try { + torrent_info t(fullPath.toLocal8Bit().data()); + addTorrent(fullPath, true); + } catch(std::exception&) { + qDebug("Ignoring incomplete torrent file: %s", fullPath.toLocal8Bit().data()); + } + } + FSMutex->unlock(); +} + +void bittorrent::setDefaultSavePath(QString savepath) { + defaultSavePath = savepath; +} + +QString bittorrent::getDefaultSavePath() const { + return defaultSavePath; +} + +bool bittorrent::useTemporaryFolder() const { + return !defaultTempPath.isEmpty(); +} + +void bittorrent::setDefaultTempPath(QString temppath) { + if(defaultTempPath == temppath) + return; + if(temppath.isEmpty()) { + // Disabling temp dir + // Moving all torrents to their destination folder + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + h.move_storage(getSavePath(h.hash())); + } + } else { + std::vector torrents = getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + if(!h.is_seed()) + h.move_storage(temppath); + } + } + defaultTempPath = temppath; +} + +void bittorrent::saveTrackerFile(QString hash) { + QTorrentHandle h = getTorrentHandle(hash); + TorrentPersistentData::saveTrackers(h); +} + +// Enable directory scanning +void bittorrent::enableDirectoryScanning(QString scan_dir) { + if(!scan_dir.isEmpty()) { + QDir newDir(scan_dir); + if(!newDir.exists()) { + qDebug("Scan dir %s does not exist, create it", scan_dir.toUtf8().data()); + newDir.mkpath(scan_dir); + } + if(FSWatcher == 0) { + FSMutex = new QMutex(); + FSWatcher = new QFileSystemWatcher(QStringList(scan_dir), this); + connect(FSWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(scanDirectory(QString))); + // Initial scan + scanDirectory(scan_dir); + } else { + QString old_scan_dir = ""; + if(!FSWatcher->directories().empty()) + old_scan_dir = FSWatcher->directories().first(); + if(old_scan_dir != scan_dir) { + if(!old_scan_dir.isEmpty()) + FSWatcher->removePath(old_scan_dir); + FSWatcher->addPath(scan_dir); + // Initial scan + scanDirectory(scan_dir); + } + } + } +} + +// Disable directory scanning +void bittorrent::disableDirectoryScanning() { + if(FSWatcher) { + delete FSWatcher; + delete FSMutex; + } +} + +// Set the ports range in which is chosen the port the bittorrent +// session will listen to +void bittorrent::setListeningPort(int port) { + std::pair ports(port, port); + s->listen_on(ports); +} + +// Set download rate limit +// -1 to disable +void bittorrent::setDownloadRateLimit(long rate) { + qDebug("Setting a global download rate limit at %ld", rate); + s->set_download_rate_limit(rate); +} + +session* bittorrent::getSession() const{ + return s; +} + +// Set upload rate limit +// -1 to disable +void bittorrent::setUploadRateLimit(long rate) { + qDebug("set upload_limit to %fkb/s", rate/1024.); + s->set_upload_rate_limit(rate); +} + +// libtorrent allow to adjust ratio for each torrent +// This function will apply to same ratio to all torrents +void bittorrent::setGlobalRatio(float ratio) { + if(ratio != -1 && ratio < 1.) ratio = 1.; + if(ratio == -1) { + // 0 means unlimited for libtorrent + ratio = 0; + } + std::vector handles = s->get_torrents(); + unsigned int nbHandles = handles.size(); + for(unsigned int i=0; istart(5000); + } else { + if(ratio_limit != -1 && ratio == -1) { + delete BigRatioTimer; + } + } + if(ratio_limit != ratio) { + ratio_limit = ratio; + qDebug("* Set deleteRatio to %.1f", ratio_limit); + deleteBigRatios(); + } +} + +void bittorrent::loadTrackerFile(QString hash) { + QHash tiers = TorrentPersistentData::getTrackers(hash); + std::vector trackers; + foreach(const QString tracker_url, tiers.keys()) { + announce_entry t(tracker_url.toStdString()); + t.tier = tiers[tracker_url].toInt(); + trackers.push_back(t); + } + if(!trackers.empty()) { + QTorrentHandle h = getTorrentHandle(hash); + h.replace_trackers(trackers); + h.force_reannounce(); + } +} + +// Set DHT port (>= 1000 or 0 if same as BT) +void bittorrent::setDHTPort(int dht_port) { + if(dht_port == 0 or dht_port >= 1000) { + struct dht_settings DHTSettings; + DHTSettings.service_port = dht_port; + s->set_dht_settings(DHTSettings); + qDebug("Set DHT Port to %d", dht_port); + } +} + +// Enable IP Filtering +void bittorrent::enableIPFilter(QString filter) { + qDebug("Enabling IPFiler"); + if(!filterParser) { + filterParser = new FilterParserThread(this, s); + } + if(filterPath.isEmpty() || filterPath != filter) { + filterPath = filter; + filterParser->processFilterFile(filter); + } +} + +// Disable IP Filtering +void bittorrent::disableIPFilter() { + qDebug("Disabling IPFilter"); + s->set_ip_filter(ip_filter()); + if(filterParser) { + delete filterParser; + } + filterPath = ""; +} + +// Set BT session settings (user_agent) +void bittorrent::setSessionSettings(session_settings sessionSettings) { + qDebug("Set session settings"); + s->set_settings(sessionSettings); +} + +// Set Proxy +void bittorrent::setProxySettings(proxy_settings proxySettings, bool trackers, bool peers, bool web_seeds, bool dht) { + qDebug("Set Proxy settings"); + proxy_settings ps_null; + ps_null.type = proxy_settings::none; + qDebug("Setting trackers proxy"); + if(trackers) + s->set_tracker_proxy(proxySettings); + else + s->set_tracker_proxy(ps_null); + qDebug("Setting peers proxy"); + if(peers) + s->set_peer_proxy(proxySettings); + else + s->set_peer_proxy(ps_null); + qDebug("Setting web seeds proxy"); + if(web_seeds) + s->set_web_seed_proxy(proxySettings); + else + s->set_web_seed_proxy(ps_null); + if(DHTEnabled) { + qDebug("Setting DHT proxy, %d", dht); + if(dht) + s->set_dht_proxy(proxySettings); + else + s->set_dht_proxy(ps_null); + } +} + +// Read alerts sent by the bittorrent session +void bittorrent::readAlerts() { + // look at session alerts and display some infos + std::auto_ptr a = s->pop_alert(); + while (a.get()) { + if (torrent_finished_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()) { + emit finishedTorrent(h); + QString hash = h.hash(); + // Remember finished state + TorrentPersistentData::saveSeedStatus(h); + // Move to download directory if necessary + if(!defaultTempPath.isEmpty()) { + // Check if directory is different + QDir current_dir(h.save_path()); + QDir save_dir(getSavePath(h.hash())); + if(current_dir != save_dir) { + h.move_storage(save_dir.path()); + } + } + h.save_resume_data(); + // Check if there are torrent files inside + for(int i=0; i t; + try { + t = new torrent_info(torrent_fullpath.toLocal8Bit().data()); + QString sub_hash = misc::toQString(t->info_hash()); + // Passing the save path along to the sub torrent file + TorrentTempData::setSavePath(sub_hash, h.save_path()); + addTorrent(torrent_fullpath); + } catch(std::exception&) { + qDebug("Caught error loading torrent"); + addConsoleMessage(tr("Unable to decode %1 torrent file.").arg(torrent_fullpath), QString::fromUtf8("red")); + } + } + } + qDebug("Received finished alert for %s", h.name().toLocal8Bit().data()); + } + } + else if (save_resume_data_alert* p = dynamic_cast(a.get())) { + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QTorrentHandle h(p->handle); + if(h.is_valid()) { + QString file = h.hash()+".fastresume"; + // Delete old fastresume file if necessary + if(QFile::exists(file)) + QFile::remove(file); + qDebug("Saving fastresume data in %s", file.toLocal8Bit().data()); + if (p->resume_data) + { + boost::filesystem::ofstream out(fs::path(torrentBackup.path().toLocal8Bit().data()) / file.toLocal8Bit().data(), std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), *p->resume_data); + } + } + } + else if (metadata_received_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()) { + qDebug("Received metadata for %s", h.hash().toLocal8Bit().data()); + emit metadataReceived(h); + if(h.is_paused()) { + // XXX: Unfortunately libtorrent-rasterbar does not send a torrent_paused_alert + // and the torrent can be paused when metadata is received + emit torrentPaused(h); + } + } + } + else if (file_error_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()) { + h.auto_managed(false); + std::cerr << "File Error: " << p->message().c_str() << std::endl; + if(h.is_valid()) + emit fullDiskError(h, misc::toQString(p->message())); + } + } + else if (dynamic_cast(a.get())) { + // Level: fatal + addConsoleMessage(tr("Couldn't listen on any of the given ports."), QString::fromUtf8("red")); + //emit portListeningFailure(); + } + /*else if (torrent_paused_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + qDebug("Received a torrent_paused_alert for %s", h.hash().toLocal8Bit().data()); + if(h.is_valid()) { + emit torrentPaused(h); + } + }*/ + else if (tracker_error_alert* p = dynamic_cast(a.get())) { + // Level: fatal + QTorrentHandle h(p->handle); + if(h.is_valid()){ + // Authentication + if(p->status_code != 401) { + QString hash = h.hash(); + qDebug("Received a tracker error for %s", p->url.c_str()); + QHash errors = trackersErrors.value(hash, QHash()); + // p->url requires at least libtorrent v0.13.1 + errors[misc::toQString(p->url)] = QString::fromUtf8(a->message().c_str()); + trackersErrors[hash] = errors; + } else { + emit trackerAuthenticationRequired(h); + } + } + } + else if (tracker_reply_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()){ + qDebug("Received a tracker reply from %s", (const char*)h.current_tracker().toLocal8Bit()); + QString hash = h.hash(); + QHash errors = trackersErrors.value(hash, QHash()); + // p->url requires at least libtorrent v0.13.1 + errors.remove(h.current_tracker()); + trackersErrors[hash] = errors; + } + } + else if (portmap_error_alert* p = dynamic_cast(a.get())) { + addConsoleMessage(tr("UPnP/NAT-PMP: Port mapping failure, message: %1").arg(QString(p->message().c_str())), QColor("red")); + //emit UPnPError(QString(p->msg().c_str())); + } + else if (portmap_alert* p = dynamic_cast(a.get())) { + qDebug("UPnP Success, msg: %s", p->message().c_str()); + addConsoleMessage(tr("UPnP/NAT-PMP: Port mapping successful, message: %1").arg(QString(p->message().c_str())), QColor("blue")); + //emit UPnPSuccess(QString(p->msg().c_str())); + } + else if (peer_blocked_alert* p = dynamic_cast(a.get())) { + addPeerBanMessage(QString(p->ip.to_string().c_str()), true); + //emit peerBlocked(QString::fromUtf8(p->ip.to_string().c_str())); + } + else if (peer_ban_alert* p = dynamic_cast(a.get())) { + addPeerBanMessage(QString(p->ip.address().to_string().c_str()), false); + //emit peerBlocked(QString::fromUtf8(p->ip.to_string().c_str())); + } + else if (fastresume_rejected_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()){ + qDebug("/!\\ Fast resume failed for %s, reason: %s", h.name().toLocal8Bit().data(), p->message().c_str()); + addConsoleMessage(tr("Fast resume data was rejected for torrent %1, checking again...").arg(h.name()), QString::fromUtf8("red")); + //emit fastResumeDataRejected(h.name()); + } + } + else if (url_seed_alert* p = dynamic_cast(a.get())) { + addConsoleMessage(tr("Url seed lookup failed for url: %1, message: %2").arg(QString::fromUtf8(p->url.c_str())).arg(QString::fromUtf8(p->message().c_str())), QString::fromUtf8("red")); + //emit urlSeedProblem(QString::fromUtf8(p->url.c_str()), QString::fromUtf8(p->msg().c_str())); + } + else if (torrent_checked_alert* p = dynamic_cast(a.get())) { + QTorrentHandle h(p->handle); + if(h.is_valid()){ + QString hash = h.hash(); + qDebug("%s have just finished checking", hash.toLocal8Bit().data()); + // Move to temp directory if necessary + if(!h.is_seed() && !defaultTempPath.isEmpty()) { + // Check if directory is different + QDir current_dir(h.save_path()); + QDir save_dir(getSavePath(h.hash())); + if(current_dir == save_dir) { + h.move_storage(defaultTempPath); + } + } + emit torrentFinishedChecking(h); + emit metadataReceived(h); + } + } + a = s->pop_alert(); + } +} + +QHash bittorrent::getTrackersErrors(QString hash) const{ + return trackersErrors.value(hash, QHash()); +} + +int bittorrent::getListenPort() const{ + return s->listen_port(); +} + +session_status bittorrent::getSessionStatus() const{ + return s->status(); +} + +QString bittorrent::getSavePath(QString hash) { + QString savePath; + if(TorrentTempData::hasTempData(hash)) { + savePath = TorrentTempData::getSavePath(hash); + qDebug("getSavePath, got save_path from temp data: %s", savePath.toLocal8Bit().data()); + } else { + savePath = TorrentPersistentData::getSavePath(hash); + qDebug("getSavePath, got save_path from persistent data: %s", savePath.toLocal8Bit().data()); + } + if(savePath.isEmpty()) { + // use default save path if no other can be found + qDebug("Using default save path because none was set: %s", defaultSavePath.toLocal8Bit().data()); + savePath = defaultSavePath; + } + // Checking if savePath Dir exists + // create it if it is not + QDir saveDir(savePath); + if(!saveDir.exists()) { + if(!saveDir.mkpath(saveDir.path())) { + std::cerr << "Couldn't create the save directory: " << saveDir.path().toLocal8Bit().data() << "\n"; + // XXX: handle this better + return QDir::homePath(); + } + } + return savePath; +} + +// Take an url string to a torrent file, +// download the torrent file to a tmp location, then +// add it to download list +void bittorrent::downloadFromUrl(QString url) { + addConsoleMessage(tr("Downloading '%1', please wait...", "e.g: Downloading 'xxx.torrent', please wait...").arg(url), QPalette::WindowText); + //emit aboutToDownloadFromUrl(url); + // Launch downloader thread + downloader->downloadUrl(url); +} + +void bittorrent::downloadFromURLList(const QStringList& urls) { + foreach(const QString &url, urls) { + downloadFromUrl(url); + } +} + +void bittorrent::addMagnetSkipAddDlg(QString uri) { + addMagnetUri(uri, false); +} + +void bittorrent::downloadUrlAndSkipDialog(QString url, QString save_path) { + //emit aboutToDownloadFromUrl(url); + if(!save_path.isEmpty()) + savepath_fromurl[url] = save_path; + url_skippingDlg << url; + // Launch downloader thread + downloader->downloadUrl(url); +} + +// Add to bittorrent session the downloaded torrent file +void bittorrent::processDownloadedFile(QString url, QString file_path) { + int index = url_skippingDlg.indexOf(url); + if(index < 0) { + // Add file to torrent download list + emit newDownloadedTorrent(file_path, url); + } else { + url_skippingDlg.removeAt(index); + addTorrent(file_path, false, url, false); + } +} + +// Return current download rate for the BT +// session. Payload means that it only take into +// account "useful" part of the rate +float bittorrent::getPayloadDownloadRate() const{ + session_status sessionStatus = s->status(); + return sessionStatus.payload_download_rate; +} + +// Return current upload rate for the BT +// session. Payload means that it only take into +// account "useful" part of the rate +float bittorrent::getPayloadUploadRate() const{ + session_status sessionStatus = s->status(); + return sessionStatus.payload_upload_rate; +} + +// Save DHT entry to hard drive +void bittorrent::saveDHTEntry() { + // Save DHT entry + if(DHTEnabled) { + try{ + entry dht_state = s->dht_state(); + boost::filesystem::ofstream out((misc::qBittorrentPath()+QString::fromUtf8("dht_state")).toLocal8Bit().data(), std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), dht_state); + qDebug("DHT entry saved"); + }catch (std::exception& e) { + std::cerr << e.what() << "\n"; + } + } +} + +void bittorrent::applyEncryptionSettings(pe_settings se) { + qDebug("Applying encryption settings"); + s->set_pe_settings(se); +} + +// Will fast resume torrents in +// backup directory +void bittorrent::startUpTorrents() { + qDebug("Resuming unfinished torrents"); + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList fileNames; + QStringList known_torrents = TorrentPersistentData::knownTorrents(); + if(known_torrents.empty()) { + qDebug("No known torrent, importing old torrents"); + importOldTorrents(); + return; + } + qDebug("Starting up torrents"); + if(isQueueingEnabled()) { + QList > hashes; + foreach(const QString &hash, known_torrents) { + QString filePath; + if(TorrentPersistentData::isMagnet(hash)) { + filePath = TorrentPersistentData::getMagnetUri(hash); + } else { + filePath = torrentBackup.path()+QDir::separator()+hash+".torrent"; + } + int prio = TorrentPersistentData::getPriority(hash); + misc::insertSort2(hashes, qMakePair(prio, hash)); + } + // Resume downloads + QPair couple; + foreach(couple, hashes) { + QString hash = couple.second; + qDebug("Starting up torrent %s", hash.toLocal8Bit().data()); + if(TorrentPersistentData::isMagnet(hash)) { + addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true); + } else { + addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true); + } + } + } else { + // Resume downloads + foreach(const QString &hash, known_torrents) { + qDebug("Starting up torrent %s", hash.toLocal8Bit().data()); + if(TorrentPersistentData::isMagnet(hash)) + addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true); + else + addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true); + } + } + qDebug("Unfinished torrents resumed"); +} + +// Import torrents temp data from v1.4.0 or earlier: save_path, filtered pieces +// TODO: Remove in qBittorrent v1.6.0 +void bittorrent::importOldTempData(QString torrent_path) { + // Create torrent hash + boost::intrusive_ptr t; + try { + t = new torrent_info(torrent_path.toLocal8Bit().data()); + QString hash = misc::toQString(t->info_hash()); + // Load save path + QFile savepath_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".savepath"); + QByteArray line; + QString savePath; + if(savepath_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + line = savepath_file.readAll(); + savepath_file.close(); + qDebug(" -> Save path: %s", line.data()); + savePath = QString::fromUtf8(line.data()); + qDebug("Imported the following save path: %s", savePath.toLocal8Bit().data()); + TorrentTempData::setSavePath(hash, savePath); + } + // Load pieces priority + QFile pieces_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".priorities"); + if(pieces_file.exists()){ + // Read saved file + if(pieces_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray pieces_priorities = pieces_file.readAll(); + pieces_file.close(); + QList pieces_priorities_list = pieces_priorities.split('\n'); + std::vector pp; + for(int i=0; inum_files(); ++i) { + int priority = pieces_priorities_list.at(i).toInt(); + if( priority < 0 || priority > 7) { + priority = 1; + } + qDebug("Setting piece piority to %d", priority); + pp.push_back(priority); + } + TorrentTempData::setFilesPriority(hash, pp); + qDebug("Successfuly imported pieces_priority"); + } + } + // Load sequential + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".incremental")) { + qDebug("Imported torrent was sequential"); + TorrentTempData::setSequential(hash, true); + } + } catch(std::exception&) { + } +} + +// Trackers, web seeds, speed limits +// TODO: Remove in qBittorrent v1.6.0 +void bittorrent::applyFormerAttributeFiles(QTorrentHandle h) { + // Load trackers + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QFile tracker_file(torrentBackup.path()+QDir::separator()+ h.hash() + ".trackers"); + if(tracker_file.exists()) { + if(tracker_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QStringList lines = QString::fromUtf8(tracker_file.readAll().data()).split("\n"); + std::vector trackers; + foreach(const QString &line, lines) { + QStringList parts = line.split("|"); + if(parts.size() != 2) continue; + announce_entry t(parts[0].toStdString()); + t.tier = parts[1].toInt(); + trackers.push_back(t); + } + if(!trackers.empty()) { + h.replace_trackers(trackers); + h.force_reannounce(); + } + } + } + // Load Web seeds + QFile urlseeds_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+h.hash()+".urlseeds"); + if(urlseeds_file.exists()) { + if(urlseeds_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray urlseeds_lines = urlseeds_file.readAll(); + urlseeds_file.close(); + QList url_seeds = urlseeds_lines.split('\n'); + // First remove from the torrent the url seeds that were deleted + // in a previous session + QStringList seeds_to_delete; + QStringList existing_seeds = h.url_seeds(); + foreach(const QString &existing_seed, existing_seeds) { + if(!url_seeds.contains(existing_seed.toLocal8Bit())) { + seeds_to_delete << existing_seed; + } + } + foreach(const QString &existing_seed, seeds_to_delete) { + h.remove_url_seed(existing_seed); + } + // Add the ones that were added in a previous session + foreach(const QByteArray &url_seed, url_seeds) { + if(!url_seed.isEmpty()) { + // XXX: Should we check if it is already in the list before adding it + // or is libtorrent clever enough to know + h.add_url_seed(url_seed); + } + } + } + } + // Load speed limits + QFile speeds_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+h.hash()+".speedLimits"); + if(speeds_file.exists()) { + if(speeds_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray speed_limits = speeds_file.readAll(); + speeds_file.close(); + QList speeds = speed_limits.split(' '); + if(speeds.size() != 2) { + std::cerr << "Invalid .speedLimits file for " << h.hash().toStdString() << '\n'; + return; + } + h.set_download_limit(speeds.at(0).toInt()); + h.set_upload_limit(speeds.at(1).toInt()); + } + } +} + +// Import torrents from v1.4.0 or earlier +// TODO: Remove in qBittorrent v1.6.0 +void bittorrent::importOldTorrents() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(!settings.value("v1_4_x_torrent_imported", false).toBool()) { + // Import old torrent + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList fileNames; + QStringList filters; + filters << "*.torrent"; + fileNames = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted); + if(isQueueingEnabled()) { + QList > filePaths; + foreach(const QString &fileName, fileNames) { + QString filePath = torrentBackup.path()+QDir::separator()+fileName; + int prio = 99999; + // Get priority + QString prioPath = filePath; + prioPath.replace(".torrent", ".prio"); + if(QFile::exists(prioPath)) { + QFile prio_file(prioPath); + if(prio_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + bool ok = false; + prio = prio_file.readAll().toInt(&ok); + if(!ok) + prio = 99999; + prio_file.close(); + } + } + misc::insertSort2(filePaths, qMakePair(prio, filePath)); + } + // Resume downloads + QPair fileName; + foreach(fileName, filePaths) { + importOldTempData(fileName.second); + QTorrentHandle h = addTorrent(fileName.second, false, QString(), true); + // Sequential download + if(TorrentTempData::hasTempData(h.hash())) { + qDebug("addTorrent: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(h.hash())); + } + applyFormerAttributeFiles(h); + QString savePath = TorrentTempData::getSavePath(h.hash()); + // Save persistent data for new torrent + TorrentPersistentData::saveTorrentPersistentData(h); + // Save save_path + if(!defaultTempPath.isEmpty() && !savePath.isNull()) { + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(h.hash(), savePath); + } + } + } else { + QStringList filePaths; + foreach(const QString &fileName, fileNames) { + filePaths.append(torrentBackup.path()+QDir::separator()+fileName); + } + // Resume downloads + foreach(const QString &fileName, filePaths) { + importOldTempData(fileName); + QTorrentHandle h = addTorrent(fileName, false, QString(), true); + // Sequential download + if(TorrentTempData::hasTempData(h.hash())) { + qDebug("addTorrent: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(h.hash())); + } + applyFormerAttributeFiles(h); + QString savePath = TorrentTempData::getSavePath(h.hash()); + // Save persistent data for new torrent + TorrentPersistentData::saveTorrentPersistentData(h); + // Save save_path + if(!defaultTempPath.isEmpty() && !savePath.isNull()) { + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(h.hash(), savePath); + } + } + } + settings.setValue("v1_4_x_torrent_imported", true); + std::cout << "Successfully imported torrents from v1.4.x (or previous) instance" << std::endl; + } +} diff --git a/src/bittorrent.h b/src/bittorrent.h new file mode 100644 index 000000000..7e753adf7 --- /dev/null +++ b/src/bittorrent.h @@ -0,0 +1,198 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ +#ifndef __BITTORRENT_H__ +#define __BITTORRENT_H__ + +#include +#include +#include +#include +#include + +#include +#include +#include "qtorrenthandle.h" + +using namespace libtorrent; + +class downloadThread; +class QTimer; +class QFileSystemWatcher; +class QMutex; +class FilterParserThread; + +class bittorrent : public QObject { + Q_OBJECT + + private: + session *s; + QPointer FSWatcher; + QMutex* FSMutex; + QPointer timerAlerts; + QPointer BigRatioTimer; + bool DHTEnabled; + QPointer downloader; + QString defaultSavePath; + QString defaultTempPath; + QHash > trackersErrors; + QStringList consoleMessages; + QStringList peerBanMessages; + bool preAllocateAll; + bool addInPause; + int maxConnecsPerTorrent; + int maxUploadsPerTorrent; + float ratio_limit; + bool UPnPEnabled; + bool NATPMPEnabled; + bool LSDEnabled; + QPointer filterParser; + QString filterPath; + bool queueingEnabled; + QStringList url_skippingDlg; + QHash savepath_fromurl; + + protected: + QString getSavePath(QString hash); + + public: + // Constructor / Destructor + bittorrent(); + ~bittorrent(); + QTorrentHandle getTorrentHandle(QString hash) const; + std::vector getTorrents() const; + bool isFilePreviewPossible(QString fileHash) const; + bool isDHTEnabled() const; + float getPayloadDownloadRate() const; + float getPayloadUploadRate() const; + session_status getSessionStatus() const; + int getListenPort() const; + float getRealRatio(QString hash) const; + session* getSession() const; + QHash getTrackersErrors(QString hash) const; + bool has_filtered_files(QString hash) const; + unsigned int getFinishedPausedTorrentsNb() const; + unsigned int getUnfinishedPausedTorrentsNb() const; + bool isQueueingEnabled() const; + int getDlTorrentPriority(QString hash) const; + int getUpTorrentPriority(QString hash) const; + int getMaximumActiveDownloads() const; + int getMaximumActiveTorrents() const; + int loadTorrentPriority(QString hash); + QStringList getConsoleMessages() const; + QStringList getPeerBanMessages() const; + qlonglong getETA(QString hash) const; + bool useTemporaryFolder() const; + QString getDefaultSavePath() const; + + public slots: + QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false); + QTorrentHandle addMagnetUri(QString magnet_uri, bool resumed=false); + void importOldTorrents(); + void applyFormerAttributeFiles(QTorrentHandle h); + void importOldTempData(QString torrent_path); + void loadSessionState(); + void saveSessionState(); + void downloadFromUrl(QString url); + void deleteTorrent(QString hash, bool permanent = false); + void startUpTorrents(); + /* Needed by Web UI */ + void pauseAllTorrents(); + void pauseTorrent(QString hash); + void resumeTorrent(QString hash); + void resumeAllTorrents(); + /* End Web UI */ + void saveDHTEntry(); + void preAllocateAllFiles(bool b); + void saveFastResumeData(); + void enableDirectoryScanning(QString scan_dir); + void disableDirectoryScanning(); + void enableIPFilter(QString filter); + void disableIPFilter(); + void setQueueingEnabled(bool enable); + void loadTorrentSpeedLimits(QString hash); + void handleDownloadFailure(QString url, QString reason); + void loadWebSeeds(QString fileHash); + void increaseDlTorrentPriority(QString hash); + void decreaseDlTorrentPriority(QString hash); + void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null); + // Session configuration - Setters + void setListeningPort(int port); + void setMaxConnections(int maxConnec); + void setMaxConnectionsPerTorrent(int max); + void setMaxUploadsPerTorrent(int max); + void setDownloadRateLimit(long rate); + void setUploadRateLimit(long rate); + void setGlobalRatio(float ratio); + void setDeleteRatio(float ratio); + void setDHTPort(int dht_port); + void setProxySettings(proxy_settings proxySettings, bool trackers=true, bool peers=true, bool web_seeds=true, bool dht=true); + void setSessionSettings(session_settings sessionSettings); + void startTorrentsInPause(bool b); + void setDefaultSavePath(QString savepath); + void setDefaultTempPath(QString temppath); + void applyEncryptionSettings(pe_settings se); + void loadFilesPriorities(QTorrentHandle& h); + void setDownloadLimit(QString hash, long val); + void setUploadLimit(QString hash, long val); + void enableUPnP(bool b); + void enableNATPMP(bool b); + void enableLSD(bool b); + bool enableDHT(bool b); + void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText)); + void addPeerBanMessage(QString msg, bool from_ipfilter); + void processDownloadedFile(QString, QString); + void saveTrackerFile(QString hash); + void addMagnetSkipAddDlg(QString uri); + void downloadFromURLList(const QStringList& urls); + + protected slots: + void scanDirectory(QString); + void readAlerts(); + void loadTrackerFile(QString hash); + void deleteBigRatios(); + + signals: + void addedTorrent(QTorrentHandle& h); + void deletedTorrent(QString hash); + void pausedTorrent(QTorrentHandle& h); + void resumedTorrent(QTorrentHandle& h); + void finishedTorrent(QTorrentHandle& h); + void fullDiskError(QTorrentHandle& h, QString msg); + void trackerError(QString hash, QString time, QString msg); + void trackerAuthenticationRequired(QTorrentHandle& h); + void newDownloadedTorrent(QString path, QString url); + void updateFileSize(QString hash); + void downloadFromUrlFailure(QString url, QString reason); + void torrentFinishedChecking(QTorrentHandle& h); + void metadataReceived(QTorrentHandle &h); + void torrentPaused(QTorrentHandle &h); +}; + +#endif diff --git a/src/console.ui b/src/console.ui new file mode 100644 index 000000000..28d294826 --- /dev/null +++ b/src/console.ui @@ -0,0 +1,58 @@ + + ConsoleDlg + + + + 0 + 0 + 512 + 497 + + + + qBittorrent console + + + :/Icons/oxygen/log.png + + + + + + 0 + + + + General + + + :/Icons/oxygen/log.png + + + + + + + + + + Blocked IPs + + + :/Icons/filter.png + + + + + + + + + + + + + + + + diff --git a/src/console_imp.h b/src/console_imp.h new file mode 100644 index 000000000..7296e7c4b --- /dev/null +++ b/src/console_imp.h @@ -0,0 +1,59 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef CONSOLE_H +#define CONSOLE_H + +#include "bittorrent.h" +#include "ui_console.h" + +using namespace libtorrent; + +class consoleDlg : public QDialog, private Ui_ConsoleDlg{ + Q_OBJECT + + private: + bittorrent *BTSession; + + public: + consoleDlg(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + BTSession = _BTSession; + textConsole->setHtml(BTSession->getConsoleMessages().join("
")); + textBannedPeers->setHtml(BTSession->getPeerBanMessages().join("
")); + show(); + } + + ~consoleDlg() {} + +}; + +#endif diff --git a/src/createtorrent.ui b/src/createtorrent.ui new file mode 100644 index 000000000..8be9532a3 --- /dev/null +++ b/src/createtorrent.ui @@ -0,0 +1,562 @@ + + + createTorrentDialog + + + + 0 + 0 + 592 + 658 + + + + Torrent Creation Tool + + + + + + + 0 + 27 + + + + + 16777215 + 27 + + + + + Sans Serif + 14 + 75 + false + true + false + false + + + + Torrent file creation + + + Qt::AlignCenter + + + + + + + File or folder to add to the torrent: + + + + + + + + + + + + Add file + + + + :/Icons/oxygen/document-new.png:/Icons/oxygen/document-new.png + + + + + + + Add folder + + + + :/Icons/oxygen/folder-new.png:/Icons/oxygen/folder-new.png + + + + + + + + + + + + + + 0 + 102 + + + + + 16777215 + 70 + + + + Announce urls (trackers): + + + + + + + + + + + 0 + 101 + + + + Web seeds urls (optional): + + + + + + + + 0 + 102 + + + + + 16777215 + 102 + + + + Comment (optional): + + + txt_comment + + + + + + + + + + + 6 + + + 0 + + + + + QAbstractItemView::MultiSelection + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + + 18 + 18 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + + 18 + 18 + + + + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + + + + 6 + + + 0 + + + + + QAbstractItemView::MultiSelection + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + + 18 + 18 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + + 18 + 18 + + + + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + + + + + 421 + 102 + + + + false + + + + + + + + + + + + + Piece size: + + + + + + + 3 + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Private (won't be distributed on DHT network if enabled) + + + + + + + Start seeding after creation + + + + + + + Progress: + + + + + + + 0 + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + Create and save... + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + cancelButton + clicked() + createTorrentDialog + reject() + + + 355 + 275 + + + 179 + 282 + + + + + diff --git a/src/createtorrent_imp.cpp b/src/createtorrent_imp.cpp new file mode 100644 index 000000000..e59f5f214 --- /dev/null +++ b/src/createtorrent_imp.cpp @@ -0,0 +1,277 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "createtorrent_imp.h" +#include "misc.h" + +using namespace libtorrent; +using namespace boost::filesystem; + +// do not include files and folders whose +// name starts with a . +bool file_filter(boost::filesystem::path const& filename) +{ + if (filename.leaf()[0] == '.') return false; + std::cerr << filename << std::endl; + return true; +} + +createtorrent::createtorrent(QWidget *parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + creatorThread = new torrentCreatorThread(this); + connect(creatorThread, SIGNAL(creationSuccess(QString, const char*)), this, SLOT(handleCreationSuccess(QString, const char*))); + connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString))); + connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int))); + path::default_name_check(no_check); + show(); +} + +createtorrent::~createtorrent() { + delete creatorThread; +} + +void createtorrent::on_addFolder_button_clicked(){ + QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder to add to the torrent"), QDir::homePath(), QFileDialog::ShowDirsOnly); + if(!dir.isEmpty()) + textInputPath->setText(dir); +} + +void createtorrent::on_addFile_button_clicked(){ + QString file = QFileDialog::getOpenFileName(this, tr("Select a file to add to the torrent"), QDir::homePath(), QString(), 0, QFileDialog::ShowDirsOnly); + if(!file.isEmpty()) + textInputPath->setText(file); +} + +void createtorrent::on_removeTracker_button_clicked() { + QModelIndexList selectedIndexes = trackers_list->selectionModel()->selectedIndexes(); + for(int i=selectedIndexes.size()-1; i>=0; --i){ + QListWidgetItem *item = trackers_list->takeItem(selectedIndexes.at(i).row()); + delete item; + } +} + +int createtorrent::getPieceSize() const { + switch(comboPieceSize->currentIndex()) { + case 0: + return 32*1024; + case 1: + return 64*1024; + case 2: + return 128*1024; + case 3: + return 256*1024; + case 4: + return 512*1024; + case 5: + return 1024*1024; + case 6: + return 2048*1024; + default: + return 256*1024; + } +} + +void createtorrent::on_addTracker_button_clicked() { + bool ok; + QString URL = QInputDialog::getText(this, tr("Please type an announce URL"), + tr("Announce URL:", "Tracker URL"), QLineEdit::Normal, + "http://", &ok); + if(ok){ + if(trackers_list->findItems(URL, Qt::MatchFixedString).size() == 0) + trackers_list->addItem(URL); + } +} + +void createtorrent::on_removeURLSeed_button_clicked(){ + QModelIndexList selectedIndexes = URLSeeds_list->selectionModel()->selectedIndexes(); + for(int i=selectedIndexes.size()-1; i>=0; --i){ + QListWidgetItem *item = URLSeeds_list->takeItem(selectedIndexes.at(i).row()); + delete item; + } +} + +void createtorrent::on_addURLSeed_button_clicked(){ + bool ok; + QString URL = QInputDialog::getText(this, tr("Please type a web seed url"), + tr("Web seed URL:"), QLineEdit::Normal, + "http://", &ok); + if(ok){ + if(URLSeeds_list->findItems(URL, Qt::MatchFixedString).size() == 0) + URLSeeds_list->addItem(URL); + } +} + +QStringList createtorrent::allItems(QListWidget *list){ + QStringList res; + unsigned int nbItems = list->count(); + for(unsigned int i=0; i< nbItems; ++i){ + res << list->item(i)->text(); + } + return res; +} + +// Main function that create a .torrent file +void createtorrent::on_createButton_clicked(){ + QString input = textInputPath->text().trimmed(); + if (input.endsWith(QDir::separator())) + input.chop(1); + if(input.isEmpty()){ + QMessageBox::critical(0, tr("No input path set"), tr("Please type an input path first")); + return; + } + QStringList trackers = allItems(trackers_list); + /*if(!trackers.size()){ + QMessageBox::critical(0, tr("No tracker path set"), tr("Please set at least one tracker")); + return; + }*/ + QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); + if(!destination.isEmpty()) { + if(!destination.endsWith(QString::fromUtf8(".torrent"))) + destination += QString::fromUtf8(".torrent"); + } else { + return; + } + QStringList url_seeds = allItems(URLSeeds_list); + QString comment = txt_comment->toPlainText(); + creatorThread->create(input, destination, trackers, url_seeds, comment, check_private->isChecked(), getPieceSize()); +} + +void createtorrent::handleCreationFailure(QString msg) { + QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg)); +} + +void createtorrent::handleCreationSuccess(QString path, const char* branch_path) { + if(checkStartSeeding->isChecked()) { + // Create save path file + boost::intrusive_ptr t; + try { + t = new torrent_info(path.toLocal8Bit().data()); + } catch(std::exception&) { + QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list.")); + return; + } + QString hash = misc::toQString(t->info_hash()); + QFile savepath_file(misc::qBittorrentPath()+QString::fromUtf8("BT_backup")+QDir::separator()+hash+QString::fromUtf8(".savepath")); + savepath_file.open(QIODevice::WriteOnly | QIODevice::Text); + savepath_file.write(branch_path); + savepath_file.close(); + emit torrent_to_seed(path); + } + QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path); + close(); +} + +void createtorrent::updateProgressBar(int progress) { + progressBar->setValue(progress); +} + +// +// Torrent Creator Thread +// + +void torrentCreatorThread::create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size) { + input_path = _input_path; + save_path = _save_path; + trackers = _trackers; + url_seeds = _url_seeds; + comment = _comment; + is_private = _is_private; + piece_size = _piece_size; + abort = false; + start(); +} + +void sendProgressUpdateSignal(int i, int num, torrentCreatorThread *parent){ + parent->sendProgressSignal((int)(i*100./(float)num)); +} + +void torrentCreatorThread::sendProgressSignal(int progress) { + emit updateProgress(progress); +} + +void torrentCreatorThread::run() { + emit updateProgress(0); + char const* creator_str = "qBittorrent "VERSION; + try { + file_storage fs; + file_pool fp; + path full_path = complete(path(input_path.toLocal8Bit().data())); + // Adding files to the torrent + add_files(fs, full_path, file_filter); + if(abort) return; + create_torrent t(fs, piece_size); + + // Add url seeds + QString seed; + foreach(seed, url_seeds){ + t.add_url_seed(seed.toLocal8Bit().data()); + } + for(int i=0; i(&sendProgressUpdateSignal, _1, t.num_pieces(), this)); + // Set qBittorrent as creator and add user comment to + // torrent_info structure + t.set_creator(creator_str); + t.set_comment((const char*)comment.toLocal8Bit()); + // Is private ? + t.set_priv(is_private); + if(abort) return; + // create the torrent and print it to out + ofstream out(complete(path((const char*)save_path.toLocal8Bit())), std::ios_base::binary); + bencode(std::ostream_iterator(out), t.generate()); + emit updateProgress(100); + emit creationSuccess(save_path, full_path.branch_path().string().c_str()); + } + catch (std::exception& e){ + emit creationFailure(QString::fromUtf8(e.what())); + } +} diff --git a/src/createtorrent_imp.h b/src/createtorrent_imp.h new file mode 100644 index 000000000..a279e68cc --- /dev/null +++ b/src/createtorrent_imp.h @@ -0,0 +1,103 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef CREATE_TORRENT_IMP_H +#define CREATE_TORRENT_IMP_H + +#include + +#include "ui_createtorrent.h" + +class torrentCreatorThread : public QThread { + Q_OBJECT + + QString input_path; + QString save_path; + QStringList trackers; + QStringList url_seeds; + QString comment; + bool is_private; + int piece_size; + bool abort; + QDialog *parent; + + public: + torrentCreatorThread(QDialog *_parent) { + parent = _parent; + } + ~torrentCreatorThread() { + abort = true; + wait(); + } + void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size); + void sendProgressSignal(int progress); + + protected: + void run(); + + signals: + void creationFailure(QString msg); + void creationSuccess(QString path, const char* branch_path); + + signals: + void updateProgress(int progress); +}; + +class createtorrent : public QDialog, private Ui::createTorrentDialog{ + Q_OBJECT + + private: + torrentCreatorThread *creatorThread; + + public: + createtorrent(QWidget *parent = 0); + ~createtorrent(); + QStringList allItems(QListWidget *list); + int getPieceSize() const; + + signals: + void torrent_to_seed(QString path); + + public slots: + void updateProgressBar(int progress); + + protected slots: + void on_createButton_clicked(); + void on_addFile_button_clicked(); + void on_addFolder_button_clicked(); + void on_addTracker_button_clicked(); + void on_removeTracker_button_clicked(); + void on_addURLSeed_button_clicked(); + void on_removeURLSeed_button_clicked(); + void handleCreationFailure(QString msg); + void handleCreationSuccess(QString path, const char* branch_path); +}; + +#endif diff --git a/src/download.ui b/src/download.ui new file mode 100644 index 000000000..306afb48f --- /dev/null +++ b/src/download.ui @@ -0,0 +1,193 @@ + + + downloading + + + + 0 + 0 + 811 + 453 + + + + Search + + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + Qt::CustomContextMenu + + + true + + + QAbstractItemView::ExtendedSelection + + + 1 + + + false + + + + + + + + + Start + + + + + Pause + + + + + Delete + + + + + Preview file + + + + + Set upload limit + + + + + Set download limit + + + + + Delete Permanently + + + + + Torrent Properties + + + + + + :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png + + + Open destination folder + + + + + Name + + + + + Size + + + + + Progress + + + + + DLSpeed + + + + + UpSpeed + + + + + Seeds/Leechs + + + + + Ratio + + + + + ETA + + + + + + :/Icons/oxygen/wallet.png:/Icons/oxygen/wallet.png + + + Buy it + + + + + Priority + + + + + + :/Icons/skin/increase.png:/Icons/skin/increase.png + + + Increase priority + + + + + + :/Icons/skin/decrease.png:/Icons/skin/decrease.png + + + Decrease priority + + + + + + :/Icons/oxygen/gear.png:/Icons/oxygen/gear.png + + + Force recheck + + + + + Copy magnet link + + + + + + + + diff --git a/src/downloadFromURL.ui b/src/downloadFromURL.ui new file mode 100644 index 000000000..176091ea0 --- /dev/null +++ b/src/downloadFromURL.ui @@ -0,0 +1,158 @@ + + + + + downloadFromURL + + + + 0 + 0 + 360 + 220 + + + + Download from urls + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 32 + 32 + + + + + 32 + 32 + + + + + + + + + + + + Sans Serif + 12 + 75 + false + true + false + false + + + + Download Torrents from URLs + + + + + + + + + false + + + + + + + + 16777215 + 17 + + + + + Sans Serif + 9 + 50 + true + false + false + false + + + + Only one URL per line + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Download + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + diff --git a/src/downloadFromURLImp.h b/src/downloadFromURLImp.h new file mode 100644 index 000000000..49934f45f --- /dev/null +++ b/src/downloadFromURLImp.h @@ -0,0 +1,91 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADFROMURL_H +#define DOWNLOADFROMURL_H + +#include +#include +#include +#include +#include +#include +#include "ui_downloadFromURL.h" + +class downloadFromURL : public QDialog, private Ui::downloadFromURL{ + Q_OBJECT + + public: + downloadFromURL(QWidget *parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + icon_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/url.png"))); + show(); + // Paste clipboard if there is an URL in it + QString clip_txt = qApp->clipboard()->text(); + if(clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive) || clip_txt.startsWith("magnet:", Qt::CaseInsensitive)) { + textUrls->setText(clip_txt); + } + } + + ~downloadFromURL(){} + + signals: + void urlsReadyToBeDownloaded(const QStringList& torrent_urls); + + public slots: + void on_downloadButton_clicked(){ + QString urls = textUrls->toPlainText(); + QStringList url_list = urls.split(QString::fromUtf8("\n")); + QString url; + QStringList url_list_cleaned; + foreach(url, url_list){ + url = url.trimmed(); + if(!url.isEmpty()){ + if(url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0){ + url_list_cleaned << url; + } + } + } + if(!url_list_cleaned.size()){ + QMessageBox::critical(0, tr("No URL entered"), tr("Please type at least one URL.")); + return; + } + emit urlsReadyToBeDownloaded(url_list_cleaned); + qDebug("Emitted urlsReadytobedownloaded signal"); + close(); + } + + void on_cancelButton_clicked(){ + close(); + } +}; + +#endif diff --git a/src/downloadThread.cpp b/src/downloadThread.cpp new file mode 100644 index 000000000..2f90c74a4 --- /dev/null +++ b/src/downloadThread.cpp @@ -0,0 +1,243 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include "downloadThread.h" +#include +#include +#include + +#define MAX_THREADS 3 + +// http://curl.rtin.bz/libcurl/c/libcurl-errors.html +QString subDownloadThread::errorCodeToString(CURLcode status) { + switch(status){ + case CURLE_FTP_CANT_GET_HOST: + case CURLE_COULDNT_RESOLVE_HOST: + return tr("Host is unreachable"); + case CURLE_READ_ERROR: + case CURLE_FILE_COULDNT_READ_FILE: + return tr("File was not found (404)"); + case CURLE_FTP_ACCESS_DENIED: + case CURLE_LOGIN_DENIED: + case CURLE_FTP_USER_PASSWORD_INCORRECT: + return tr("Connection was denied"); + case CURLE_URL_MALFORMAT: + return tr("Url is invalid"); + case CURLE_COULDNT_RESOLVE_PROXY: + return tr("Could not resolve proxy"); + //case 5: + // return tr("Connection forbidden (403)"); + //case 6: + // return tr("Connection was not authorized (401)"); + //case 7: + // return tr("Content has moved (301)"); + case CURLE_COULDNT_CONNECT: + return tr("Connection failure"); + case CURLE_OPERATION_TIMEOUTED: + return tr("Connection was timed out"); + case CURLE_INTERFACE_FAILED: + return tr("Incorrect network interface"); + default: + return tr("Unknown error"); + } +} + +subDownloadThread::subDownloadThread(QObject *parent, QString url) : QThread(parent), url(url), abort(false){} + +subDownloadThread::~subDownloadThread(){ + abort = true; + wait(); +} + +void subDownloadThread::run(){ + // Get a unique filename + QString filePath; + QTemporaryFile tmpfile; + tmpfile.setAutoRemove(false); + if (tmpfile.open()) { + filePath = tmpfile.fileName(); + qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data()); + } else { + emit downloadFailureST(this, url, tr("I/O Error")); + return; + } + tmpfile.close(); + // Now temporary file is created but closed so that + // curl can use it + FILE *f = fopen(filePath.toLocal8Bit().data(), "wb"); + if(!f) { + std::cerr << "couldn't open destination file" << "\n"; + return; + } + CURL *curl; + CURLcode res = (CURLcode)-1; + curl = curl_easy_init(); + if(curl) { + std::string c_url = url.toLocal8Bit().data(); + curl_easy_setopt(curl, CURLOPT_URL, c_url.c_str()); + // SSL support + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + // PROXY SUPPORT + QSettings settings("qBittorrent", "qBittorrent"); + int intValue = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxyType"), 0).toInt(); + if(intValue > 0) { + // Proxy enabled + QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString(); + QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString(); + qDebug("Using proxy: %s", (IP+QString(":")+port).toLocal8Bit().data()); + curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toLocal8Bit().data()); + // Default proxy type is HTTP, we must change if it is SOCKS5 + if(intValue%2==0) { + qDebug("Proxy is SOCKS5, not HTTP"); + curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + } + // Authentication? + if(intValue > 2) { + qDebug("Proxy requires authentication, authenticating"); + QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString(); + QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString(); + curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toLocal8Bit().data()); + } + } + // We have to define CURLOPT_WRITEFUNCTION or it will crash on windows + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, f); + // Verbose + //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + // No progress info (we don't use it) + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); + // Redirections + curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1); + qDebug("Downloading %s", url.toLocal8Bit().data()); + if(!abort) + res = curl_easy_perform(curl); + qDebug("done downloading %s", url.toLocal8Bit().data()); + /* always cleanup */ + curl_easy_cleanup(curl); + fclose(f); + if(abort) + return; + if(res) { + emit downloadFailureST(this, url, errorCodeToString(res)); + } else { + emit downloadFinishedST(this, url, filePath); + } + qDebug("%s Raised the signal", url.toLocal8Bit().data()); + } else { + std::cerr << "Could not initialize CURL" << "\n"; + } +} + +/** Download Thread **/ + +downloadThread::downloadThread(QObject* parent) : QThread(parent), abort(false){} + +downloadThread::~downloadThread(){ + mutex.lock(); + abort = true; + condition.wakeOne(); + mutex.unlock(); + //qDebug("downloadThread deleting subthreads..."); + qDeleteAll(subThreads); + //qDebug("downloadThread deleted subthreads"); + wait(); +} + +void downloadThread::downloadUrl(QString url){ + QMutexLocker locker(&mutex); + urls_queue.enqueue(url); + if(!isRunning()){ + start(); + }else{ + condition.wakeOne(); + } +} + +void downloadThread::run(){ + forever{ + if(abort) { + qDebug("DownloadThread aborting..."); + return; + } + mutex.lock(); + if(!urls_queue.empty() && subThreads.size() < MAX_THREADS){ + QString url = urls_queue.dequeue(); + mutex.unlock(); + //qDebug("DownloadThread downloading %s...", url.toLocal8Bit().data()); + subDownloadThread *st = new subDownloadThread(0, url); + subThreads << st; + connect(st, SIGNAL(downloadFinishedST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadedFile(subDownloadThread*, QString, QString))); + connect(st, SIGNAL(downloadFailureST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadFailure(subDownloadThread*, QString, QString))); + st->start(); + }else{ + //qDebug("DownloadThread sleeping..."); + condition.wait(&mutex); + //qDebug("DownloadThread woke up"); + mutex.unlock(); + } + } +} + +void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url, QString path){ + qDebug("Downloading %s was successful", url.toLocal8Bit().data()); + mutex.lock(); + int index = subThreads.indexOf(st); + Q_ASSERT(index != -1); + subThreads.removeAt(index); + mutex.unlock(); + qDebug("Deleting subthread"); + delete st; + emit downloadFinished(url, path); + mutex.lock(); + if(!urls_queue.empty()) { + condition.wakeOne(); + } + mutex.unlock(); + qDebug("Out of propagateDownloadedFile"); +} + +void downloadThread::propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){ + qDebug("Downloading %s failed", url.toLocal8Bit().data()); + mutex.lock(); + int index = subThreads.indexOf(st); + Q_ASSERT(index != -1); + subThreads.removeAt(index); + mutex.unlock(); + delete st; + emit downloadFailure(url, reason); + mutex.lock(); + if(!urls_queue.empty()) { + condition.wakeOne(); + } + mutex.unlock(); +} diff --git a/src/downloadThread.h b/src/downloadThread.h new file mode 100644 index 000000000..8bdf58063 --- /dev/null +++ b/src/downloadThread.h @@ -0,0 +1,94 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADTHREAD_H +#define DOWNLOADTHREAD_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class subDownloadThread : public QThread { + Q_OBJECT + private: + QString url; + bool abort; + + public: + subDownloadThread(QObject *parent, QString url); + ~subDownloadThread(); + QString errorCodeToString(CURLcode status); + + signals: + // For subthreads + void downloadFinishedST(subDownloadThread* st, QString url, QString file_path); + void downloadFailureST(subDownloadThread* st, QString url, QString reason); + + protected: + void run(); +}; + +class downloadThread : public QThread { + Q_OBJECT + + private: + QQueue urls_queue; + QMutex mutex; + QWaitCondition condition; + bool abort; + QList subThreads; + + signals: + void downloadFinished(QString url, QString file_path); + void downloadFailure(QString url, QString reason); + + public: + downloadThread(QObject* parent); + + ~downloadThread(); + + void downloadUrl(QString url); + void setProxy(QString IP, int port, QString username, QString password); + + protected: + void run(); + + protected slots: + void propagateDownloadedFile(subDownloadThread* st, QString url, QString path); + void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason); +}; + +#endif diff --git a/src/downloadingTorrents.cpp b/src/downloadingTorrents.cpp new file mode 100644 index 000000000..d4e4638ba --- /dev/null +++ b/src/downloadingTorrents.cpp @@ -0,0 +1,779 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ +#include "downloadingTorrents.h" +#include "misc.h" +#include "properties_imp.h" +#include "bittorrent.h" +#include "allocationDlg.h" +#include "DLListDelegate.h" +#include "GUI.h" + +#include +#include +#include +#include +#include +#include +#include + +DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession) : parent(parent), BTSession(BTSession), nbTorrents(0) { + setupUi(this); + // Setting icons + actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); + actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); + actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); + actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); + actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); + actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); + actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); + actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png"))); + // tabBottom->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/oxygen/log.png"))); + // tabBottom->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/oxygen/filter.png"))); + + // Set Download list model + DLListModel = new QStandardItemModel(0,10); + DLListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + DLListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + DLListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); + DLListModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("DL Speed", "i.e: Download speed")); + DLListModel->setHeaderData(UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); + DLListModel->setHeaderData(SEEDSLEECH, Qt::Horizontal, tr("Seeds/Leechers", "i.e: full/partial sources")); + DLListModel->setHeaderData(RATIO, Qt::Horizontal, tr("Ratio")); + DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left")); + DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, "#"); + downloadList->setRootIsDecorated(false); + downloadList->setAllColumnsShowFocus(true); + DLDelegate = new DLListDelegate(downloadList); + downloadList->setItemDelegate(DLDelegate); + proxyModel = new QSortFilterProxyModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(DLListModel); + downloadList->setModel(proxyModel); + downloadList->setSortingEnabled(true); + // Hide priority column + downloadList->hideColumn(PRIORITY); + // Hide hash column + downloadList->hideColumn(HASH); + loadHiddenColumns(); + + connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&))); + + // Load last columns width for download list + if(!loadColWidthDLList()) { + downloadList->header()->resizeSection(0, 200); + } + // Make download list header clickable for sorting + downloadList->header()->setClickable(true); + downloadList->header()->setSortIndicatorShown(true); + // Connecting Actions to slots + connect(downloadList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&))); + connect(downloadList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLListMenu(const QPoint&))); + downloadList->header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(downloadList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLHoSMenu(const QPoint&))); + // Actions + connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); + connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); + connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); + connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered())); + connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered())); + connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); + connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); + connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); + connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection())); + connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck())); + connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage())); + connect(actionCopy_magnet_link, SIGNAL(triggered()), (GUI*)parent, SLOT(copyMagnetURI())); + + connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName())); + connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize())); + connect(actionHOSColProgress, SIGNAL(triggered()), this, SLOT(hideOrShowColumnProgress())); + connect(actionHOSColDownSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnDownSpeed())); + connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed())); + connect(actionHOSColSeedersLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSeedersLeechers())); + connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio())); + connect(actionHOSColEta, SIGNAL(triggered()), this, SLOT(hideOrShowColumnEta())); + connect(actionHOSColPriority, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPriority())); + + // Load last sorted column + loadLastSortedColumn(); + // Set info Bar infos + BTSession->addConsoleMessage(tr("qBittorrent %1 started.", "e.g: qBittorrent v0.x started.").arg(QString::fromUtf8(""VERSION))); + qDebug("Download tab built"); +} + +DownloadingTorrents::~DownloadingTorrents() { + saveLastSortedColumn(); + saveColWidthDLList(); + saveHiddenColumns(); + delete DLDelegate; + delete proxyModel; + delete DLListModel; +} + +void DownloadingTorrents::enablePriorityColumn(bool enable) { + if(enable) { + downloadList->showColumn(PRIORITY); + } else { + downloadList->hideColumn(PRIORITY); + } +} + +void DownloadingTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) { + unsigned int row = index.row(); + QString hash = getHashFromRow(row); + emit torrentDoubleClicked(hash, false); +} + +unsigned int DownloadingTorrents::getNbTorrentsInList() const { + return nbTorrents; +} + +// Note: do not actually pause the torrent in BT session +void DownloadingTorrents::pauseTorrent(QString hash) { + int row = getRowFromHash(hash); + if(row == -1) + return; + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.0)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.0)); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + DLListModel->setData(DLListModel->index(row, NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + //DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); + setRowColor(row, QString::fromUtf8("red")); +} + +QString DownloadingTorrents::getHashFromRow(unsigned int row) const { + Q_ASSERT(row < (unsigned int)proxyModel->rowCount()); + return proxyModel->data(proxyModel->index(row, HASH)).toString(); +} + +// Show torrent properties dialog +void DownloadingTorrents::showProperties(const QModelIndex &index) { + showPropertiesFromHash(getHashFromRow(index.row())); +} + +void DownloadingTorrents::showPropertiesFromHash(QString hash) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && h.has_metadata()) { + properties *prop = new properties(this, BTSession, h); + connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSizeAndProgress(QString))); + connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString))); + prop->show(); + } +} + +// Remove a torrent from the download list but NOT from the BT Session +void DownloadingTorrents::deleteTorrent(QString hash) { + int row = getRowFromHash(hash); + if(row == -1){ + qDebug("torrent is not in download list, nothing to delete"); + return; + } + // Select item just under (or above nothing under) the one that was deleted + QModelIndex current_prox_index = proxyModel->mapFromSource(DLListModel->index(row, 0, downloadList->rootIndex())); + bool was_selected = downloadList->selectionModel()->isSelected(current_prox_index); + if(DLListModel->rowCount() > 1 && was_selected) { + QModelIndex under_prox_index; + if(current_prox_index.row() == DLListModel->rowCount()-1) + under_prox_index = proxyModel->index(current_prox_index.row()-1, 0); + else + under_prox_index = proxyModel->index(current_prox_index.row()+1, 0); + //downloadList->selectionModel()->select(under_prox_index, QItemSelectionModel::Current|QItemSelectionModel::Columns|QItemSelectionModel::Select); + downloadList->setCurrentIndex(under_prox_index); + downloadList->update(); + } + // Actually delete the row + DLListModel->removeRow(row); + --nbTorrents; + emit unfinishedTorrentsNumberChanged(nbTorrents); +} + +void DownloadingTorrents::on_actionSet_download_limit_triggered() { + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + QStringList hashes; + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == NAME) { + // Get the file hash + hashes << getHashFromRow(index.row()); + } + } + Q_ASSERT(hashes.size() > 0); + new BandwidthAllocationDialog(this, false, BTSession, hashes); +} + +void DownloadingTorrents::on_actionSet_upload_limit_triggered() { + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + QStringList hashes; + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == NAME) { + // Get the file hash + hashes << getHashFromRow(index.row()); + } + } + Q_ASSERT(hashes.size() > 0); + new BandwidthAllocationDialog(this, true, BTSession, hashes); +} + +// display properties of selected items +void DownloadingTorrents::propertiesSelection(){ + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == NAME){ + showProperties(index); + } + } +} + +void DownloadingTorrents::forceRecheck() { + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == NAME){ + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && h.has_metadata()) + h.force_recheck(); + } + } +} + +void DownloadingTorrents::displayDLListMenu(const QPoint&) { + QMenu myDLLlistMenu(this); + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + bool has_pause = false, has_start = false, has_preview = false; + bool one_has_metadata = false; + QTorrentHandle h; + qDebug("Displaying menu"); + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == NAME) { + // Get the file name + QString hash = getHashFromRow(index.row()); + // Get handle and pause the torrent + h = BTSession->getTorrentHandle(hash); + if(!h.is_valid()) continue; + if(h.has_metadata()) { + one_has_metadata = true; + } + if(h.is_paused()) { + if(!has_start) { + myDLLlistMenu.addAction(actionStart); + has_start = true; + } + }else{ + if(!has_pause) { + myDLLlistMenu.addAction(actionPause); + has_pause = true; + } + } + if(h.has_metadata() && BTSession->isFilePreviewPossible(hash) && !has_preview) { + myDLLlistMenu.addAction(actionPreview_file); + has_preview = true; + } + if(has_pause && has_start && has_preview) break; + } + } + myDLLlistMenu.addSeparator(); + myDLLlistMenu.addAction(actionDelete); + myDLLlistMenu.addAction(actionDelete_Permanently); + myDLLlistMenu.addSeparator(); + myDLLlistMenu.addAction(actionSet_download_limit); + myDLLlistMenu.addAction(actionSet_upload_limit); + myDLLlistMenu.addSeparator(); + if(one_has_metadata) { + myDLLlistMenu.addAction(actionForce_recheck); + myDLLlistMenu.addSeparator(); + } + myDLLlistMenu.addAction(actionOpen_destination_folder); + if(one_has_metadata) + myDLLlistMenu.addAction(actionTorrent_Properties); + if(BTSession->isQueueingEnabled()) { + myDLLlistMenu.addSeparator(); + myDLLlistMenu.addAction(actionIncreasePriority); + myDLLlistMenu.addAction(actionDecreasePriority); + } + myDLLlistMenu.addSeparator(); + myDLLlistMenu.addAction(actionCopy_magnet_link); + myDLLlistMenu.addAction(actionBuy_it); + // Call menu + myDLLlistMenu.exec(QCursor::pos()); +} + + +/* + * Hiding Columns functions + */ + +// hide/show columns menu +void DownloadingTorrents::displayDLHoSMenu(const QPoint&){ + QMenu hideshowColumn(this); + hideshowColumn.setTitle(tr("Hide or Show Column")); + int lastCol; + if(BTSession->isQueueingEnabled()) { + lastCol = PRIORITY; + } else { + lastCol = ETA; + } + for(int i=0; i <= lastCol; ++i) { + hideshowColumn.addAction(getActionHoSCol(i)); + } + // Call menu + hideshowColumn.exec(QCursor::pos()); +} + +// toggle hide/show a column +void DownloadingTorrents::hideOrShowColumn(int index) { + unsigned int nbVisibleColumns = 0; + unsigned int nbCols = DLListModel->columnCount(); + // Count visible columns + for(unsigned int i=0; iisColumnHidden(i)) + ++nbVisibleColumns; + } + if(!downloadList->isColumnHidden(index)) { + // User wants to hide the column + // Is there at least one other visible column? + if(nbVisibleColumns <= 1) return; + // User can hide the column, do it. + downloadList->setColumnHidden(index, true); + getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + --nbVisibleColumns; + } else { + // User want to display the column + downloadList->setColumnHidden(index, false); + getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); + ++nbVisibleColumns; + } + //resize all others non-hidden columns + for(unsigned int i=0; iisColumnHidden(i)) { + downloadList->setColumnWidth(i, (int)ceil(downloadList->columnWidth(i)+(downloadList->columnWidth(index)/nbVisibleColumns))); + } + } +} + +void DownloadingTorrents::hidePriorityColumn(bool hide) { + downloadList->setColumnHidden(PRIORITY, hide); + if(hide) + getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + else + getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); +} + +// save the hidden columns in settings +void DownloadingTorrents::saveHiddenColumns() { + QSettings settings("qBittorrent", "qBittorrent"); + QStringList ishidden_list; + short nbColumns = DLListModel->columnCount()-1; + + for(short i=0; iisColumnHidden(i)) { + ishidden_list << QString::fromUtf8(misc::toString(0).c_str()); + } else { + ishidden_list << QString::fromUtf8(misc::toString(1).c_str()); + } + } + settings.setValue("DownloadListColsHoS", ishidden_list.join(" ")); +} + +// load the previous settings, and hide the columns +bool DownloadingTorrents::loadHiddenColumns() { + bool loaded = false; + QSettings settings("qBittorrent", "qBittorrent"); + QString line = settings.value("DownloadListColsHoS", QString()).toString(); + QStringList ishidden_list; + if(!line.isEmpty()) { + ishidden_list = line.split(' '); + if(ishidden_list.size() == DLListModel->columnCount()-1) { + unsigned int listSize = ishidden_list.size(); + for(unsigned int i=0; iheader()->resizeSection(i, ishidden_list.at(i).toInt()); + } + loaded = true; + } + } + for(int i=0; icolumnCount()-1; i++) { + if(loaded && ishidden_list.at(i) == "0") { + downloadList->setColumnHidden(i, true); + getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + } else { + getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); + } + } + return loaded; +} + +void DownloadingTorrents::hideOrShowColumnName() { + hideOrShowColumn(NAME); +} + +void DownloadingTorrents::hideOrShowColumnSize() { + hideOrShowColumn(SIZE); +} + +void DownloadingTorrents::hideOrShowColumnProgress() { + hideOrShowColumn(PROGRESS); +} + +void DownloadingTorrents::hideOrShowColumnDownSpeed() { + hideOrShowColumn(DLSPEED); +} + +void DownloadingTorrents::hideOrShowColumnUpSpeed() { + hideOrShowColumn(UPSPEED); +} + +void DownloadingTorrents::hideOrShowColumnSeedersLeechers() { + hideOrShowColumn(SEEDSLEECH); +} + +void DownloadingTorrents::hideOrShowColumnRatio() { + hideOrShowColumn(RATIO); +} + +void DownloadingTorrents::hideOrShowColumnEta() { + hideOrShowColumn(ETA); +} + +void DownloadingTorrents::hideOrShowColumnPriority() { + hideOrShowColumn(PRIORITY); +} + +// getter, return the action hide or show whose id is index +QAction* DownloadingTorrents::getActionHoSCol(int index) { + switch(index) { + case NAME : + return actionHOSColName; + break; + case SIZE : + return actionHOSColSize; + break; + case PROGRESS : + return actionHOSColProgress; + break; + case DLSPEED : + return actionHOSColDownSpeed; + break; + case UPSPEED : + return actionHOSColUpSpeed; + break; + case SEEDSLEECH : + return actionHOSColSeedersLeechers; + break; + case RATIO : + return actionHOSColRatio; + break; + case ETA : + return actionHOSColEta; + break; + case PRIORITY : + return actionHOSColPriority; + break; + default : + return NULL; +} +} + +QStringList DownloadingTorrents::getSelectedTorrents(bool only_one) const{ + QStringList res; + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes) { + if(index.column() == NAME) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + res << hash; + if(only_one) break; + } + } + return res; +} + +void DownloadingTorrents::updateMetadata(QTorrentHandle &h) { + QString hash = h.hash(); + int row = getRowFromHash(hash); + if(row != -1) { + qDebug("Updating torrent metadata in download list"); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(h.name())); + DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + } +} + +// get information from torrent handles and +// update download list accordingly +bool DownloadingTorrents::updateTorrent(QTorrentHandle h) { + if(!h.is_valid()) return false; + bool added = false; + try{ + QString hash = h.hash(); + int row = getRowFromHash(hash); + if(row == -1) { + qDebug("Info: Could not find filename in download list, adding it..."); + addTorrent(hash); + row = getRowFromHash(hash); + added = true; + } + Q_ASSERT(row != -1); + // Update Priority + if(BTSession->isQueueingEnabled()) { + DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); + if(h.is_queued()) { + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) { + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + if(!downloadList->isColumnHidden(PROGRESS)) { + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); + } + }else { + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); + if(!downloadList->isColumnHidden(ETA)) { + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + } + } + // Reset speeds and seeds/leech + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant("0/0")); + setRowColor(row, QString::fromUtf8("grey")); + return added; + } + } + if(!downloadList->isColumnHidden(PROGRESS)) + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); + // No need to update a paused torrent + if(h.is_paused()) return added; + // Parse download state + // Setting download state + switch(h.state()) { + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + setRowColor(row, QString::fromUtf8("grey")); + break; + case torrent_status::downloading: + case torrent_status::downloading_metadata: + if(h.download_payload_rate() > 0) { + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))), Qt::DecorationRole); + if(!downloadList->isColumnHidden(ETA)) { + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession->getETA(hash))); + } + setRowColor(row, QString::fromUtf8("green")); + }else{ + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); + if(!downloadList->isColumnHidden(ETA)) { + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + } + setRowColor(row, QApplication::palette().color(QPalette::WindowText)); + } + if(!downloadList->isColumnHidden(DLSPEED)) { + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)h.download_payload_rate())); + } + if(!downloadList->isColumnHidden(UPSPEED)) { + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate())); + } + break; + default: + if(!downloadList->isColumnHidden(ETA)) { + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + } + } + if(!downloadList->isColumnHidden(SEEDSLEECH)) { + QString tmp = misc::toQString(h.num_seeds(), true); + if(h.num_complete() >= 0) + tmp.append(QString("(")+misc::toQString(h.num_complete())+QString(")")); + tmp.append(QString("/")+misc::toQString(h.num_peers() - h.num_seeds(), true)); + if(h.num_incomplete() >= 0) + tmp.append(QString("(")+misc::toQString(h.num_incomplete())+QString(")")); + DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(tmp)); + } + if(!downloadList->isColumnHidden(RATIO)) { + DLListModel->setData(DLListModel->index(row, RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash)))); + } + }catch(invalid_handle e) {} + return added; +} + +void DownloadingTorrents::addTorrent(QString hash) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + int row = getRowFromHash(hash); + qDebug("DL: addTorrent(): %s, row: %d", (const char*)hash.toLocal8Bit(), row); + if(row != -1) return; + row = DLListModel->rowCount(); + // Adding torrent to download list + DLListModel->insertRow(row); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(h.name())); + DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); + DLListModel->setData(DLListModel->index(row, RATIO), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + if(BTSession->isQueueingEnabled()) + DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); + DLListModel->setData(DLListModel->index(row, HASH), QVariant(hash)); + // Pause torrent if it is + if(h.is_paused()) { + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/paused.png"))), Qt::DecorationRole); + setRowColor(row, QString::fromUtf8("red")); + }else{ + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); + setRowColor(row, QString::fromUtf8("grey")); + } + ++nbTorrents; + emit unfinishedTorrentsNumberChanged(nbTorrents); +} + +// Save columns width in a file to remember them +// (download list) +void DownloadingTorrents::saveColWidthDLList() const{ + qDebug("Saving columns width in download list"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QStringList width_list; + QStringList new_width_list; + short nbColumns = DLListModel->columnCount()-1; + QString line = settings.value("DownloadListColsWidth", QString()).toString(); + if(!line.isEmpty()) { + width_list = line.split(' '); + } + for(short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { + // load the former width + new_width_list << width_list.at(i); + } else if(downloadList->columnWidth(i)>=1) { + // usual case, save the current width + new_width_list << QString::fromUtf8(misc::toString(downloadList->columnWidth(i)).c_str()); + } else { + // default width + downloadList->resizeColumnToContents(i); + new_width_list << QString::fromUtf8(misc::toString(downloadList->columnWidth(i)).c_str()); + } + } + settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" "))); + QVariantList visualIndexes; + for(int i=0; iheader()->visualIndex(i)); + } + settings.setValue(QString::fromUtf8("DownloadListVisualIndexes"), visualIndexes); + qDebug("Download list columns width saved"); +} + +// Load columns width in a file that were saved previously +// (download list) +bool DownloadingTorrents::loadColWidthDLList() { + qDebug("Loading columns width for download list"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QString line = settings.value(QString::fromUtf8("DownloadListColsWidth"), QString()).toString(); + if(line.isEmpty()) + return false; + QStringList width_list = line.split(QString::fromUtf8(" ")); + if(width_list.size() != DLListModel->columnCount()-1) { + qDebug("Corrupted values for download list columns sizes"); + return false; + } + unsigned int listSize = width_list.size(); + for(unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + } + QVariantList visualIndexes = settings.value(QString::fromUtf8("DownloadListVisualIndexes"), QVariantList()).toList(); + if(visualIndexes.size() != DLListModel->columnCount()-1) { + qDebug("Corrupted values for download list columns sizes"); + return false; + } + bool change = false; + do { + change = false; + for(int i=0;iheader()->logicalIndex(i)).toInt(); + if(i != new_visual_index) { + qDebug("Moving column from %d to %d", downloadList->header()->logicalIndex(i), new_visual_index); + downloadList->header()->moveSection(i, new_visual_index); + change = true; + } + } + }while(change); + qDebug("Download list columns width loaded"); + return true; +} + +void DownloadingTorrents::saveLastSortedColumn() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + Qt::SortOrder sortOrder = downloadList->header()->sortIndicatorOrder(); + QString sortOrderLetter; + if(sortOrder == Qt::AscendingOrder) + sortOrderLetter = QString::fromUtf8("a"); + else + sortOrderLetter = QString::fromUtf8("d"); + int index = downloadList->header()->sortIndicatorSection(); + settings.setValue(QString::fromUtf8("DownloadListSortedCol"), misc::toQString(index)+sortOrderLetter); +} + +void DownloadingTorrents::loadLastSortedColumn() { + // Loading last sorted column + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QString sortedCol = settings.value(QString::fromUtf8("DownloadListSortedCol"), QString()).toString(); + if(!sortedCol.isEmpty()) { + Qt::SortOrder sortOrder; + if(sortedCol.endsWith(QString::fromUtf8("d"))) + sortOrder = Qt::DescendingOrder; + else + sortOrder = Qt::AscendingOrder; + sortedCol = sortedCol.left(sortedCol.size()-1); + int index = sortedCol.toInt(); + downloadList->sortByColumn(index, sortOrder); + } +} + +void DownloadingTorrents::updateFileSizeAndProgress(QString hash) { + int row = getRowFromHash(hash); + Q_ASSERT(row != -1); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + //DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); +} + +// Set the color of a row in data model +void DownloadingTorrents::setRowColor(int row, QColor color) { + unsigned int nbColumns = DLListModel->columnCount()-1; + for(unsigned int i=0; isetData(DLListModel->index(row, i), QVariant(color), Qt::ForegroundRole); + } +} + +// return the row of in data model +// corresponding to the given the hash +int DownloadingTorrents::getRowFromHash(QString hash) const{ + unsigned int nbRows = DLListModel->rowCount(); + for(unsigned int i=0; idata(DLListModel->index(i, HASH)) == hash) { + return i; + } + } + return -1; +} diff --git a/src/downloadingTorrents.h b/src/downloadingTorrents.h new file mode 100644 index 000000000..0004ee408 --- /dev/null +++ b/src/downloadingTorrents.h @@ -0,0 +1,108 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADINGTORRENTS_H +#define DOWNLOADINGTORRENTS_H + +#include "ui_download.h" +#include "qtorrenthandle.h" + +class QStandardItemModel; +class bittorrent; +class DLListDelegate; +class QSortFilterProxyModel; + +using namespace libtorrent; + +class DownloadingTorrents : public QWidget, public Ui::downloading{ + Q_OBJECT + private: + QObject *parent; + bittorrent *BTSession; + DLListDelegate *DLDelegate; + QStandardItemModel *DLListModel; + QSortFilterProxyModel *proxyModel; + unsigned int nbTorrents; + void hideOrShowColumn(int index); + bool loadHiddenColumns(); + void saveHiddenColumns(); + QAction* getActionHoSCol(int index); + + public: + DownloadingTorrents(QObject *parent, bittorrent *BTSession); + ~DownloadingTorrents(); + // Methods + bool loadColWidthDLList(); + int getRowFromHash(QString hash) const; + QString getHashFromRow(unsigned int row) const; + QStringList getSelectedTorrents(bool only_one=false) const; + unsigned int getNbTorrentsInList() const; + void enablePriorityColumn(bool enable); + + signals: + void unfinishedTorrentsNumberChanged(unsigned int); + void torrentDoubleClicked(QString hash, bool finished); + + protected slots: + void on_actionSet_download_limit_triggered(); + void notifyTorrentDoubleClicked(const QModelIndex& index); + void on_actionSet_upload_limit_triggered(); + void displayDLListMenu(const QPoint& pos); + void displayDLHoSMenu(const QPoint&); + void saveColWidthDLList() const; + void setRowColor(int row, QColor color); + void showProperties(const QModelIndex &index); + void hideOrShowColumnName(); + void hideOrShowColumnSize(); + void hideOrShowColumnProgress(); + void hideOrShowColumnDownSpeed(); + void hideOrShowColumnUpSpeed(); + void hideOrShowColumnSeedersLeechers(); + void hideOrShowColumnRatio(); + void hideOrShowColumnEta(); + void hideOrShowColumnPriority(); + void forceRecheck(); + + public slots: + bool updateTorrent(QTorrentHandle h); + void pauseTorrent(QString hash); + void deleteTorrent(QString hash); + void propertiesSelection(); + void updateFileSizeAndProgress(QString hash); + void showPropertiesFromHash(QString hash); + void hidePriorityColumn(bool hide); + void saveLastSortedColumn(); + void loadLastSortedColumn(); + void addTorrent(QString hash); + void updateMetadata(QTorrentHandle &h); + +}; + +#endif diff --git a/src/engineSelect.ui b/src/engineSelect.ui new file mode 100644 index 000000000..4df6732c3 --- /dev/null +++ b/src/engineSelect.ui @@ -0,0 +1,125 @@ + + engineSelect + + + + 0 + 0 + 541 + 254 + + + + true + + + Search plugins + + + + + + + 75 + true + true + + + + Installed search engines: + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::ExtendedSelection + + + true + + + false + + + + Name + + + + + Url + + + + + Enabled + + + + + + + + + + + + + + true + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + + + + + + Install a new one + + + + + + + Check for updates + + + + + + + Close + + + + + + + + + Enable + + + + + Disable + + + + + Uninstall + + + + + + diff --git a/src/engineSelectDlg.cpp b/src/engineSelectDlg.cpp new file mode 100644 index 000000000..96590d1cf --- /dev/null +++ b/src/engineSelectDlg.cpp @@ -0,0 +1,628 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include "engineSelectDlg.h" +#include "downloadThread.h" +#include "misc.h" +#include "ico.h" +#include "pluginSource.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_ZZIP +#include +#endif + +#define ENGINE_NAME 0 +#define ENGINE_URL 1 +#define ENGINE_STATE 2 +#define ENGINE_ID 3 + +engineSelectDlg::engineSelectDlg(QWidget *parent, SupportedEngines *supported_engines) : QDialog(parent), supported_engines(supported_engines) { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + pluginsTree->header()->resizeSection(0, 170); + pluginsTree->header()->resizeSection(1, 220); + pluginsTree->hideColumn(ENGINE_ID); + actionEnable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); + actionDisable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); + actionUninstall->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); + connect(actionEnable, SIGNAL(triggered()), this, SLOT(enableSelection())); + connect(actionDisable, SIGNAL(triggered()), this, SLOT(disableSelection())); + connect(pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&))); + downloader = new downloadThread(this); + connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processDownloadedFile(QString, QString))); + connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(handleDownloadFailure(QString, QString))); + loadSupportedSearchEngines(); + connect(supported_engines, SIGNAL(newSupportedEngine(QString)), this, SLOT(addNewEngine(QString))); + connect(pluginsTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(toggleEngineState(QTreeWidgetItem*, int))); + show(); +} + +engineSelectDlg::~engineSelectDlg() { + qDebug("Destroying engineSelectDlg"); + emit enginesChanged(); + qDebug("Before deleting downloader"); + delete downloader; + qDebug("Engine plugins dialog destroyed"); +} + +void engineSelectDlg::dropEvent(QDropEvent *event) { + event->acceptProposedAction(); + QStringList files=event->mimeData()->text().split(QString::fromUtf8("\n")); + QString file; + foreach(file, files) { + qDebug("dropped %s", file.toLocal8Bit().data()); + file = file.replace("file://", ""); + if(file.startsWith("http://", Qt::CaseInsensitive) || file.startsWith("https://", Qt::CaseInsensitive) || file.startsWith("ftp://", Qt::CaseInsensitive)) { + downloader->downloadUrl(file); + continue; + } + if(file.endsWith(".py", Qt::CaseInsensitive)) { + QString plugin_name = file.split(QDir::separator()).last(); + plugin_name.replace(".py", ""); + installPlugin(file, plugin_name); + } +#ifdef HAVE_ZZIP + if(file.endsWith(".zip", Qt::CaseInsensitive)) { + installZipPlugin(file); + } +#endif + } +} + +// Decode if we accept drag 'n drop or not +void engineSelectDlg::dragEnterEvent(QDragEnterEvent *event) { + QString mime; + foreach(mime, event->mimeData()->formats()){ + qDebug("mimeData: %s", mime.toLocal8Bit().data()); + } + if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { + event->acceptProposedAction(); + } +} + +void engineSelectDlg::on_updateButton_clicked() { + // Download version file from primary server + downloader->downloadUrl("http://www.dchris.eu/search_engine2/versions.txt"); +} + +void engineSelectDlg::toggleEngineState(QTreeWidgetItem *item, int) { + SupportedEngine *engine = supported_engines->value(item->text(ENGINE_ID)); + engine->setEnabled(!engine->isEnabled()); + if(engine->isEnabled()) { + item->setText(ENGINE_STATE, tr("Yes")); + setRowColor(pluginsTree->indexOfTopLevelItem(item), "green"); + } else { + item->setText(ENGINE_STATE, tr("No")); + setRowColor(pluginsTree->indexOfTopLevelItem(item), "red"); + } +} + +void engineSelectDlg::displayContextMenu(const QPoint&) { + QMenu myContextMenu(this); + QModelIndex index; + // Enable/disable pause/start action given the DL state + QList items = pluginsTree->selectedItems(); + bool has_enable = false, has_disable = false; + QTreeWidgetItem *item; + foreach(item, items) { + QString id = item->text(ENGINE_ID); + if(supported_engines->value(id)->isEnabled() and !has_disable) { + myContextMenu.addAction(actionDisable); + has_disable = true; + } + if(!supported_engines->value(id)->isEnabled() and !has_enable) { + myContextMenu.addAction(actionEnable); + has_enable = true; + } + if(has_enable && has_disable) break; + } + myContextMenu.addSeparator(); + myContextMenu.addAction(actionUninstall); + myContextMenu.exec(QCursor::pos()); +} + +void engineSelectDlg::on_closeButton_clicked() { + close(); +} + +void engineSelectDlg::on_actionUninstall_triggered() { + QList items = pluginsTree->selectedItems(); + QTreeWidgetItem *item; + bool change = false; + bool error = false; + foreach(item, items) { + int index = pluginsTree->indexOfTopLevelItem(item); + Q_ASSERT(index != -1); + QString id = item->text(ENGINE_ID); + if(QFile::exists(":/search_engine/engines/"+id+".py")) { + error = true; + // Disable it instead + supported_engines->value(id)->setEnabled(false); + item->setText(ENGINE_STATE, tr("No")); + setRowColor(index, "red"); + continue; + }else { + // Proceed with uninstall + // remove it from hard drive + QDir enginesFolder(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"); + QStringList filters; + filters << id+".*"; + QStringList files = enginesFolder.entryList(filters, QDir::Files, QDir::Unsorted); + QString file; + foreach(file, files) { + enginesFolder.remove(file); + } + // Remove it from supported engines + delete supported_engines->take(id); + delete item; + change = true; + } + } + if(error) + QMessageBox::warning(0, tr("Uninstall warning"), tr("Some plugins could not be uninstalled because they are included in qBittorrent.\n Only the ones you added yourself can be uninstalled.\nHowever, those plugins were disabled.")); + else + QMessageBox::information(0, tr("Uninstall success"), tr("All selected plugins were uninstalled successfully")); +} + +void engineSelectDlg::enableSelection() { + QList items = pluginsTree->selectedItems(); + QTreeWidgetItem *item; + foreach(item, items) { + int index = pluginsTree->indexOfTopLevelItem(item); + Q_ASSERT(index != -1); + QString id = item->text(ENGINE_ID); + supported_engines->value(id)->setEnabled(true); + item->setText(ENGINE_STATE, tr("Yes")); + setRowColor(index, "green"); + } +} + +void engineSelectDlg::disableSelection() { + QList items = pluginsTree->selectedItems(); + QTreeWidgetItem *item; + foreach(item, items) { + int index = pluginsTree->indexOfTopLevelItem(item); + Q_ASSERT(index != -1); + QString id = item->text(ENGINE_ID); + supported_engines->value(id)->setEnabled(false); + item->setText(ENGINE_STATE, tr("No")); + setRowColor(index, "red"); + } +} + +// Set the color of a row in data model +void engineSelectDlg::setRowColor(int row, QString color){ + QTreeWidgetItem *item = pluginsTree->topLevelItem(row); + for(int i=0; icolumnCount(); ++i){ + item->setData(i, Qt::ForegroundRole, QVariant(QColor(color))); + } +} + +QList engineSelectDlg::findItemsWithUrl(QString url){ + QList res; + for(int i=0; itopLevelItemCount(); ++i) { + QTreeWidgetItem *item = pluginsTree->topLevelItem(i); + if(url.startsWith(item->text(ENGINE_URL), Qt::CaseInsensitive)) + res << item; + } + return res; +} + +QTreeWidgetItem* engineSelectDlg::findItemWithID(QString id){ + QList res; + for(int i=0; itopLevelItemCount(); ++i) { + QTreeWidgetItem *item = pluginsTree->topLevelItem(i); + if(id == item->text(ENGINE_ID)) + return item; + } + return 0; +} + +bool engineSelectDlg::isUpdateNeeded(QString plugin_name, float new_version) const { + float old_version = misc::getPluginVersion(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py"); + qDebug("IsUpdate needed? tobeinstalled: %.2f, alreadyinstalled: %.2f", new_version, old_version); + return (new_version > old_version); +} + +#ifdef HAVE_ZZIP +void engineSelectDlg::installZipPlugin(QString path) { + QStringList plugins; + QStringList favicons; + ZZIP_DIR* dir = zzip_dir_open(path.toLocal8Bit().data(), 0); + if(!dir) { + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("Search engine plugin archive could not be read.")); + return; + } + ZZIP_DIRENT dirent; + while(zzip_dir_read(dir, &dirent)) { + /* show info for first file */ + QString name(dirent.d_name); + if(name.endsWith(".py", Qt::CaseInsensitive)) { + plugins << name; + } else { + if(name.endsWith(".png", Qt::CaseInsensitive)) { + favicons << name; + } + } + } + QString plugin; + std::cout << dirent.d_name << std::endl; + ZZIP_FILE* fp = zzip_file_open(dir, dirent.d_name, 0); + if (fp) { + char buf[10]; + zzip_ssize_t len = zzip_file_read(fp, buf, 10); + if (len) { + /* show head of README */ + std::cout << buf; + } + zzip_file_close(fp); + std::cout << std::endl; + } + foreach(plugin, plugins) { + QString plugin_name = plugin.split(QDir::separator()).last(); + plugin_name.chop(3); // Remove .py extension + qDebug("Detected plugin %s in archive", plugin_name.toLocal8Bit().data()); + ZZIP_FILE* fp = zzip_file_open(dir, plugin.toLocal8Bit().data(), 0); + if(fp) { + QTemporaryFile *tmpfile = new QTemporaryFile(); + QString tmpPath; + // Write file + if(tmpfile->open()) { + tmpPath = tmpfile->fileName(); + char buf[255]; + zzip_ssize_t len = zzip_file_read(fp, buf, 255); + while(len) { + tmpfile->write(buf, len); + len = zzip_file_read(fp, buf, 255); + } + zzip_file_close(fp); + tmpfile->close(); + } else { + qDebug("Could not open tmp file"); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + delete tmpfile; + continue; + } + // Install plugin + installPlugin(tmpPath, plugin_name); + qDebug("installPlugin() finished"); + delete tmpfile; + qDebug("Deleted tmpfile"); + } else { + qDebug("Cannot read file in archive"); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + } + } + QString favicon; + foreach(favicon, favicons) { + qDebug("Detected favicon %s in archive", favicon.toLocal8Bit().data()); + // Ok we have a favicon here + QString plugin_name = favicon.split(QDir::separator()).last(); + plugin_name.chop(4); // Remove .png extension + if(!QFile::exists(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py")) + continue; + // Check if we already have a favicon for this plugin + QString iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".png"; + if(QFile::exists(iconPath)) { + QFile::remove(iconPath); + } + ZZIP_FILE* fp = zzip_file_open(dir, favicon.toLocal8Bit().data(), 0); + if(fp) { + QFile dest_icon(iconPath); + // Write icon + if(dest_icon.open(QIODevice::WriteOnly | QIODevice::Text)) { + char buf[255]; + zzip_ssize_t len = zzip_file_read(fp, buf, 255); + while(len) { + dest_icon.write(buf, len); + len = zzip_file_read(fp, buf, 255); + } + zzip_file_close(fp); + dest_icon.close(); + // Update icon in list + QTreeWidgetItem *item = findItemWithID(plugin_name); + Q_ASSERT(item); + item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } + } + } + zzip_dir_close(dir); +} +#endif + +void engineSelectDlg::installPlugin(QString path, QString plugin_name) { + qDebug("Asked to install plugin at %s", path.toLocal8Bit().data()); + float new_version = misc::getPluginVersion(path); + qDebug("Version to be installed: %.2f", new_version); + if(!isUpdateNeeded(plugin_name, new_version)) { + qDebug("Apparently update it not needed, we have a more recent version"); + QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("A more recent version of %1 search engine plugin is already installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + return; + } + // Process with install + QString dest_path = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py"; + bool update = false; + if(QFile::exists(dest_path)) { + // Backup in case install fails + QFile::copy(dest_path, dest_path+".bak"); + QFile::remove(dest_path); + update = true; + } + // Copy the plugin + QFile::copy(path, dest_path); + // Update supported plugins + supported_engines->update(); + // Check if this was correctly installed + if(!supported_engines->contains(plugin_name)) { + if(update) { + // Remove broken file + QFile::remove(dest_path); + // restore backup + QFile::copy(dest_path+".bak", dest_path); + QFile::remove(dest_path+".bak"); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be updated, keeping old version.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + return; + } else { + // Remove broken file + QFile::remove(dest_path); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + return; + } + } + // Install was successful, remove backup + if(update) { + QFile::remove(dest_path+".bak"); + } + if(update) { + QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully updated.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + return; + } else { + QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + return; + } +} + +void engineSelectDlg::loadSupportedSearchEngines() { + // Some clean up first + pluginsTree->clear(); + foreach(QString name, supported_engines->keys()) { + addNewEngine(name); + } +} + +void engineSelectDlg::addNewEngine(QString engine_name) { + QTreeWidgetItem *item = new QTreeWidgetItem(pluginsTree); + SupportedEngine *engine = supported_engines->value(engine_name); + item->setText(ENGINE_NAME, engine->getFullName()); + item->setText(ENGINE_URL, engine->getUrl()); + item->setText(ENGINE_ID, engine->getName()); + if(engine->isEnabled()) { + item->setText(ENGINE_STATE, tr("Yes")); + setRowColor(pluginsTree->indexOfTopLevelItem(item), "green"); + } else { + item->setText(ENGINE_STATE, tr("No")); + setRowColor(pluginsTree->indexOfTopLevelItem(item), "red"); + } + // Handle icon + QString iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+engine->getName()+".png"; + if(QFile::exists(iconPath)) { + // Good, we already have the icon + item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } else { + iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+engine->getName()+".ico"; + if(QFile::exists(iconPath)) { // ICO support + item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } else { + // Icon is missing, we must download it + downloader->downloadUrl(engine->getUrl()+"/favicon.ico"); + } + } +} + + void engineSelectDlg::on_installButton_clicked() { + pluginSourceDlg *dlg = new pluginSourceDlg(this); + connect(dlg, SIGNAL(askForLocalFile()), this, SLOT(askForLocalPlugin())); + connect(dlg, SIGNAL(askForUrl()), this, SLOT(askForPluginUrl())); + } + + void engineSelectDlg::askForPluginUrl() { + bool ok; + QString url = QInputDialog::getText(this, tr("New search engine plugin URL"), + tr("URL:"), QLineEdit::Normal, + "http://", &ok); + if (ok && !url.isEmpty()) + downloader->downloadUrl(url); + } + + void engineSelectDlg::askForLocalPlugin() { + QStringList pathsList = QFileDialog::getOpenFileNames(0, + tr("Select search plugins"), QDir::homePath(), +#ifdef HAVE_ZZIP + tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py *.zip)")); +#else + tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py)")); +#endif + QString path; + foreach(path, pathsList) { + if(path.endsWith(".py", Qt::CaseInsensitive)) { + QString plugin_name = path.split(QDir::separator()).last(); + plugin_name.replace(".py", "", Qt::CaseInsensitive); + installPlugin(path, plugin_name); + } +#ifdef HAVE_ZZIP + else { + if(path.endsWith(".zip", Qt::CaseInsensitive)) { + installZipPlugin(path); + } + } +#endif + } + } + + bool engineSelectDlg::parseVersionsFile(QString versions_file, QString updateServer) { + qDebug("Checking if update is needed"); + bool file_correct = false; + QFile versions(versions_file); + if(!versions.open(QIODevice::ReadOnly | QIODevice::Text)){ + qDebug("* Error: Could not read versions.txt file"); + return false; + } + bool updated = false; + while(!versions.atEnd()) { + QByteArray line = versions.readLine(); + line.replace("\n", ""); + line = line.trimmed(); + if(line.isEmpty()) continue; + if(line.startsWith("#")) continue; + QList list = line.split(' '); + if(list.size() != 2) continue; + QString plugin_name = QString(list.first()); + if(!plugin_name.endsWith(":")) continue; + plugin_name.chop(1); // remove trailing ':' + bool ok; + float version = list.last().toFloat(&ok); + qDebug("read line %s: %.2f", plugin_name.toLocal8Bit().data(), version); + if(!ok) continue; + file_correct = true; + if(isUpdateNeeded(plugin_name, version)) { + qDebug("Plugin: %s is outdated", plugin_name.toLocal8Bit().data()); + // Downloading update + downloader->downloadUrl(updateServer+plugin_name+".pyqBT"); // Actually this is really a .py + downloader->downloadUrl(updateServer+plugin_name+".png"); + updated = true; + }else { + qDebug("Plugin: %s is up to date", plugin_name.toLocal8Bit().data()); + } + } + // Close file + versions.close(); + // Clean up tmp file + QFile::remove(versions_file); + if(file_correct && !updated) { + QMessageBox::information(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("All your plugins are already up to date.")); + } + return file_correct; + } + + void engineSelectDlg::processDownloadedFile(QString url, QString filePath) { + qDebug("engineSelectDlg received %s", url.toLocal8Bit().data()); + if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){ + // Icon downloaded + QImage fileIcon; + if(fileIcon.load(filePath)) { + QList items = findItemsWithUrl(url); + QTreeWidgetItem *item; + foreach(item, items){ + QString id = item->text(ENGINE_ID); + QString iconPath; + QFile icon(filePath); + icon.open(QIODevice::ReadOnly); + if(ICOHandler::canRead(&icon)) + iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+id+".ico"; + else + iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+id+".png"; + QFile::copy(filePath, iconPath); + item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } + } + // Delete tmp file + QFile::remove(filePath); + return; + } + if(url == "http://www.dchris.eu/search_engine2/versions.txt") { + if(!parseVersionsFile(filePath, "http://www.dchris.eu/search_engine2/")) { + qDebug("Primary update server failed, try secondary"); + downloader->downloadUrl("http://hydr0g3n.free.fr/search_engine2/versions.txt"); + } + QFile::remove(filePath); + return; + } + if(url == "http://hydr0g3n.free.fr/search_engine2/versions.txt") { + if(!parseVersionsFile(filePath, "http://hydr0g3n.free.fr/search_engine2/")) { + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, update server is temporarily unavailable.")); + } + QFile::remove(filePath); + return; + } + if(url.endsWith(".pyqBT", Qt::CaseInsensitive) || url.endsWith(".py", Qt::CaseInsensitive)) { + QString plugin_name = url.split('/').last(); + plugin_name.replace(".pyqBT", ""); + plugin_name.replace(".py", ""); + installPlugin(filePath, plugin_name); + QFile::remove(filePath); + return; + } +#ifdef HAVE_ZZIP + if(url.endsWith(".zip", Qt::CaseInsensitive)) { + installZipPlugin(filePath); + QFile::remove(filePath); + return; + } +#endif + } + + void engineSelectDlg::handleDownloadFailure(QString url, QString reason) { + if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){ + qDebug("Could not download favicon: %s, reason: %s", url.toLocal8Bit().data(), reason.toLocal8Bit().data()); + return; + } + if(url == "http://www.dchris.eu/search_engine2/versions.txt") { + // Primary update server failed, try secondary + qDebug("Primary update server failed, try secondary"); + downloader->downloadUrl("http://hydr0g3n.free.fr/search_engine2/versions.txt"); + return; + } + if(url == "http://hydr0g3n.free.fr/search_engine2/versions.txt") { + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, update server is temporarily unavailable.")); + return; + } + if(url.endsWith(".pyqBT", Qt::CaseInsensitive) || url.endsWith(".py", Qt::CaseInsensitive)) { + // a plugin update download has been failed + QString plugin_name = url.split('/').last(); + plugin_name.replace(".pyqBT", "", Qt::CaseInsensitive); + plugin_name.replace(".py", "", Qt::CaseInsensitive); + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + } +#ifdef HAVE_ZZIP + if(url.endsWith(".zip", Qt::CaseInsensitive)) { + QString plugin_name = url.split('/').last(); + plugin_name.replace(".zip", "", Qt::CaseInsensitive); + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); + } +#endif + } diff --git a/src/engineSelectDlg.h b/src/engineSelectDlg.h new file mode 100644 index 000000000..c15cc6f19 --- /dev/null +++ b/src/engineSelectDlg.h @@ -0,0 +1,84 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef ENGINE_SELECT_DLG_H +#define ENGINE_SELECT_DLG_H + +#include "ui_engineSelect.h" +#include "supportedEngines.h" + +class downloadThread; +class QDropEvent; + +class engineSelectDlg : public QDialog, public Ui::engineSelect{ + Q_OBJECT + + private: + downloadThread *downloader; + SupportedEngines *supported_engines; + + public: + engineSelectDlg(QWidget *parent, SupportedEngines *supported_engines); + ~engineSelectDlg(); + QList findItemsWithUrl(QString url); + QTreeWidgetItem* findItemWithID(QString id); + + protected: + bool parseVersionsFile(QString versions_file, QString updateServer); + bool isUpdateNeeded(QString plugin_name, float new_version) const; + + signals: + void enginesChanged(); + + protected slots: + void on_closeButton_clicked(); + void loadSupportedSearchEngines(); + void addNewEngine(QString engine_name); + void toggleEngineState(QTreeWidgetItem*, int); + void setRowColor(int row, QString color); + void processDownloadedFile(QString url, QString filePath); + void handleDownloadFailure(QString url, QString reason); + void displayContextMenu(const QPoint& pos); + void enableSelection(); + void disableSelection(); + void on_actionUninstall_triggered(); + void on_updateButton_clicked(); + void on_installButton_clicked(); + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void installPlugin(QString plugin_path, QString plugin_name); + void askForLocalPlugin(); + void askForPluginUrl(); +#ifdef HAVE_ZZIP + void installZipPlugin(QString path); +#endif +}; + +#endif diff --git a/src/eventmanager.cpp b/src/eventmanager.cpp new file mode 100644 index 000000000..819d0ca05 --- /dev/null +++ b/src/eventmanager.cpp @@ -0,0 +1,105 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#include "eventmanager.h" +#include "bittorrent.h" +#include + +EventManager::EventManager(QObject *parent, bittorrent *BTSession) + : QObject(parent), BTSession(BTSession) +{ +} + +QList EventManager::getEventList() const { + return event_list.values(); +} + +void EventManager::addedTorrent(QTorrentHandle& h) +{ + modifiedTorrent(h); +} + +void EventManager::deletedTorrent(QString hash) +{ + event_list.remove(hash); +} + +void EventManager::modifiedTorrent(QTorrentHandle h) +{ + QString hash = h.hash(); + QVariantMap event; + + if(h.is_paused()) { + event["state"] = QVariant("paused"); + } else { + if(BTSession->isQueueingEnabled() && h.is_queued()) { + event["state"] = QVariant("queued"); + } else { + switch(h.state()) + { + case torrent_status::finished: + case torrent_status::seeding: + event["state"] = QVariant("seeding"); + break; + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + event["state"] = QVariant("checking"); + break; + case torrent_status::allocating: + case torrent_status::downloading: + case torrent_status::downloading_metadata: + if(h.download_payload_rate() > 0) + event["state"] = QVariant("downloading"); + else + event["state"] = QVariant("stalled"); + break; + default: + qDebug("No status, should not happen!!! status is %d", h.state()); + event["state"] = QVariant(); + } + } + } + event["name"] = QVariant(h.name()); + event["size"] = QVariant((qlonglong)h.actual_size()); + if(!h.is_seed()) { + event["progress"] = QVariant(h.progress()); + event["dlspeed"] = QVariant(h.download_payload_rate()); + if(BTSession->isQueueingEnabled()) { + event["priority"] = QVariant(h.queue_position()); + } else { + event["priority"] = -1; + } + } + event["upspeed"] = QVariant(h.upload_payload_rate()); + event["seed"] = QVariant(h.is_seed()); + event["hash"] = QVariant(hash); + event_list[hash] = event; +} diff --git a/src/eventmanager.h b/src/eventmanager.h new file mode 100644 index 000000000..afb97b4c9 --- /dev/null +++ b/src/eventmanager.h @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef EVENTMANAGER_H +#define EVENTMANAGER_H + +#include "qtorrenthandle.h" +#include +#include + +struct bittorrent; + +class EventManager : public QObject +{ + Q_OBJECT + private: + QHash event_list; + bittorrent* BTSession; + + protected: + void update(QVariantMap event); + + public: + EventManager(QObject *parent, bittorrent* BTSession); + QList getEventList() const; + + public slots: + void addedTorrent(QTorrentHandle& h); + void deletedTorrent(QString hash); + void modifiedTorrent(QTorrentHandle h); +}; + +#endif diff --git a/src/feedList.h b/src/feedList.h new file mode 100644 index 000000000..c367cea4f --- /dev/null +++ b/src/feedList.h @@ -0,0 +1,208 @@ +#ifndef FEEDLIST_H +#define FEEDLIST_H + +#include +#include +#include +#include +#include +#include +#include +#include "rss.h" + +class FeedList: public QTreeWidget { + Q_OBJECT + +private: + RssManager *rssmanager; + QHash mapping; + QHash feeds_items; + QTreeWidgetItem* current_feed; + QTreeWidgetItem *unread_item; + +public: + FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) { + setContextMenuPolicy(Qt::CustomContextMenu); + setDragDropMode(QAbstractItemView::InternalMove); + setSelectionMode(QAbstractItemView::ExtendedSelection); + setColumnCount(1); + QTreeWidgetItem *___qtreewidgetitem = headerItem(); + ___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8)); + connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*))); + unread_item = new QTreeWidgetItem(this); + unread_item->setText(0, tr("Unread") + QString::fromUtf8(" (") + QString::number(rssmanager->getNbUnRead(), 10)+ QString(")")); + unread_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/mail-folder-inbox.png"))); + itemAdded(unread_item, rssmanager); + setCurrentItem(unread_item); + } + + void itemAdded(QTreeWidgetItem *item, RssFile* file) { + mapping[item] = file; + if(file->getType() == RssFile::STREAM) { + feeds_items[file->getID()] = item; + } + } + + void itemRemoved(QTreeWidgetItem *item) { + RssFile* file = mapping.take(item); + if(file->getType() == RssFile::STREAM) + feeds_items.remove(file->getID()); + } + + bool hasFeed(QString url) const { + return feeds_items.contains(QUrl(url).toString()); + } + + QList getAllFeedItems() const { + return feeds_items.values(); + } + + QTreeWidgetItem* getUnreadItem() const { + return unread_item; + } + + QStringList getItemPath(QTreeWidgetItem* item) const { + QStringList path; + if(item) { + if(item->parent()) + path.append(getItemPath(item->parent())); + path.append(getRSSItem(item)->getID()); + } + return path; + } + + QList getAllOpenFolders(QTreeWidgetItem *parent=0) const { + QList open_folders; + int nbChildren; + if(parent) + nbChildren = parent->childCount(); + else + nbChildren = topLevelItemCount(); + for(int i=0; ichild(i); + else + item = topLevelItem(i); + if(getItemType(item) == RssFile::FOLDER && item->isExpanded()) { + QList open_subfolders = getAllOpenFolders(item); + if(!open_subfolders.empty()) { + open_folders.append(open_subfolders); + } else { + open_folders << item; + } + } + } + return open_folders; + } + + QList getAllFeedItems(QTreeWidgetItem* folder) { + QList feeds; + int nbChildren = folder->childCount(); + for(int i=0; ichild(i); + if(getItemType(item) == RssFile::STREAM) { + feeds << item; + } else { + feeds.append(getAllFeedItems(item)); + } + } + return feeds; + } + + RssFile* getRSSItem(QTreeWidgetItem *item) const { + return mapping[item]; + } + + RssFile::FileType getItemType(QTreeWidgetItem *item) const { + return mapping[item]->getType(); + } + + QString getItemID(QTreeWidgetItem *item) const { + return mapping[item]->getID(); + } + + QTreeWidgetItem* getTreeItemFromUrl(QString url) const{ + return feeds_items[url]; + } + + RssStream* getRSSItemFromUrl(QString url) const { + return (RssStream*)getRSSItem(getTreeItemFromUrl(url)); + } + + QTreeWidgetItem* currentItem() const { + return current_feed; + } + + QTreeWidgetItem* currentFeed() const { + return current_feed; + } + +signals: + void foldersAltered(QList folders); + void overwriteAttempt(QString filename); + +protected slots: + void updateCurrentFeed(QTreeWidgetItem* new_item) { + if((new_item && getItemType(new_item) == RssFile::STREAM) || new_item == unread_item) + current_feed = new_item; + } + +protected: + void dragMoveEvent(QDragMoveEvent * event) { + QTreeWidgetItem *item = itemAt(event->pos()); + if(item == unread_item) { + event->ignore(); + } else { + if(item && getItemType(item) != RssFile::FOLDER) + event->ignore(); + else { + if(selectedItems().contains(unread_item)) { + event->ignore(); + } else { + QTreeWidget::dragMoveEvent(event); + } + } + } + } + + void dropEvent(QDropEvent *event) { + qDebug("dropEvent"); + QList folders_altered; + QTreeWidgetItem *dest_folder_item = itemAt(event->pos()); + RssFolder *dest_folder; + if(dest_folder_item) { + dest_folder = (RssFolder*)getRSSItem(dest_folder_item); + folders_altered << dest_folder_item; + } else { + dest_folder = rssmanager; + } + QList src_items = selectedItems(); + // Check if there is not going to overwrite another file + foreach(QTreeWidgetItem *src_item, src_items) { + RssFile *file = getRSSItem(src_item); + if(dest_folder->hasChild(file->getID())) { + emit overwriteAttempt(file->getID()); + return; + } + } + // Proceed with the move + foreach(QTreeWidgetItem *src_item, src_items) { + QTreeWidgetItem *parent_folder = src_item->parent(); + if(parent_folder && !folders_altered.contains(parent_folder)) + folders_altered << parent_folder; + // Actually move the file + RssFile *file = getRSSItem(src_item); + rssmanager->moveFile(file, dest_folder); + } + QTreeWidget::dropEvent(event); + if(dest_folder_item) + dest_folder_item->setExpanded(true); + // Emit signal for update + if(!folders_altered.empty()) + emit foldersAltered(folders_altered); + } + +}; + +#endif // FEEDLIST_H diff --git a/src/filterParserThread.h b/src/filterParserThread.h new file mode 100644 index 000000000..de1907fe8 --- /dev/null +++ b/src/filterParserThread.h @@ -0,0 +1,405 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef FILTERPARSERTHREAD_H +#define FILTERPARSERTHREAD_H + +#include +#include +#include +#include + +#include +#include + +using namespace libtorrent; +using namespace std; + +// P2B Stuff +#include +#ifdef Q_WS_WIN + #include +#else + #include +#endif +// End of P2B stuff + +class FilterParserThread : public QThread { + Q_OBJECT + + private: + session *s; + ip_filter filter; + bool abort; + QString filePath; + + protected: + void run(){ + qDebug("Processing filter file"); + if(filePath.endsWith(".dat", Qt::CaseInsensitive)) { + // eMule DAT file + parseDATFilterFile(filePath); + } else { + if(filePath.endsWith(".p2p", Qt::CaseInsensitive)) { + // PeerGuardian p2p file + parseP2PFilterFile(filePath); + } else { + if(filePath.endsWith(".p2p", Qt::CaseInsensitive)) { + // PeerGuardian p2p file + parseP2BFilterFile(filePath); + } else { + // Default: eMule DAT format + parseDATFilterFile(filePath); + } + } + } + s->set_ip_filter(filter); + qDebug("IP Filter thread: finished parsing, filter applied"); + } + + public: + FilterParserThread(QObject* parent, session *s) : QThread(parent), s(s), abort(false) { + + } + + ~FilterParserThread(){ + abort = true; + wait(); + } + + // Parser for eMule ip filter in DAT format + void parseDATFilterFile(QString filePath) { + const QRegExp is_ipv6(QString::fromUtf8("^[0-9a-f]{4}(:[0-9a-f]{4}){7}$"), Qt::CaseInsensitive, QRegExp::RegExp); + const QRegExp is_ipv4(QString::fromUtf8("^(([0-1]?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))(\\.(([0-1]?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))){3}$"), Qt::CaseInsensitive, QRegExp::RegExp); + QString strStartIP, strEndIP; + bool IPv4 = true; + QFile file(filePath); + if (file.exists()){ + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("Couldn't open %1 in read mode.").arg(filePath)); + return; + } + unsigned int nbLine = 0; + while (!file.atEnd() && !abort) { + ++nbLine; + QByteArray line = file.readLine(); + // Ignoring empty lines + line = line.trimmed(); + if(line.isEmpty()) continue; + // Ignoring commented lines + if(line.startsWith('#') || line.startsWith("//")) continue; + // Line is not commented + QList partsList = line.split(','); + unsigned int nbElem = partsList.size(); + // IP Range can be splitted by a dash or a comma... + // Check if there is a dash in first part + QByteArray firstPart = partsList.at(0); + int nbAccess = 0; + if(firstPart.contains('-')) { + // Range is splitted by a dash + QList IPs = firstPart.split('-'); + if(IPs.size() != 2) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + continue; + } + strStartIP = IPs.at(0).trimmed(); + strEndIP = IPs.at(1).trimmed(); + // Check if IPs are correct + if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) { + IPv4 = true; + } else { + if(strStartIP.contains(is_ipv6) && strEndIP.contains(is_ipv6)) { + IPv4 = false; + } else { + // Could not determine IP format + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + continue; + } + } + // Check if there is an access value (apparently not mandatory) + if(nbElem > 1) { + // There is possibly one + bool ok; + nbAccess = partsList.at(1).trimmed().toInt(&ok); + if(!ok){ + nbAccess = 0; + } + } + } else { + // Range is probably splitted by a comma + unsigned int nbElem = partsList.size(); + if(nbElem > 1) { + strStartIP = firstPart.trimmed(); + strEndIP = partsList.at(1).trimmed(); + // Check if IPs are correct + if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) { + IPv4 = true; + } else { + if(strStartIP.contains(is_ipv6) && strEndIP.contains(is_ipv6)) { + IPv4 = false; + } else { + // Could not determine IP format + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + continue; + } + } + // Check if there is an access value (apparently not mandatory) + if(nbElem > 2) { + // There is possibly one + bool ok; + nbAccess = partsList.at(2).trimmed().toInt(&ok); + if(!ok){ + nbAccess = 0; + } + } + } + } + if(nbAccess > 127) { + // Ignoring this rule because access value is too high + continue; + } + // Now Add to the filter + QStringList IP; + try { + if(IPv4) { + //IPv4 addresses + IP = strStartIP.split('.'); + if(IP.size() != 4) + throw exception(); + address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); + IP = strEndIP.split('.'); + if(IP.size() != 4) + throw exception(); + address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); + // Apply to bittorrent session + filter.add_rule(start, last, ip_filter::blocked); + } else { + // IPv6, ex : 1fff:0000:0a88:85a3:0000:0000:ac1f:8001 + IP = strStartIP.split(':'); + address_v6 start = address_v6::from_string(strStartIP.remove(':', 0).toLocal8Bit().data()); + IP = strEndIP.split(':'); + address_v6 last = address_v6::from_string(strEndIP.remove(':', 0).toLocal8Bit().data()); + // Apply to bittorrent session + filter.add_rule(start, last, ip_filter::blocked); + } + }catch(exception){ + qDebug("Bad line in filter file, avoided crash..."); + } + } + file.close(); + } + } + + // Parser for PeerGuardian ip filter in p2p format + void parseP2PFilterFile(QString filePath) { + const QRegExp is_ipv4(QString::fromUtf8("^(([0-1]?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))(\\.(([0-1]?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))){3}$"), Qt::CaseInsensitive, QRegExp::RegExp); + QFile file(filePath); + QStringList IP; + if (file.exists()){ + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("Couldn't open %1 in read mode.").arg(filePath)); + return; + } + unsigned int nbLine = 0; + while (!file.atEnd() && !abort) { + ++nbLine; + QByteArray line = file.readLine(); + // Ignoring empty lines + line = line.trimmed(); + if(line.isEmpty()) continue; + // Ignoring commented lines + if(line.startsWith('#') || line.startsWith("//")) continue; + // Line is not commented + QList partsList = line.split(':'); + if(partsList.size() < 2){ + qDebug("p2p file: line %d is malformed.", nbLine); + continue; + } + // Get IP range + QList IPs = partsList.last().split('-'); + if(IPs.size() != 2) { + qDebug("p2p file: line %d is malformed.", nbLine); + continue; + } + QString strStartIP = IPs.at(0).trimmed(); + QString strEndIP = IPs.at(1).trimmed(); + // Check IPs format (IPv4 only) + if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) { + // IPv4 + IP = strStartIP.split('.'); + address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); + IP = strEndIP.split('.'); + address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); + // Apply to bittorrent session + filter.add_rule(start, last, ip_filter::blocked); + } else { + qDebug("p2p file: line %d is malformed.", nbLine); + continue; + } + } + file.close(); + } + } + + int getlineInStream(QDataStream& stream, string& name, char delim) { + char c; + int total_read = 0; + int read; + do { + read = stream.readRawData(&c, 1); + total_read += read; + if(read > 0) { + if(c != delim) { + name += c; + } else { + // Delim found + return total_read; + } + } + } while(read > 0); + return total_read; + } + + // Parser for PeerGuardian ip filter in p2p format + void parseP2BFilterFile(QString filePath) { + QFile file(filePath); + if (file.exists()){ + if(!file.open(QIODevice::ReadOnly)){ + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("Couldn't open %1 in read mode.").arg(filePath)); + return; + } + QDataStream stream(&file); + // Read header + char buf[7]; + unsigned char version; + if( + !stream.readRawData(buf, sizeof(buf)) || + memcmp(buf, "\xFF\xFF\xFF\xFFP2B", 7) || + !stream.readRawData((char*)&version, sizeof(version)) + ) { + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("%1 is not a valid PeerGuardian P2B file.").arg(filePath)); + return; + } + + if(version==1 || version==2) { + qDebug ("p2b version 1 or 2"); + unsigned int start, end; + + string name; + while(getlineInStream(stream, name, '\0') && !abort) { + if( + !stream.readRawData((char*)&start, sizeof(start)) || + !stream.readRawData((char*)&end, sizeof(end)) + ) { + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("%1 is not a valid PeerGuardian P2B file.").arg(filePath)); + return; + } + // Network byte order to Host byte order + // asio address_v4 contructor expects it + // that way + address_v4 first(ntohl(start)); + address_v4 last(ntohl(end)); + // Apply to bittorrent session + filter.add_rule(first, last, ip_filter::blocked); + } + } + else if(version==3) { + qDebug ("p2b version 3"); + unsigned int namecount; + if(!stream.readRawData((char*)&namecount, sizeof(namecount))) { + QMessageBox::critical(0, tr("I/O Error", "Input/Output Error"), tr("%1 is not a valid PeerGuardian P2B file.").arg(filePath)); + return; + } + namecount=ntohl(namecount); + // Reading names although, we don't really care about them + for(unsigned int i=0; i +#include +#include +#include +#include +#include +#include +#include + +HttpConnection::HttpConnection(QTcpSocket *socket, HttpServer *parent) + : QObject(parent), socket(socket), parent(parent) +{ + socket->setParent(this); + connect(socket, SIGNAL(readyRead()), this, SLOT(read())); + connect(socket, SIGNAL(disconnected()), this, SLOT(deleteLater())); +} + +HttpConnection::~HttpConnection() +{ + delete socket; +} + +void HttpConnection::processDownloadedFile(QString url, QString file_path) { + qDebug("URL %s successfully downloaded !", (const char*)url.toLocal8Bit()); + emit torrentReadyToBeDownloaded(file_path, false, url, false); +} + +void HttpConnection::handleDownloadFailure(QString url, QString reason) { + std::cerr << "Could not download " << (const char*)url.toLocal8Bit() << ", reason: " << (const char*)reason.toLocal8Bit() << "\n"; +} + +void HttpConnection::read() +{ + QByteArray input = socket->readAll(); + /*qDebug(" -------"); + qDebug("|REQUEST|"); + qDebug(" -------"); */ + //qDebug("%s", input.toAscii().constData()); + if(input.size() > 100000) { + qDebug("Request too big"); + generator.setStatusLine(400, "Bad Request"); + write(); + return; + } + parser.write(input); + if(parser.isError()) + { + generator.setStatusLine(400, "Bad Request"); + write(); + } + else + if (parser.isParsable()) + respond(); +} + +void HttpConnection::write() +{ + QByteArray output = generator.toByteArray(); + /*qDebug(" --------"); + qDebug("|RESPONSE|"); + qDebug(" --------"); + qDebug()<write(output); + socket->disconnectFromHost(); +} + +void HttpConnection::respond() +{ + //qDebug("Respond called"); + QStringList auth = parser.value("Authorization").split(" ", QString::SkipEmptyParts); + if (auth.size() != 2 || QString::compare(auth[0], "Basic", Qt::CaseInsensitive) != 0 || !parent->isAuthorized(auth[1].toLocal8Bit())) + { + generator.setStatusLine(401, "Unauthorized"); + generator.setValue("WWW-Authenticate", "Basic realm=\"you know what\""); + write(); + return; + } + QString url = parser.url(); + QStringList list = url.split('/', QString::SkipEmptyParts); + if (list.contains(".") || list.contains("..")) + { + respondNotFound(); + return; + } + if (list.size() == 0) + list.append("index.html"); + if (list.size() == 2) + { + if (list[0] == "json") + { + if (list[1] == "events") + { + respondJson(); + return; + } + } + if (list[0] == "command") + { + QString command = list[1]; + respondCommand(command); + generator.setStatusLine(200, "OK"); + write(); + return; + } + } + if (list[0] == "images") + list[0] = "Icons"; + else + list.prepend("webui"); + url = ":/" + list.join("/"); + QFile file(url); + if(!file.open(QIODevice::ReadOnly)) + { + respondNotFound(); + return; + } + QString ext = list.last(); + int index = ext.lastIndexOf('.') + 1; + if (index > 0) + ext.remove(0, index); + else + ext.clear(); + QByteArray data = file.readAll(); + generator.setStatusLine(200, "OK"); + generator.setContentTypeByExt(ext); + generator.setMessage(data); + write(); +} + +void HttpConnection::respondNotFound() +{ + generator.setStatusLine(404, "File not found"); + write(); +} + +void HttpConnection::respondJson() +{ + EventManager* manager = parent->eventManager(); + QString string = json::toJson(manager->getEventList()); + generator.setStatusLine(200, "OK"); + generator.setContentTypeByExt("js"); + generator.setMessage(string); + write(); +} + +void HttpConnection::respondCommand(QString command) +{ + if(command == "download") + { + QString urls = parser.post("urls"); + QStringList list = urls.split('\n'); + foreach(QString url, list){ + url = url.trimmed(); + if(!url.isEmpty()){ + if(url.startsWith("magnet:", Qt::CaseInsensitive)) { + emit MagnetReadyToBeDownloaded(url); + } else { + qDebug("Downloading url: %s", (const char*)url.toLocal8Bit()); + emit UrlReadyToBeDownloaded(url); + } + } + } + return; + } + if(command == "upload") + { + QByteArray torrentfile = parser.torrent(); + // Get a unique filename + QString filePath; + QTemporaryFile tmpfile; + tmpfile.setAutoRemove(false); + if (tmpfile.open()) { + filePath = tmpfile.fileName(); + } else { + std::cerr << "I/O Error: Could not create temporary file" << std::endl; + return; + } + tmpfile.close(); + // Now temporary file is created but closed so that it can be used. + // write torrent to temporary file + QFile torrent(filePath); + if(torrent.open(QIODevice::WriteOnly)) { + torrent.write(torrentfile); + torrent.close(); + } + emit torrentReadyToBeDownloaded(filePath, false, QString(), false); + return; + } + if(command == "resumeall") { + emit resumeAllTorrents(); + return; + } + if(command == "pauseall") { + emit pauseAllTorrents(); + return; + } + if(command == "resume") { + emit resumeTorrent(parser.post("hash")); + return; + } + if(command == "pause") { + emit pauseTorrent(parser.post("hash")); + return; + } + if(command == "delete") { + emit deleteTorrent(parser.post("hash"), false); + return; + } + if(command == "deletePerm") { + emit deleteTorrent(parser.post("hash"), true); + return; + } + if(command == "increasePrio") { + emit increasePrioTorrent(parser.post("hash")); + return; + } + if(command == "decreasePrio") { + emit decreasePrioTorrent(parser.post("hash")); + return; + } +} diff --git a/src/httpconnection.h b/src/httpconnection.h new file mode 100644 index 000000000..848581f22 --- /dev/null +++ b/src/httpconnection.h @@ -0,0 +1,82 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef HTTPCONNECTION_H +#define HTTPCONNECTION_H + +#include "httprequestparser.h" +#include "httpresponsegenerator.h" +#include + +class QTcpSocket; +class HttpServer; + +class HttpConnection : public QObject +{ + Q_OBJECT + private: + QTcpSocket *socket; + HttpServer *parent; + + protected: + HttpRequestParser parser; + HttpResponseGenerator generator; + + protected slots: + void write(); + virtual void respond(); + void respondJson(); + void respondCommand(QString command); + void respondNotFound(); + void processDownloadedFile(QString, QString); + void handleDownloadFailure(QString, QString); + + public: + HttpConnection(QTcpSocket *socket, HttpServer *parent); + ~HttpConnection(); + + private slots: + void read(); + + signals: + void UrlReadyToBeDownloaded(QString url); + void MagnetReadyToBeDownloaded(QString uri); + void torrentReadyToBeDownloaded(QString, bool, QString, bool); + void deleteTorrent(QString hash, bool permanently); + void resumeTorrent(QString hash); + void pauseTorrent(QString hash); + void increasePrioTorrent(QString hash); + void decreasePrioTorrent(QString hash); + void resumeAllTorrents(); + void pauseAllTorrents(); +}; + +#endif diff --git a/src/httprequestparser.cpp b/src/httprequestparser.cpp new file mode 100644 index 000000000..59276ef9f --- /dev/null +++ b/src/httprequestparser.cpp @@ -0,0 +1,148 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#include "httprequestparser.h" +#include +#include + +HttpRequestParser::HttpRequestParser() +{ + headerDone = false; + messageDone = false; + error = false; +} + +HttpRequestParser::~HttpRequestParser() +{ +} + +bool HttpRequestParser::isParsable() const +{ + return !error && headerDone && isValid() && (messageDone || !hasContentLength() || contentLength() == 0); +} + +bool HttpRequestParser::isError() const +{ + return error; +} + +QString HttpRequestParser::url() const +{ + return path; +} + +QByteArray HttpRequestParser::message() const +{ + if(isParsable()) + return data; + return QByteArray(); +} + +QString HttpRequestParser::get(const QString key) const +{ + return getMap[key]; +} + +QString HttpRequestParser::post(const QString key) const +{ + return postMap[key]; +} + +QByteArray HttpRequestParser::torrent() const +{ + return torrent_content; +} + +void HttpRequestParser::write(QByteArray str) +{ + while (!headerDone && str.size()>0) + { + int index = str.indexOf('\n') + 1; + if(index == 0) + { + data += str; + str.clear(); + } + else + { + data += str.left(index); + str.remove(0, index); + if(data.right(4) == "\r\n\r\n") + { + QHttpRequestHeader::operator=(QHttpRequestHeader(data)); + headerDone = true; + data.clear(); + QUrl url = QUrl::fromEncoded(QHttpRequestHeader::path().toAscii()); + path = url.path(); + //() << path; + QListIterator > i(url.queryItems()); + while (i.hasNext()) + { + QPair pair = i.next(); + getMap[pair.first] = pair.second; + //qDebug() << pair.first << "=" << get(pair.first); + } + } + } + } + if(!messageDone && str.size()>0) + { + if(hasContentLength()) + { + data += str; + if(data.size() >= (int) contentLength()) + { + data.resize(contentLength()); + messageDone = true; + //parse POST data + if(contentType() == "application/x-www-form-urlencoded") + { + QUrl url; + url.setEncodedQuery(data); + QListIterator > i(url.queryItems()); + while (i.hasNext()) + { + QPair pair = i.next(); + postMap[pair.first] = pair.second; + //qDebug() << pair.first << "=" << post(pair.first); + } + } + if(contentType() == "multipart/form-data") + { + //qDebug() << data.right(data.size()-data.indexOf("\r\n\r\n")-QByteArray("\r\n\r\n").size()); + torrent_content = data.right(data.size()-data.indexOf("\r\n\r\n")-QByteArray("\r\n\r\n").size()); + } + } + } + else + error = true; + } +} diff --git a/src/httprequestparser.h b/src/httprequestparser.h new file mode 100644 index 000000000..ba93415c9 --- /dev/null +++ b/src/httprequestparser.h @@ -0,0 +1,62 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef HTTPREQUESTPARSER_H +#define HTTPREQUESTPARSER_H + +#include + +class HttpRequestParser : public QHttpRequestHeader +{ + private: + bool headerDone; + bool messageDone; + bool error; + QByteArray data; + QString path; + QMap postMap; + QMap getMap; + QByteArray torrent_content; + + public: + HttpRequestParser(); + ~HttpRequestParser(); + bool isParsable() const; + bool isError() const; + QString url() const; + QByteArray message() const; + QString get(const QString key) const; + QString post(const QString key) const; + QByteArray torrent() const; + void write(QByteArray str); +}; + +#endif diff --git a/src/httpresponsegenerator.cpp b/src/httpresponsegenerator.cpp new file mode 100644 index 000000000..24d3d0acd --- /dev/null +++ b/src/httpresponsegenerator.cpp @@ -0,0 +1,82 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#include "httpresponsegenerator.h" + +void HttpResponseGenerator::setMessage(const QByteArray message) +{ + HttpResponseGenerator::message = message; + setContentLength(message.size()); +} + +void HttpResponseGenerator::setMessage(const QString message) +{ + setMessage(message.QString::toLocal8Bit()); +} + +void HttpResponseGenerator::stripMessage() +{ + message.clear(); +} + +QByteArray HttpResponseGenerator::toByteArray() const +{ + return QHttpResponseHeader::toString().toLocal8Bit() + message; +} + +void HttpResponseGenerator::setContentTypeByExt(const QString ext) +{ + if(ext == "css") + { + setContentType("text/css"); + return; + } + if(ext == "gif") + { + setContentType("image/gif"); + return; + } + if(ext == "htm" || ext == "html") + { + setContentType("text/html"); + return; + } + if(ext == "js") + { + setContentType("text/javascript"); + return; + } + if(ext == "png") + { + setContentType("image/x-png"); + return; + } +} diff --git a/src/httpresponsegenerator.h b/src/httpresponsegenerator.h new file mode 100644 index 000000000..fc856bc4f --- /dev/null +++ b/src/httpresponsegenerator.h @@ -0,0 +1,50 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef HTTPRESPONSEGENERATOR_H +#define HTTPRESPONSEGENERATOR_H + +#include + +class HttpResponseGenerator : public QHttpResponseHeader +{ + private: + QByteArray message; + + public: + void setMessage(const QByteArray message); + void setMessage(const QString message); + void stripMessage(); + void setContentTypeByExt(const QString ext); + virtual QByteArray toByteArray() const; +}; + +#endif diff --git a/src/httpserver.cpp b/src/httpserver.cpp new file mode 100644 index 000000000..4470f3fa0 --- /dev/null +++ b/src/httpserver.cpp @@ -0,0 +1,111 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#include "httpserver.h" +#include "httpconnection.h" +#include "eventmanager.h" +#include "bittorrent.h" +#include + +HttpServer::HttpServer(bittorrent *_BTSession, int msec, QObject* parent) : QTcpServer(parent) +{ + base64 = QByteArray(":").toBase64(); + connect(this, SIGNAL(newConnection()), this, SLOT(newHttpConnection())); + BTSession = _BTSession; + manager = new EventManager(this, BTSession); + //add torrents + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(h.is_valid()) + manager->addedTorrent(h); + } + //connect BTSession to manager + connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), manager, SLOT(addedTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(deletedTorrent(QString)), manager, SLOT(deletedTorrent(QString))); + //set timer + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(onTimer())); + timer->start(msec); +} + +HttpServer::~HttpServer() +{ + delete timer; + delete manager; +} + +void HttpServer::newHttpConnection() +{ + QTcpSocket *socket; + while((socket = nextPendingConnection())) + { + HttpConnection *connection = new HttpConnection(socket, this); + //connect connection to BTSession + connect(connection, SIGNAL(UrlReadyToBeDownloaded(QString)), BTSession, SLOT(downloadUrlAndSkipDialog(QString))); + connect(connection, SIGNAL(MagnetReadyToBeDownloaded(QString)), BTSession, SLOT(addMagnetSkipAddDlg(QString))); + connect(connection, SIGNAL(torrentReadyToBeDownloaded(QString, bool, QString, bool)), BTSession, SLOT(addTorrent(QString, bool, QString, bool))); + connect(connection, SIGNAL(deleteTorrent(QString, bool)), BTSession, SLOT(deleteTorrent(QString, bool))); + connect(connection, SIGNAL(pauseTorrent(QString)), BTSession, SLOT(pauseTorrent(QString))); + connect(connection, SIGNAL(resumeTorrent(QString)), BTSession, SLOT(resumeTorrent(QString))); + connect(connection, SIGNAL(pauseAllTorrents()), BTSession, SLOT(pauseAllTorrents())); + connect(connection, SIGNAL(resumeAllTorrents()), BTSession, SLOT(resumeAllTorrents())); + connect(connection, SIGNAL(increasePrioTorrent(QString)), BTSession, SLOT(increaseDlTorrentPriority(QString))); + connect(connection, SIGNAL(decreasePrioTorrent(QString)), BTSession, SLOT(decreaseDlTorrentPriority(QString))); + } +} + +void HttpServer::onTimer() { + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(h.is_valid()) + manager->modifiedTorrent(h); + } +} + +void HttpServer::setAuthorization(QString username, QString password) +{ + QString cat = username + ":" + password; + base64 = QByteArray(cat.toLocal8Bit()).toBase64(); +} + +bool HttpServer::isAuthorized(QByteArray auth) const +{ + return (auth == base64); +} + +EventManager* HttpServer::eventManager() const +{ + return manager; +} diff --git a/src/httpserver.h b/src/httpserver.h new file mode 100644 index 000000000..b23a753cc --- /dev/null +++ b/src/httpserver.h @@ -0,0 +1,65 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef HTTPSERVER_H +#define HTTPSERVER_H + +#include +#include +#include + +class bittorrent; +class QTimer; +class EventManager; + +class HttpServer : public QTcpServer +{ + Q_OBJECT + + private: + QByteArray base64; + bittorrent *BTSession; + EventManager *manager; + QTimer *timer; + + public: + HttpServer(bittorrent *BTSession, int msec, QObject* parent = 0); + ~HttpServer(); + void setAuthorization(QString username, QString password); + bool isAuthorized(QByteArray auth) const; + EventManager *eventManager() const; + + private slots: + void newHttpConnection(); + void onTimer(); +}; + +#endif diff --git a/src/ico.cpp b/src/ico.cpp new file mode 100644 index 000000000..652489f5c --- /dev/null +++ b/src/ico.cpp @@ -0,0 +1,462 @@ +/* + * kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +#include "ico.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ + // Global header (see http://www.daubnet.com/formats/ICO.html) + struct IcoHeader + { + enum Type { Icon = 1, Cursor }; + quint16 reserved; + quint16 type; + quint16 count; + }; + + inline QDataStream& operator >>( QDataStream& s, IcoHeader& h ) + { + return s >> h.reserved >> h.type >> h.count; + } + + // Based on qt_read_dib et al. from qimage.cpp + // (c) 1992-2002 Trolltech AS. + struct BMP_INFOHDR + { + static const quint32 Size = 40; + quint32 biSize; // size of this struct + quint32 biWidth; // pixmap width + quint32 biHeight; // pixmap height + quint16 biPlanes; // should be 1 + quint16 biBitCount; // number of bits per pixel + enum Compression { RGB = 0 }; + quint32 biCompression; // compression method + quint32 biSizeImage; // size of image + quint32 biXPelsPerMeter; // horizontal resolution + quint32 biYPelsPerMeter; // vertical resolution + quint32 biClrUsed; // number of colors used + quint32 biClrImportant; // number of important colors + }; + const quint32 BMP_INFOHDR::Size; + + QDataStream& operator >>( QDataStream &s, BMP_INFOHDR &bi ) + { + s >> bi.biSize; + if ( bi.biSize == BMP_INFOHDR::Size ) + { + s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount; + s >> bi.biCompression >> bi.biSizeImage; + s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter; + s >> bi.biClrUsed >> bi.biClrImportant; + } + return s; + } + +#if 0 + QDataStream &operator<<( QDataStream &s, const BMP_INFOHDR &bi ) + { + s << bi.biSize; + s << bi.biWidth << bi.biHeight; + s << bi.biPlanes; + s << bi.biBitCount; + s << bi.biCompression; + s << bi.biSizeImage; + s << bi.biXPelsPerMeter << bi.biYPelsPerMeter; + s << bi.biClrUsed << bi.biClrImportant; + return s; + } +#endif + + // Header for every icon in the file + struct IconRec + { + unsigned char width; + unsigned char height; + quint16 colors; + quint16 hotspotX; + quint16 hotspotY; + quint32 size; + quint32 offset; + }; + + inline QDataStream& operator >>( QDataStream& s, IconRec& r ) + { + return s >> r.width >> r.height >> r.colors + >> r.hotspotX >> r.hotspotY >> r.size >> r.offset; + } + + struct LessDifference + { + LessDifference( unsigned s, unsigned c ) + : size( s ), colors( c ) {} + + bool operator ()( const IconRec& lhs, const IconRec& rhs ) const + { + // closest size match precedes everything else + if ( std::abs( int( lhs.width - size ) ) < + std::abs( int( rhs.width - size ) ) ) return true; + else if ( std::abs( int( lhs.width - size ) ) > + std::abs( int( rhs.width - size ) ) ) return false; + else if ( colors == 0 ) + { + // high/true color requested + if ( lhs.colors == 0 ) return true; + else if ( rhs.colors == 0 ) return false; + else return lhs.colors > rhs.colors; + } + else + { + // indexed icon requested + if ( lhs.colors == 0 && rhs.colors == 0 ) return false; + else if ( lhs.colors == 0 ) return false; + else return std::abs( int( lhs.colors - colors ) ) < + std::abs( int( rhs.colors - colors ) ); + } + } + unsigned size; + unsigned colors; + }; + + bool loadFromDIB( QDataStream& stream, const IconRec& rec, QImage& icon ) + { + BMP_INFOHDR header; + stream >> header; + if ( stream.atEnd() || header.biSize != BMP_INFOHDR::Size || + header.biSize > rec.size || + header.biCompression != BMP_INFOHDR::RGB || + ( header.biBitCount != 1 && header.biBitCount != 4 && + header.biBitCount != 8 && header.biBitCount != 24 && + header.biBitCount != 32 ) ) return false; + + unsigned paletteSize, paletteEntries; + + if (header.biBitCount > 8) + { + paletteEntries = 0; + paletteSize = 0; + } + else + { + paletteSize = (1 << header.biBitCount); + paletteEntries = paletteSize; + if (header.biClrUsed && header.biClrUsed < paletteSize) + paletteEntries = header.biClrUsed; + } + + // Always create a 32-bit image to get the mask right + // Note: this is safe as rec.width, rec.height are bytes + icon = QImage( rec.width, rec.height, QImage::Format_ARGB32 ); + if ( icon.isNull() ) return false; + + QVector< QRgb > colorTable( paletteSize ); + + colorTable.fill( QRgb( 0 ) ); + for ( unsigned i = 0; i < paletteEntries; ++i ) + { + unsigned char rgb[ 4 ]; + stream.readRawData( reinterpret_cast< char* >( &rgb ), + sizeof( rgb ) ); + colorTable[ i ] = qRgb( rgb[ 2 ], rgb[ 1 ], rgb[ 0 ] ); + } + + unsigned bpl = ( rec.width * header.biBitCount + 31 ) / 32 * 4; + + unsigned char* buf = new unsigned char[ bpl ]; + for ( unsigned y = rec.height; !stream.atEnd() && y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + unsigned char* pixel = buf; + QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine(y)); + switch ( header.biBitCount ) + { + case 1: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ + ( pixel[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ]; + break; + case 4: + for ( unsigned x = 0; x < rec.width; ++x ) + if ( x & 1 ) *p++ = colorTable[ pixel[ x / 2 ] & 0x0f ]; + else *p++ = colorTable[ pixel[ x / 2 ] >> 4 ]; + break; + case 8: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ pixel[ x ] ]; + break; + case 24: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgb( pixel[ 3 * x + 2 ], + pixel[ 3 * x + 1 ], + pixel[ 3 * x ] ); + break; + case 32: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgba( pixel[ 4 * x + 2 ], + pixel[ 4 * x + 1 ], + pixel[ 4 * x ], + pixel[ 4 * x + 3] ); + break; + } + } + delete[] buf; + + if ( header.biBitCount < 32 ) + { + // Traditional 1-bit mask + bpl = ( rec.width + 31 ) / 32 * 4; + buf = new unsigned char[ bpl ]; + for ( unsigned y = rec.height; y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + QRgb* p = reinterpret_cast< QRgb* >(icon.scanLine(y)); + for ( unsigned x = 0; x < rec.width; ++x, ++p ) + if ( ( ( buf[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ) ) + *p &= RGB_MASK; + } + delete[] buf; + } + return true; + } +} + +ICOHandler::ICOHandler() +{ +} + +bool ICOHandler::canRead() const +{ + if (canRead(device())) { + setFormat("ico"); + return true; + } + return false; +} + +bool ICOHandler::read(QImage *outImage) +{ + + qint64 offset = device()->pos(); + + QDataStream stream( device() ); + stream.setByteOrder( QDataStream::LittleEndian ); + IcoHeader header; + stream >> header; + if ( stream.atEnd() || !header.count || + ( header.type != IcoHeader::Icon && header.type != IcoHeader::Cursor) ) + return false; + + unsigned requestedSize = 32; + unsigned requestedColors = QApplication::desktop()->depth() > 8 ? 0 : QApplication::desktop()->depth(); + int requestedIndex = -1; +#if 0 + if ( io->parameters() ) + { + QStringList params = QString(io->parameters()).split( ';', QString::SkipEmptyParts ); + QMap< QString, QString > options; + for ( QStringList::ConstIterator it = params.begin(); + it != params.end(); ++it ) + { + QStringList tmp = (*it).split( '=', QString::SkipEmptyParts ); + if ( tmp.count() == 2 ) options[ tmp[ 0 ] ] = tmp[ 1 ]; + } + if ( options[ "index" ].toUInt() ) + requestedIndex = options[ "index" ].toUInt(); + if ( options[ "size" ].toUInt() ) + requestedSize = options[ "size" ].toUInt(); + if ( options[ "colors" ].toUInt() ) + requestedColors = options[ "colors" ].toUInt(); + } +#endif + + typedef std::vector< IconRec > IconList; + IconList icons; + for ( unsigned i = 0; i < header.count; ++i ) + { + if ( stream.atEnd() ) + return false; + IconRec rec; + stream >> rec; + icons.push_back( rec ); + } + IconList::const_iterator selected; + if (requestedIndex >= 0) { + selected = std::min( icons.begin() + requestedIndex, icons.end() ); + } else { + selected = std::min_element( icons.begin(), icons.end(), + LessDifference( requestedSize, requestedColors ) ); + } + if ( stream.atEnd() || selected == icons.end() || + offset + selected->offset > device()->size() ) + return false; + + device()->seek( offset + selected->offset ); + QImage icon; + if ( loadFromDIB( stream, *selected, icon ) ) + { + icon.setText( "X-Index", 0, QString::number( selected - icons.begin() ) ); + if ( header.type == IcoHeader::Cursor ) + { + icon.setText( "X-HotspotX", 0, QString::number( selected->hotspotX ) ); + icon.setText( "X-HotspotY", 0, QString::number( selected->hotspotY ) ); + } + + *outImage = icon; + return true; + } + return false; +} + +bool ICOHandler::write(const QImage &/*image*/) +{ +#if 0 + if (image.isNull()) + return; + + QByteArray dibData; + QDataStream dib(dibData, QIODevice::ReadWrite); + dib.setByteOrder(QDataStream::LittleEndian); + + QImage pixels = image; + QImage mask; + if (io->image().hasAlphaBuffer()) + mask = image.createAlphaMask(); + else + mask = image.createHeuristicMask(); + mask.invertPixels(); + for ( int y = 0; y < pixels.height(); ++y ) + for ( int x = 0; x < pixels.width(); ++x ) + if ( mask.pixel( x, y ) == 0 ) pixels.setPixel( x, y, 0 ); + + if (!qt_write_dib(dib, pixels)) + return; + + uint hdrPos = dib.device()->at(); + if (!qt_write_dib(dib, mask)) + return; + memmove(dibData.data() + hdrPos, dibData.data() + hdrPos + BMP_WIN + 8, dibData.size() - hdrPos - BMP_WIN - 8); + dibData.resize(dibData.size() - BMP_WIN - 8); + + QDataStream ico(device()); + ico.setByteOrder(QDataStream::LittleEndian); + IcoHeader hdr; + hdr.reserved = 0; + hdr.type = Icon; + hdr.count = 1; + ico << hdr.reserved << hdr.type << hdr.count; + IconRec rec; + rec.width = image.width(); + rec.height = image.height(); + if (image.numColors() <= 16) + rec.colors = 16; + else if (image.depth() <= 8) + rec.colors = 256; + else + rec.colors = 0; + rec.hotspotX = 0; + rec.hotspotY = 0; + rec.dibSize = dibData.size(); + ico << rec.width << rec.height << rec.colors + << rec.hotspotX << rec.hotspotY << rec.dibSize; + rec.dibOffset = ico.device()->at() + sizeof(rec.dibOffset); + ico << rec.dibOffset; + + BMP_INFOHDR dibHeader; + dib.device()->at(0); + dib >> dibHeader; + dibHeader.biHeight = image.height() << 1; + dib.device()->at(0); + dib << dibHeader; + + ico.writeRawBytes(dibData.data(), dibData.size()); + return true; +#endif + return false; +} + +QByteArray ICOHandler::name() const +{ + return "ico"; +} + +bool ICOHandler::canRead(QIODevice *device) +{ + if (!device) { + qWarning("ICOHandler::canRead() called with no device"); + return false; + } + + const qint64 oldPos = device->pos(); + + char head[8]; + qint64 readBytes = device->read(head, sizeof(head)); + const bool readOk = readBytes == sizeof(head); + + if (device->isSequential()) { + while (readBytes > 0) + device->ungetChar(head[readBytes-- - 1]); + } else { + device->seek(oldPos); + } + + if ( !readOk ) + return false; + + return head[2] == '\001' && head[3] == '\000' && // type should be 1 + ( head[6] == 16 || head[6] == 32 || head[6] == 64 ) && // width can only be one of those + ( head[7] == 16 || head[7] == 32 || head[7] == 64 ); // same for height +} + +class ICOPlugin : public QImageIOPlugin +{ +public: + QStringList keys() const; + Capabilities capabilities(QIODevice *device, const QByteArray &format) const; + QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const; +}; + +QStringList ICOPlugin::keys() const +{ + return QStringList() << "ico" << "ICO"; +} + +QImageIOPlugin::Capabilities ICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const +{ + if (format == "ico" || format == "ICO") + return Capabilities(CanRead); + if (!format.isEmpty()) + return 0; + if (!device->isOpen()) + return 0; + + Capabilities cap; + if (device->isReadable() && ICOHandler::canRead(device)) + cap |= CanRead; + return cap; +} + +QImageIOHandler *ICOPlugin::create(QIODevice *device, const QByteArray &format) const +{ + QImageIOHandler *handler = new ICOHandler; + handler->setDevice(device); + handler->setFormat(format); + return handler; +} + +Q_EXPORT_STATIC_PLUGIN(ICOPlugin) +Q_EXPORT_PLUGIN2(ico, ICOPlugin) diff --git a/src/ico.h b/src/ico.h new file mode 100644 index 000000000..a9cf548b8 --- /dev/null +++ b/src/ico.h @@ -0,0 +1,52 @@ +/* + * ico.h - kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +// You can use QImageIO::setParameters() to request a specific +// Icon out of an .ico file: +// +// Options consist of a name=value pair and are separated by a semicolon. +// Available options are: +// size= select the icon that most closely matches (pixels) +// default: 32 +// colors= select the icon that has colors (or comes closest) +// default: 1 << display depth or 0 (RGB) if display depth > 8 +// index= select the indexth icon from the file. If this option +// is present, the size and colors options will be ignored. +// default: none +// If both size and colors are given, size takes precedence. +// +// The old format is still supported: +// the parameters consist of a single string in the form +// "[:]" which correspond to the options above +// +// If an icon was returned (i.e. the file is valid and the index option +// if present was not out of range), the icon's index within the .ico +// file is returned in the text tag "X-Index" of the image. +// If the icon is in fact a cursor, its hotspot coordinates are returned +// in the text tags "X-HotspotX" and "X-HotspotY". + +#ifndef _ICO_H_ +#define _ICO_H_ + +#include + +class ICOHandler : public QImageIOHandler +{ +public: + ICOHandler(); + + bool canRead() const; + bool read(QImage *image); + bool write(const QImage &image); + + QByteArray name() const; + + static bool canRead(QIODevice *device); +}; + +#endif diff --git a/src/icons.qrc b/src/icons.qrc new file mode 100644 index 000000000..4f9f4278c --- /dev/null +++ b/src/icons.qrc @@ -0,0 +1,111 @@ + + + Icons/rss32.png + Icons/sphere2.png + Icons/downarrow.png + Icons/url.png + Icons/locale.png + Icons/loading.png + Icons/magnet.png + Icons/sphere.png + Icons/uparrow.png + Icons/rss16.png + Icons/skin/play.png + Icons/skin/qbittorrent22.png + Icons/skin/new.png + Icons/skin/preview.png + Icons/skin/stalled.png + Icons/skin/delete.png + Icons/skin/url.png + Icons/skin/connected.png + Icons/skin/mascot.png + Icons/skin/seeding.png + Icons/skin/increase.png + Icons/skin/qbittorrent32.png + Icons/skin/paused.png + Icons/skin/qb_question.png + Icons/skin/open.png + Icons/skin/qbittorrent16.png + Icons/skin/downloading.png + Icons/skin/pause_all.png + Icons/skin/play_all.png + Icons/skin/pause.png + Icons/skin/firewalled.png + Icons/skin/properties.png + Icons/skin/info.png + Icons/skin/tabs.gif + Icons/skin/delete_perm.png + Icons/skin/queued.png + Icons/skin/settings.png + Icons/skin/exit.png + Icons/skin/delete_all.png + Icons/skin/splash.png + Icons/skin/decrease.png + Icons/flags/czech.png + Icons/flags/china.png + Icons/flags/norway.png + Icons/flags/finland.png + Icons/flags/netherlands.png + Icons/flags/taiwan.png + Icons/flags/sweden.png + Icons/flags/spain_catalunya.png + Icons/flags/romania.png + Icons/flags/denmark.png + Icons/flags/hungary.png + Icons/flags/ukraine.png + Icons/flags/turkey.png + Icons/flags/greece.png + Icons/flags/spain.png + Icons/flags/portugal.png + Icons/flags/russia.png + Icons/flags/united_kingdom.png + Icons/flags/poland.png + Icons/flags/germany.png + Icons/flags/bulgaria.png + Icons/flags/brazil.png + Icons/flags/france.png + Icons/flags/slovakia.png + Icons/flags/italy.png + Icons/flags/south_korea.png + Icons/flags/japan.png + Icons/oxygen/view-refresh.png + Icons/oxygen/file.png + Icons/oxygen/mail-folder-inbox.png + Icons/oxygen/time.png + Icons/oxygen/edit-find.png + Icons/oxygen/folder-new.png + Icons/oxygen/edit-paste.png + Icons/oxygen/proxy.png + Icons/oxygen/log.png + Icons/oxygen/unavailable.png + Icons/oxygen/button_ok.png + Icons/oxygen/button_cancel.png + Icons/oxygen/edit-clear.png + Icons/oxygen/filter.png + Icons/oxygen/encrypted.png + Icons/oxygen/edit_clear.png + Icons/oxygen/download.png + Icons/oxygen/application-x-kgetlist-no.png + Icons/oxygen/gear.png + Icons/oxygen/remove.png + Icons/oxygen/browse.png + Icons/oxygen/unsubscribe16.png + Icons/oxygen/subscribe.png + Icons/oxygen/edit-copy.png + Icons/oxygen/bt_settings.png + Icons/oxygen/document-new.png + Icons/oxygen/preferences-desktop.png + Icons/oxygen/tab-close.png + Icons/oxygen/wallet.png + Icons/oxygen/webui.png + Icons/oxygen/list-remove.png + Icons/oxygen/connection.png + Icons/oxygen/bug.png + Icons/oxygen/list-add.png + Icons/oxygen/application-x-kgetlist.png + Icons/oxygen/folder.png + Icons/oxygen/edit-cut.png + Icons/oxygen/unsubscribe.png + Icons/oxygen/subscribe16.png + + \ No newline at end of file diff --git a/src/json.h b/src/json.h new file mode 100644 index 000000000..29d38637a --- /dev/null +++ b/src/json.h @@ -0,0 +1,106 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + + +#ifndef JSON_H +#define JSON_H + +#include + +namespace json { + + QString toJson(QVariant v) { + if (v.isNull()) + return "null"; + switch(v.type()) + { + case QVariant::Bool: + case QVariant::Double: + case QVariant::Int: + case QVariant::LongLong: + case QVariant::UInt: + case QVariant::ULongLong: + return v.value(); + case QVariant::String: + { + QString s = v.value(); + QString result = "\""; + for(int i=0; i v) { + QStringList res; + foreach(QVariantMap m, v) { + QStringList vlist; + foreach(QString key, m.keys()) { + vlist << toJson(key)+":"+toJson(m[key]); + } + res << "{"+vlist.join(",")+"}"; + } + return "["+res.join(",")+"]"; + } +} + +#endif diff --git a/src/lang.qrc b/src/lang.qrc new file mode 100644 index 000000000..75e9585b4 --- /dev/null +++ b/src/lang.qrc @@ -0,0 +1,31 @@ + + + lang/qbittorrent_es.qm + lang/qbittorrent_sk.qm + lang/qbittorrent_zh_TW.qm + lang/qbittorrent_pt.qm + lang/qbittorrent_sv.qm + lang/qbittorrent_pl.qm + lang/qbittorrent_it.qm + lang/qbittorrent_ko.qm + lang/qbittorrent_en.qm + lang/qbittorrent_ro.qm + lang/qbittorrent_bg.qm + lang/qbittorrent_ru.qm + lang/qbittorrent_nl.qm + lang/qbittorrent_nb.qm + lang/qbittorrent_fi.qm + lang/qbittorrent_uk.qm + lang/qbittorrent_cs.qm + lang/qbittorrent_pt_BR.qm + lang/qbittorrent_el.qm + lang/qbittorrent_ca.qm + lang/qbittorrent_hu.qm + lang/qbittorrent_da.qm + lang/qbittorrent_de.qm + lang/qbittorrent_zh.qm + lang/qbittorrent_ja.qm + lang/qbittorrent_tr.qm + lang/qbittorrent_fr.qm + + \ No newline at end of file diff --git a/src/lang/qbittorrent_bg.qm b/src/lang/qbittorrent_bg.qm new file mode 100644 index 0000000000000000000000000000000000000000..32111091775599c0fd5abb85e3c75161b784eb20 GIT binary patch literal 67919 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 psn&8P4Bnv;NMkov3^uS|zJwtNOf=xBnaiz9z + + + + @default + + b + bytes + b + + + KB + КB + + + MB + MB + + + GB + GB + + + + AboutDlg + + + About qBittorrent + Относно qBittorrent + + + + About + Относно + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Битторент клиент програмиран на C++, базиран на Qt4 toolkit </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">и libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Начална:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Автор + + + + Name: + Име: + + + + Country: + Страна: + + + + E-mail: + E-mail: + + + + Home page: + WEB страница: + + + + Christophe Dumez + Christophe Dumez + + + + France + Франция + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Благодарим на + + + + Translation + Превод + + + + License + Лиценз + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Битторент клиент ползващ Qt4 и libtorrent, програмиран на C++.<br> +<br> +Copyright © 2006 на Christophe Dumez<br> +<br> <u>WEB-страница:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + Автор на qBittorrent + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + Дата на раждане: + + + + Occupation: + Професия: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Студент компютърни науки + + + + Thanks to + Благодарим на + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Битторент клиент ползващ Qt4 и битторент, програмиран на C++.<br> +<br> +Copyright © 2006 от Christophe Dumez<br> +<br> <u>Начална:</u> <i>http://www.qbittorrent.org</i><br> + + + + BandwidthAllocationDialog + + + Upload limit: + Лимит качване: + + + + Download limit: + Лимит сваляне: + + + + + + + Unlimited + Unlimited (bandwidth) + Неограничен + + + + KiB/s + KiB/с + + + + ConsoleDlg + + + qBittorrent console + qBittorrent конзола + + + + General + Общи + + + + Blocked IPs + Блокирани IP + + + + DLListDelegate + + + KiB/s + KiB/с + + + + Dialog + + Options -- qBittorrent + Опции -- qBittorrent + + + Options + Опции + + + Main + Начало + + + Save Path: + Съхрани Път: + + + Download Limit: + Лимит сваляне: + + + Upload Limit: + Лимит качване: + + + Max Connects: + Max Връзки: + + + Port range: + Порт Обхват: + + + ... + ... + + + Kb/s + Kb/с + + + Disable + Изключи + + + connections + връзки + + + to + към + + + + Proxy + Прокси + + + Proxy Settings + Прокси Настройки + + + Server IP: + Сървър IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Порт: + + + Proxy server requires authentication + Прокси сървъра иска удостоверяване + + + + + + Authentication + Удостоверяване + + + User Name: + Име на Потребител: + + + + + + Password: + Парола: + + + Enable connection through a proxy server + Разрешава връзка през прокси сървър + + + Language + Език + + + Please choose your preferred language in the following list: + Моля изберете предпочитан език от следния списък: + + + English + Английски + + + French + Френски + + + Simplified Chinese + Опростен Китайски + + + OK + ОК + + + Cancel + Прекъсни + + + Language settings will take effect after restart. + Езиковите настройки ще работят след рестартиране. + + + Scanned Dir: + Претърсена Директория: + + + Enable directory scan (auto add torrent files inside) + Разреши търсене в директория (автоматично добавя намерени торент-файлове) + + + Korean + Корейски + + + Spanish + Испански + + + German + Немски + + + Connection Settings + Настройки на Връзката + + + Share ratio: + Процент на споделяне: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + + Activate IP Filtering + Активирай IP Филтриране + + + + Filter Settings + Настройки на Филтъра + + + ipfilter.dat URL or PATH: + ipfilter.dat URL или PATH: + + + Start IP + Начално IP + + + End IP + Крайно IP + + + Origin + Произход + + + Comment + Коментар + + + Apply + Приложи + + + + IP Filter + IP Филтър + + + Add Range + Добави Обхват + + + Remove Range + Премахни Обхват + + + Catalan + Каталонски + + + ipfilter.dat Path: + ipfilter.dat Път: + + + Misc + Допълнения + + + Ask for confirmation on exit + Искай потвърждение при изход + + + Clear finished downloads on exit + Изтрий свалените при изход + + + Go to systray when minimizing window + Отиди в системна папка при минимизиране на прозореца + + + Localization + Настройка на езика + + + + Language: + Език: + + + Behaviour + Поведение + + + OSD + OSD + + + Always display OSD + Винаги показвай OSD + + + Display OSD only if window is minimized or iconified + Покажи OSD само ако минимизиран или иконизиран + + + Never display OSD + Не показвай OSD + + + + + KiB/s + KB/с + + + 1 KiB DL = + 1 KB DL = + + + KiB UP max. + KB UP max. + + + DHT (Trackerless): + DHT (без Тракери): + + + Disable DHT (Trackerless) support + Изключи DHT (без Тракери) поддръжката + + + Automatically clear finished downloads + Автоматично изтриване на завършили сваляния + + + Preview program + Програма за оглед + + + Audio/Video player: + Аудио/Видео плейър: + + + DHT configuration + DHT конфигурация + + + + DHT port: + DHT порт: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Забележка:</b> Промените важат след рестарт на qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b> Бележка за преводачите:</b> Ако няма qBittorrent на вашия език, <br/>и бихте искали да го преведете, <br/>моля, свържете се с мен (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Покажи допълнителен торент диалог всеки път когато добавям един торент + + + Default save path + Път за съхранение по подразбиране + + + Systray Messages + Съобщения на Системата + + + Always display systray messages + Винаги показвай системните съобщения + + + Display systray messages only when window is hidden + Показвай системните съобщения само при скрит прозорец + + + Never display systray messages + Никога не показвай системните съобщения + + + Disable DHT (Trackerless) + Изключи DHT (Без тракер) + + + Disable Peer eXchange (PeX) + Изключи Peer eXchange (PeX) + + + Go to systray when closing main window + Отиди в системна папка при затваряне на главния прозорец + + + + Connection + Връзка + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (без тракер) + + + Torrent addition + Добавяне на Торент + + + Main window + Основен прозорец + + + Systray messages + Системни съобщения + + + Directory scan + Сканиране на директория + + + Style (Look 'n Feel) + Стил (Виж и Чувствай) + + + + Plastique style (KDE like) + Пластмасов стил (подобен на KDE) + + + Cleanlooks style (GNOME like) + Изчистен стил (подобен на GNOME) + + + Motif style (default Qt style on Unix systems) + Мотив стил (стил по подразбиране на Qt на Юникс системи) + + + + CDE style (Common Desktop Environment like) + Стил CDE (подобен на обичайния стил на десктоп) + + + MacOS style (MacOSX only) + MacOS стил (само за MacOSX) + + + Exit confirmation when the download list is not empty + Потвърждение за изход когато листа за сваляне не е празен + + + Disable systray integration + Изключи вмъкване в systray + + + WindowsXP style (Windows XP only) + WindowsXP стил (само на Windows XP) + + + Server IP or url: + IP или URL на Сървъра: + + + Proxy type: + Тип Прокси: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Засегнати връзки + + + + Use proxy for connections to trackers + Използвай прокси за връзка към тракерите + + + + Use proxy for connections to regular peers + Ползвай прокси за свързване към стандартните връзки + + + + Use proxy for connections to web seeds + Използвай прокси за връзки към web донори + + + + Use proxy for DHT messages + Използвай прокси за DHT съобщенията + + + Encryption + Кодиране + + + Encryption state: + Състояние на кодиране: + + + + Enabled + Включено + + + + Forced + Форсирано + + + + Disabled + Изключено + + + + Preferences + Настройки + + + General + Общи + + + Network + Мрежа + + + + User interface settings + Настройки на потребителски интерфейс + + + + Visual style: + Визуален стил: + + + + Cleanlooks style (Gnome like) + Изчистен стил (подобен на Gnome) + + + + Motif style (Unix like) + Стил мотив (подобен на Unix) + + + + Ask for confirmation on exit when download list is not empty + Потвърждение при изход когато листа за сваляне не е празен + + + + Display current speed in title bar + Показване на скоростта в заглавната лента + + + + System tray icon + Системна икона + + + + Disable system tray icon + Изключи системната икона + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Затвори прозореца (остава видима системна икона) + + + + Minimize to tray + Минимизирай в системна икона + + + + Show notification balloons in tray + Показване уведомителни балони от системата + + + Media player: + Медия плейер: + + + + Downloads + Сваляне + + + Put downloads in this folder: + Сложи свалените в тази папка: + + + + Pre-allocate all files + Преместване на всички файлове + + + + When adding a torrent + При добавяне на торент + + + + Display torrent content and some options + Показване съдържание на торента и някои опции + + + + Do not start download automatically + The torrent will be added to download list in pause state + Не започвай автоматично сваляне + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Следене за промени в папката + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Списъци за трансфер-двойно щракване + + + + Download list: + Листа за сваляне: + + + + + Start/Stop + Старт/Стоп + + + + + Open folder + Отвори папка + + + + + Show properties + Покажи настройки + + + + Seeding list: + Листа за даване: + + + + Download folder: + Папка за сваляне: + + + + Temp folder: + Временна папка: + + + + Automatically download torrents present in this folder: + Автоматично сваляне на торентите намиращи се в тази папка: + + + + Listening port + Порт за прослушване + + + to + i.e: 1200 to 1300 + до + + + + Enable UPnP port mapping + Включено UPnP порт следене + + + + Enable NAT-PMP port mapping + Включено NAT-PMP порт следене + + + + Global bandwidth limiting + Общ лимит сваляне + + + + Upload: + Качване: + + + + Download: + Сваляне: + + + + Bittorrent features + Възможности на Битторент + + + + Use the same port for DHT and Bittorrent + Ползвай същия порт за DHT и Битторент + + + + Spoof µtorrent to avoid ban (requires restart) + Направи се на µtorrent за да избегнеш изхвърляне (изисква рестарт) + + + + + Type: + Вид: + + + + + (None) + (без) + + + + + Proxy: + Прокси: + + + + + + Username: + Име на потребителя: + + + + Bittorrent + Bittorrent + + + + UI + Вид към потребителя + + + + Connections limit + Ограничение на връзката + + + + Global maximum number of connections: + Общ максимален брой на връзки: + + + + Maximum number of connections per torrent: + Максимален брой връзки на торент: + + + + Maximum number of upload slots per torrent: + Максимален брой слотове за качване на торент: + + + Additional Bittorrent features + Допълнителни възможности на Bittorrent + + + + Enable DHT network (decentralized) + Включена мрежа DHT (децентрализирана) + + + Enable Peer eXchange (PeX) + Включен Peer eXchange (PeX) + + + + Enable Local Peer Discovery + Включено Откриване на локална връзка + + + + Encryption: + Криптиране: + + + + Share ratio settings + Настройки на процента на споделяне + + + + Desired ratio: + Предпочитано отношение: + + + + Filter file path: + Филтър за пътя на файла : + + + + transfer lists refresh interval: + интервал на обновяване на списъка за трансфер: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + Интервал на обновяване на RSS feeds: + + + + minutes + минути + + + + Maximum number of articles per feed: + Максимум статии на feed: + + + + File system + Файлова система + + + + Remove finished torrents when their ratio reaches: + Премахни завършени торенти когато тяхното отношение се разширява: + + + + System default + Системно подразбиране + + + + Start minimized + Започни минимизирано + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Действие при двойно щракване в листа за прехвърляне + + + In download list: + В листа за сваляне: + + + Pause/Start torrent + Пауза/Стартиране на торент + + + Open destination folder + Отвори папка получател + + + Display torrent properties + Покажи характеристики на торента + + + In seeding list: + В листа за даване: + + + Folder scan interval: + Интервал за следене на папка: + + + seconds + секунди + + + Spoof Azureus to avoid ban (requires restart) + Направи се на Azureus за да избегнеш изхвърляне (изисква рестарт) + + + + Web UI + Web UI + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Действие при двойно щракване + + + + Port used for incoming connections: + Порт ползван за входящи връзки: + + + + Random + Приблизително + + + + Enable Web User Interface + Включи Интерфейс на Web Потребител + + + + HTTP Server + Сървър HTTP + + + + Enable RSS support + Разреши RSS поддръжка + + + + RSS settings + RSS настройки + + + + Torrent queueing + Серия торенти + + + + Enable queueing system + Включи система за серии + + + + Maximum active downloads: + Максимум активни сваляния: + + + + Maximum active torrents: + Максимум активни торенти: + + + + Display top toolbar + Покажи горна лента с инструменти + + + + Search engine proxy settings + Прокси настройки на търсачката + + + + Bittorrent proxy settings + Bittorent прокси настройки + + + + Maximum active uploads: + Максимум активни качвания: + + + + DownloadingTorrents + + + Name + i.e: file name + Име + + + + Size + i.e: file size + Размер + + + + Progress + i.e: % downloaded + Изпълнение + + + + DL Speed + i.e: Download speed + DL Скорост + + + + UP Speed + i.e: Upload speed + UP Скорост + + + + Seeds/Leechers + i.e: full/partial sources + Даващи/Вземащи + + + Seeds/Leechs + i.e: full/partial sources + Даващи/Вземащи + + + + Ratio + Съотношение + + + + ETA + i.e: Estimated Time of Arrival / Time left + ЕТА + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 стартиран. + + + Be careful, sharing copyrighted material without permission is against the law. + Внимание, споделяне на защитен от авторски права материал без разрешение е незаконно. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>бе блокиран</i> + + + Fast resume data was rejected for torrent %1, checking again... + Бърза пауза бе отхвърлена за торент %1, нова проверка... + + + Url seed lookup failed for url: %1, message: %2 + Url споделяне провалено за url: %1, съобщение: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавен в листа за сваляне. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' бе възстановен. (бързо възстановяване) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вече е в листа за сваляне. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не мога да декодирам торент-файла: '%1' + + + This file is either corrupted or this isn't a torrent. + Този файла или е разрушен или не е торент. + + + Couldn't listen on any of the given ports. + Невъзможно изчакване от дадените портове. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Сваляне на '%1', моля изчакайте... + + + + Hide or Show Column + Скрий или Покажи Колоната + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Грешка при следене на порт, съобщение: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Следене на порт успешно, съобщение: %1 + + + Priority + Предимство + + + + FeedDownloader + + + RSS Feed downloader + RSS Feed сваляч + + + + RSS feed: + RSS Feed: + + + + Feed name + Feed име + + + + Automatically download torrents from this feed + Автоматично сваляне на торентите от този feed + + + + Download filters + Филтри за сваляне + + + + Filters: + Филтри: + + + + Filter settings + Настройки на филтъра + + + + Matches: + Съответстващи: + + + + Does not match: + Несъответстващи: + + + + Destination folder: + Папка получател: + + + + ... + ... + + + + Filter testing + Тест на филтъра + + + + Torrent title: + Име но торента: + + + + Result: + Резултат: + + + + Test + Тест + + + + Import... + Внос... + + + + Export... + Износ... + + + + + Rename filter + Преименувай филтъра + + + + + Remove filter + Премахни филтъра + + + + Add filter + Добави филтър + + + + FeedDownloaderDlg + + + New filter + Нов филтър + + + + Please choose a name for this filter + Моля изберете име за този филтър + + + + Filter name: + Име на филтър: + + + + + + Invalid filter name + Невалидно име на филтър + + + + The filter name cannot be left empty. + Името на филтър не може да е празно. + + + + + This filter name is already in use. + Това име на филтър вече се ползва. + + + + Filter testing error + Грешка при тест на филтъра + + + + Please specify a test torrent name. + Моля определете име на тест торент. + + + + matches + съответства + + + + does not match + несъответства + + + + Select file to import + Изберете файл за внос + + + + + Filters Files + Файлове Филтри + + + + Import successful + Внос успешен + + + + Filters import was successful. + Внос на филтри успешен. + + + + Import failure + Грешка при внос + + + + Filters could not be imported due to an I/O error. + Филтрите не могат да бъдат внесени поради В/И грешка. + + + + Select destination file + Изберете файл-получател + + + + Overwriting confirmation + Потвърждение за запис върху предишен + + + + Are you sure you want to overwrite existing file? + Сигурни ли сте че искате да запишете върху съществуващ файл? + + + + Export successful + Износ успешен + + + + Filters export was successful. + Износ на филтри успешен. + + + + Export failure + Грешка при износ + + + + Filters could not be exported due to an I/O error. + Филтрите не могат да бъдат изнесени поради В/И грешка. + + + + FeedList + + + Unread + Непрочетен + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Грешка на Вход/Изход + + + + + + Couldn't open %1 in read mode. + Не мога да отворя %1 в режим четене. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 не е валиден файл PeerGuardian P2B. + + + + FinishedListDelegate + + + KiB/s + KiB/с + + + + FinishedTorrents + + Finished + Завършен + + + + Name + i.e: file name + Име + + + + Size + i.e: file size + Размер + + + + Seeds / Leechers + Даващи/Вземащи + + + + Connected peers + Свързани двойки + + + Progress + i.e: % downloaded + Изпълнение + + + DL Speed + i.e: Download speed + DL Скорост + + + + UP Speed + i.e: Upload speed + UP Скорост + + + Seeds/Leechs + i.e: full/partial sources + Даващи/Вземащи + + + Status + Състояние + + + ETA + i.e: Estimated Time of Arrival / Time left + ЕТА + + + Finished + i.e: Torrent has finished downloading + Завършен + + + None + i.e: No error message + Няма + + + + Ratio + Съотношение + + + Leechers + i.e: full/partial sources + Вземащи + + + + Total uploaded + i.e: Total amount of uploaded data + Общо качени + + + + Hide or Show Column + Скрий или Покажи Колоната + + + Incomplete torrent in seeding list + Незавършен торент в листата за даване + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Изглежда, че състоянието на торент '%1' е променено от 'даване' на 'сваляне'. Искате ли да го върнете в листата за сваляне? (иначе торента просто ще бъде изтрит) + + + Priority + Предимство + + + + GUI + + + Open Torrent Files + Отвори Торент Файлове + + + kb/s + kb/с + + + Unknown + Неизвестен + + + This file is either corrupted or this isn't a torrent. + Файла или е разрушен или не е торент. + + + Are you sure you want to delete all files in download list? + Сигурни ли сте че искате да изтриете всички файлове от списъка за сваляне? + + + + + + + + &Yes + &Да + + + + + + + + &No + &Не + + + + Are you sure you want to delete the selected item(s) in download list? + Сигурни ли сте че искате да изтриете избраните файлове от списъка за сваляне? + + + paused + прекъснат + + + started + стартиран + + + kb/s + kb/с + + + + Finished + Завършен + + + Checking... + Проверка... + + + Connecting... + Свързване... + + + Downloading... + Сваляне... + + + Download list cleared. + Списъка за сваляне е създаден. + + + All Downloads Paused. + Всички Сваляния са Прекъснати. + + + All Downloads Resumed. + Всички Сваляния са Възстановени. + + + DL Speed: + DL Скорост: + + + started. + стартиран. + + + UP Speed: + UP Скорост: + + + Couldn't create the directory: + Не мога да създам директория: + + + + Torrent Files + Торент Файлове + + + already in download list. + <file> already in download list. + вече е в списъка за сваляне. + + + added to download list. + е добавен в списъка за сваляне. + + + resumed. (fast resume) + възстановен. (бързо възстановяване) + + + Unable to decode torrent file: + Не мога да декодирам торент-файла: + + + removed. + <file> removed. + премахнат. + + + paused. + <file> paused. + прекъснат. + + + resumed. + <file> resumed. + възстановен. + + + m + minutes + м + + + h + hours + ч + + + d + days + д + + + Listening on port: + Очакване от порт: + + + qBittorrent + qBittorrent + + + + + qBittorrent + qBittorrent + + + + + + + Are you sure? -- qBittorrent + Сигурни ли сте? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Скорост: + + + :: By Christophe Dumez :: Copyright (c) 2006 + : От Christophe Dumez :: Copyright (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Състояние на Връзка:</b><br>Онлайн + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Състояние на Връзка:</b><br>С Firewall?<br><i>Няма входящи връзки...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Състояние на Връзка:</b><br>Офлайн<br><i>Няма намерени peers...</i> + + + /s + <unit>/seconds + + + + has finished downloading. + е завършил свалянето. + + + Couldn't listen on any of the given ports. + Невъзможно изчакване от дадените портове. + + + None + Няма + + + KiB/s + KiB/с + + + Are you sure you want to quit? -- qBittorrent + Сигурни ли сте че искате да напуснете? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Сигурни ли сте че искате да напуснете qbittorrent? + + + KiB/s + KiB/с + + + Please type a search pattern first + Моля първо изберете тип на търсене + + + No seach engine selected + Не е избрана търсачка + + + You must select at least one search engine. + Трябва да изберете поне една търсачка. + + + Could not create search plugin. + Невъзможно създаване на допълнение за търсене. + + + Searching... + Търсене... + + + Error during search... + Грешка при търсене... + + + Stopped + Спрян + + + Timed out + Изтекъл срок + + + Failed to download: + Грешка при сваляне: + + + A http download failed, reason: + Сваляне от http грешно, причина: + + + Torrent file URL + Торент файл URL + + + Torrent file URL: + Торент файл URL: + + + I/O Error + I/O Грешка + + + Couldn't create temporary file on hard drive. + Невъзможно създаване на временен файл на диска. + + + Downloading using HTTP: + Сваляне ползвайки HTTP: + + + Search is finished + Търсенето завърши + + + An error occured during search... + Намерена грешка при търсенето... + + + Search aborted + Търсенето е прекъснато + + + Search returned no results + Търсене без резултат + + + Search is Finished + Търсенето е завършено + + + Search plugin update -- qBittorrent + Обновяване на добавката за търсене -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Добавката за търсене може да се обнови, искате ли обновяване? + +Промяна на лог-а: + + + + Sorry, update server is temporarily unavailable. + Съжалявам, сървъра за обновяване е временно недостъпен. + + + Your search plugin is already up to date. + Вашата добавка за търсене е вече обновена. + + + Results + Резултати + + + Name + Име + + + Size + Размер + + + Progress + Изпълнение + + + DL Speed + DL Скорост + + + UP Speed + UP Скорост + + + Status + Състояние + + + ETA + ЕТА + + + Seeders + Даващи + + + Leechers + Вземащи + + + Search engine + Програма за търсене + + + Stalled + state of a torrent whose DL Speed is 0 + Отложен + + + Paused + Пауза + + + Preview process already running + Процеса на оглед се изпълнява + + + There is already another preview process running. +Please close the other one first. + Вече се изпълнява друг процес на оглед. +Моля, затворете първо другия процес. + + + Couldn't download + Couldn't download <file> + Свалянето е невъзможно + + + reason: + Reason why the download failed + причина: + + + Downloading + Example: Downloading www.example.com/test.torrent + Сваляне + + + Please wait... + Моля, изчакайте... + + + Transfers + Трансфери + + + Are you sure you want to quit qBittorrent? + Сигурни ли сте че искате да напуснете qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Сигурни ли сте че искате да изтриете избраните файлове от списъка за сваляне и от твърдия диск? + + + + Download finished + Свалянето завърши + + + has finished downloading. + <filename> has finished downloading. + е завършил свалянето. + + + Search Engine + Търсачка + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Състояние на връзката: + + + Offline + Извън мрежата + + + No peers found... + Няма връзки... + + + Name + i.e: file name + Име + + + Size + i.e: file size + Размер + + + Progress + i.e: % downloaded + Изпълнение + + + DL Speed + i.e: Download speed + DL Скорост + + + UP Speed + i.e: Upload speed + UP Скорост + + + Seeds/Leechs + i.e: full/partial sources + Даващи/Вземащи + + + ETA + i.e: Estimated Time of Arrival / Time left + ЕТА + + + Seeders + i.e: Number of full sources + Даващи + + + Leechers + i.e: Number of partial sources + Вземащи + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 стартиран. + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + DL Скорост %1 KB/с + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + UL Скорост %1 KB/с + + + Finished + i.e: Torrent has finished downloading + Завършен + + + Checking... + i.e: Checking already downloaded parts... + Проверка... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Отложен + + + + Are you sure you want to quit? + Сигурни ли сте че искате да напуснете? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' бе премахнат. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавен в листа за сваляне. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' бе възстановен. (бързо възстановяване) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вече е в листа за сваляне. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не мога да декодирам торент-файла: '%1' + + + None + i.e: No error message + Няма + + + Listening on port: %1 + e.g: Listening on port: 1666 + Прослушване на порт: %1 + + + All downloads were paused. + Всички сваляния са в пауза. + + + '%1' paused. + xxx.avi paused. + '%1' е в пауза. + + + Connecting... + i.e: Connecting to the tracker... + Свързване... + + + All downloads were resumed. + Всички сваляния са възстановени. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' бе възстановен. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + '%1' завърши свалянето. + + + + I/O Error + i.e: Input/Output Error + В/И Грешка + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Намерена грешка при четене или записване на %1. Вероятно диска е пълен, свалянето е в пауза + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Намерена грешка (пълен диск?), '%1' е в пауза. + + + + Connection Status: + Състояние на връзката: + + + + Online + Свързан + + + Firewalled? + i.e: Behind a firewall/router? + Проблем с Firewall-а? + + + No incoming connections... + Няма входящи връзки... + + + No search engine selected + Не е избрана търсачка + + + Search plugin update + Допълнението за търсене е обновено + + + Search has finished + Търсенето завърши + + + Results + i.e: Search results + Резултати + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Сваляне на '%1', моля изчакайте... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Намерена грешка (пълен диск?), '%1' е в пауза. + + + + Search + Търси + + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent е свързан с порт: %1 + + + DHT support [ON], port: %1 + DHT поддръжка [ВКЛ], порт: %1 + + + + + DHT support [OFF] + DHT поддръжка [ИЗКЛ] + + + + PeX support [ON] + PeX поддръжка [ВКЛ] + + + PeX support [OFF] + PeX поддръжка [ИЗКЛ] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Листата за сваляне не е празна. +Сигурни ли сте че искате да напуснете qBittorrent? + + + + + Downloads + Сваляне + + + + Are you sure you want to delete the selected item(s) in finished list? + Сигурни ли сте че искате да изтриете избраните файлове от списъка на завършените сваляния? + + + + UPnP support [ON] + UPnP поддръжка [ВКЛ] + + + + Encryption support [ON] + Поддръжка кодиране [ВКЛ] + + + + Encryption support [FORCED] + Поддръжка кодиране [ФОРСИРАНА] + + + + Encryption support [OFF] + Поддръжка кодиране [ИЗКЛ] + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Намерена грешка за торент %1. + Причина:%2 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Грешка при сваляне от Url + + + + Couldn't download file at url: %1, reason: %2. + Невъзможно сваляне на файл от url: %1, причина: %2. + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Сигурни ли сте че искате да изтриете избраните от списъка за сваляне или от твърдия диск? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Сигурни ли сте че искате да изтриете избраните от списъка на свалените или от твърдия диск? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' бе премахнат завинаги. + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent се прехвърля на порт: TCP/%1 + + + + UPnP support [OFF] + UPnP поддръжка [ИЗКЛ] + + + + NAT-PMP support [ON] + NAT-PMP поддръжка [ВКЛ] + + + + NAT-PMP support [OFF] + NAT-PMP поддръжка [ИЗКЛ] + + + + DHT support [ON], port: UDP/%1 + DHT поддръжка [ВКЛ], порт: UDP/%1 + + + + Local Peer Discovery [ON] + Търсене на локални връзки [ВКЛ] + + + + Local Peer Discovery support [OFF] + Търсене на локални връзки [ИЗКЛ] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' бе премахнат защото съотношението му надвишава определеното. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + DL: %1 KB/с + + + + + UP: %1 KiB/s + UP: %1 KB/с + + + + + Ratio: %1 + Съотношение: %1 + + + + + DHT: %1 nodes + DHT: %1 възли + + + + + No direct connections. This may indicate network configuration problems. + Няма директни връзки. Това може да е от проблеми в мрежовата настройка. + + + + Uploads + Качени + + + + Options were saved successfully. + Опциите бяха съхранени успешно. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: От Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Обща DL Скорост: + + + Kb/s + Kb/с + + + Total UP Speed: + Обща UP Скорост: + + + Name + Име + + + Size + Размер + + + % DL + % DL + + + DL Speed + DL Скорост + + + UP Speed + UP Скорост + + + Status + Състояние + + + ETA + ЕТА + + + &Options + &Опции + + + + &Edit + &Редактирай + + + + &File + &Файл + + + + &Help + &Помощ + + + + Open + Отвори + + + + Exit + Изход + + + + Preferences + Настройки + + + + About + Относно + + + + Start + Старт + + + + Pause + Пауза + + + + Delete + Изтрий + + + + Pause All + Пауза Всички + + + + Start All + Старт Всички + + + + Documentation + Документация + + + Connexion Status + Състояние на Връзките + + + Delete All + Изтрий Всички + + + + Torrent Properties + Характеристики на Торента + + + Downloads + Сваляне + + + KiB/s + KiB/с + + + Search + Търси + + + Search Pattern: + Тип на търсене: + + + Stop + Спри + + + Status: + Състояние: + + + Stopped + Спрян + + + Search Engines + Търсачки + + + Results: + Резултати: + + + Seeds + Споделящи + + + Leechers + Вземащи + + + Search Engine + Търсачка + + + Download + Свали + + + Clear + Изтрий + + + Connection Status + Състояние на Връзка + + + + Download from URL + Свали от URL + + + + Create torrent + Създай торент + + + Ratio: + Отношение: + + + Update search plugin + Обнови допълнението за търсене + + + Session ratio: + Процент сесия: + + + Transfers + Трансфери + + + + Preview file + Огледай файла + + + + Clear log + Изтрий лога + + + + Delete Permanently + Изтрий завинаги + + + + Visit website + Посетете уебсайт + + + + Report a bug + Уведомете за грешка + + + + Set upload limit + Определи лимит качване + + + + Set download limit + Определи лимит сваляне + + + + Set global download limit + Определи общ лимит сваляне + + + + Set global upload limit + Определи общ лимит качване + + + + Options + Опции + + + + Decrease priority + Намали предимството + + + + Increase priority + Увеличи предимството + + + + Console + Конзола + + + + PropListDelegate + + False + Грешно + + + True + Вярно + + + + + Ignored + Игнорирано + + + + + + Normal + Normal (priority) + Нормален + + + + + High + High (priority) + Висок + + + + + Maximum + Maximum (priority) + Максимален + + + + QTextEdit + + Clear + Изтрий + + + + RSS + + + Search + Търси + + + + + New subscription + Нов абонамент + + + + + + Mark items read + Четене на маркираните + + + + Update all + Обнови всички + + + 1 + 1 + + + + Feed URL + URL на канал + + + + + Update + Обновяване + + + + New folder + Нова папка + + + + RSS feeds + RSS канали + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Торенти:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Обнови всички канали + + + + + Delete + Изтрий + + + + + Rename + Преименувай + + + Refresh + Обнови + + + + Download torrent + Торент сваляне + + + + Open news URL + Отваря URL за новини + + + + Copy feed URL + Копира URL на канал + + + + RSS feed downloader + RSS Feed сваляч + + + Create + Образуване + + + Delete selected streams + Изтрий маркираните потоци + + + + Refresh RSS streams + Обнови потоците RSS + + + Add a new RSS stream + Добави нов поток RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Новини:</b> <i>(щракни двойно за отваряне на линка в браузъра)</i> + + + Add RSS stream + Добави поток RSS + + + Refresh all streams + Обнови всички потоци + + + RSS streams: + Потоци RSS: + + + 2 + 2 + + + Mark all as read + Отбележи всички като прочетени + + + + RSSImp + + + Please type a rss stream url + Моля въведете url на поток rss + + + + Stream URL: + Поток URL: + + + Please choose a new name for this stream + Моля изберете ново име за този поток + + + New stream name: + Ново име на потока: + + + + + Are you sure? -- qBittorrent + Сигурни ли сте? -- qBittorrent + + + + + &Yes + &Да + + + + + &No + &Не + + + Are you sure you want to delete this stream from the list? + Сигурни ли сте че искате да изтриете този поток от списъка? + + + Description: + Описание: + + + url: + url: + + + Last refresh: + Последно обновяване: + + + + Please choose a folder name + Моля изберете име на папка + + + + Folder name: + Име на папка: + + + + New folder + Нова папка + + + + Overwrite attempt + Опит за презаписване + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Не можете да презапишете %1. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Този rss канал е вече в списъка. + + + + Are you sure you want to delete these elements from the list? + Сигурни ли сте че искате да изтриете тези елементи от списъка? + + + + Are you sure you want to delete this element from the list? + Сигурни ли сте че искате да изтриете този елемент от списъка? + + + + Please choose a new name for this RSS feed + Моля изберете ново име за този RSS канал + + + + New feed name: + Име на нов канал: + + + + Name already in use + Името вече се ползва + + + + This name is already used by another item, please choose another one. + Това име се ползва от друг елемент, моля изберете друго. + + + + Date: + Дата: + + + + Author: + Автор: + + + + Unread + Непрочетен + + + + RssItem + + + No description available + Няма налично описание + + + + RssStream + + %1 ago + 10min ago + преди %1 + + + + Automatically downloading %1 torrent from %2 RSS feed... + Автоматично сваляне на %1 торент от %2 RSS канал... + + + Never + Никога + + + + SearchCategories + + + All categories + Всички категории + + + + Movies + Филми + + + + TV shows + TV шоу + + + + Music + Музика + + + + Games + Игри + + + + Anime + Анимация + + + + Software + Софтуер + + + + Pictures + Снимки + + + + Books + Книги + + + + SearchEngine + + Name + i.e: file name + Име + + + Size + i.e: file size + Размер + + + Seeders + i.e: Number of full sources + Даващи + + + Leechers + i.e: Number of partial sources + Вземащи + + + Search engine + Програма за търсене + + + + Empty search pattern + Празен образец за търсене + + + + Please type a search pattern first + Моля първо въведете образец за търсене + + + No search engine selected + Не е избрана търсачка + + + You must select at least one search engine. + Трябва да изберете поне една търсачка. + + + + + Results + Резултати + + + + Searching... + Търсене... + + + Search plugin update -- qBittorrent + Обновяване на добавката за търсене -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Добавката за търсене може да се обнови, искате ли обновяване? + +Промяна на лог-а: + + + + &Yes + &Да + + + &No + &Не + + + Search plugin update + Допълнението за търсене е обновено + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Съжалявам, сървъра за обновяване е временно недостъпен. + + + Your search plugin is already up to date. + Вашата добавка за търсене е вече обновена. + + + + Cut + Отрежи + + + + Copy + Копирай + + + + Paste + Залепи + + + + Clear field + Изчисти полето + + + + Clear completion history + Изчисти листа на завършените + + + + Search Engine + Търсачка + + + + + Search has finished + Търсенето завърши + + + + An error occured during search... + Намерена грешка при търсенето... + + + + Search aborted + Търсенето е прекъснато + + + + Search returned no results + Търсене завършено без резултат + + + + Results + i.e: Search results + Резултати + + + + + Unknown + Неизвестен + + + + SearchTab + + + Name + i.e: file name + Име + + + + Size + i.e: file size + Размер + + + + Seeders + i.e: Number of full sources + Даващи + + + + Leechers + i.e: Number of partial sources + Вземащи + + + + Search engine + Програма за търсене + + + + TrackersAdditionDlg + + + Trackers addition dialog + Допълнителен диалог на тракери + + + + List of trackers to add (one per line): + Списък тракери за добавяне (по един на ред): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + Бих искал да благодаря на следните доброволци, превели qBittorrent: + + + Please contact me if you would like to translate qBittorrent to your own language. + Моля, свържете се с мен ако искате да преведете qBittorrent на вашия език. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Искам да благодаря на sourceforge.net за поемането на хоста на проекта qBittorrent. + + + qBittorrent + qBittorrent + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Бих искал да благодаря на sourceforge.net за хоста на qBittorrent проекта.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Бих искал също да благодаря на Jeffery Fernandez (developer@jefferyfernandez.id.au), нашия RPM packager, за неговата отлична работа.</li></ul> + + + I would like to thank the following people who volunteered to translate qBittorrent: + Бих искал да благодаря на следните доброволци, превели qBittorent: + + + Preview impossible + Оглед невъзможен + + + Sorry, we can't preview this file + Съжалявам, не можем да огледаме този файл + + + Name + Име + + + Size + Размер + + + Progress + Изпълнение + + + No URL entered + Невъведен URL + + + Please type at least one URL. + Моля въведете поне един URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Моля, свържете се с мен ако искате да преведете qBittorrent на вашия език. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Бих искал да благодаря на следните доброволци, превели qBittorent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Моля, свържете се с мен ако искате да преведете qBittorrent на вашия език. + + + + addTorrentDialog + + + Torrent addition dialog + Торента добавя диалог + + + + Save path: + Съхрани път: + + + + ... + ... + + + + Torrent size: + Торент размер: + + + + + Unknown + Неизвестен + + + + Free disk space: + Празно пространство на диска: + + + + Torrent content: + Съдържание на Торента: + + + + Download in sequential order (slower but good for previewing) + Сваляне поред (по-бавно но удобно за преглед) + + + File name + Име файл + + + File size + Файл размер + + + Selected + Избран + + + Download in correct order (slower but good for previewing) + Сваляне в правилен ред (по-бавен, но добър за оглед на файловете) + + + + Add to download list in paused state + Добави в листа за сваляне в състояние на пауза + + + + Add + Добави + + + + Cancel + Прекъсни + + + select + избери + + + Unselect + Неизбран + + + Select + Избери + + + + Ignored + Игнорирано + + + + Normal + Нормален + + + + High + Висок + + + + Maximum + Максимален + + + + Collapse all + Свий всички + + + Expand All + Разшири всички + + + + Expand all + Разшири всички + + + + authentication + + + + Tracker authentication + Удостоверяване на тракера + + + + Tracker: + Тракер: + + + + Login + Вход + + + + Username: + Име на потребителя: + + + + Password: + Парола: + + + + Log in + Влизане + + + + Cancel + Прекъсни + + + + bandwidth_dlg + + + Bandwidth allocation + Разпределение на bandwidth + + + + KiB/s + KiB/с + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 използва максималното разрешено от вас отношение. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' бе премахнат завинаги. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' бе премахнат. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' е в пауза. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' бе възстановен. + + + + '%1' is not a valid magnet URI. + '%1' е невалиден magnet URI. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вече е в листа за сваляне. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' бе възстановен. (бързо възстановяване) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавен в листа за сваляне. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не мога да декодирам торент-файла: '%1' + + + + This file is either corrupted or this isn't a torrent. + Този файла или е разрушен или не е торент. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>бе блокиран от вашия IP филтър</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>бе прекъснат поради разрушени части</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Програмирано сваляне на файл %1 вмъкнато в торент %2 + + + + Unable to decode %1 torrent file. + Не мога да декодирам %1 торент-файла. + + + + Couldn't listen on any of the given ports. + Невъзможно изчакване от дадените портове. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Грешка при следене на порт, съобщение: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Следене на порт успешно, съобщение: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Бърза пауза бе отхвърлена за торент %1, нова проверка... + + + + Url seed lookup failed for url: %1, message: %2 + Url споделяне провалено за url: %1, съобщение: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Сваляне на '%1', моля изчакайте... + + + + createTorrentDialog + + Create Torrent file + Създай торент файл + + + Destination torrent file: + Торент файл получател: + + + Input file or directory: + Входен файл или директория: + + + Comment: + Коментар: + + + ... + ... + + + Create + Образуване + + + + Cancel + Прекъсни + + + Announce url (Tracker): + Предлагащ url (Тракер): + + + Directory + Директория + + + + Torrent Creation Tool + Инструмент за Създаване на Торент + + + <center>Destination torrent file:</center> + <center>Торент файл получател:</center> + + + <center>Input file or directory:</center> + <center>Входен файл или директория:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Предлагащ URL:<br>(По един на ред)</center> + + + <center>Comment:</center> + <center>Коментар:</center> + + + + Torrent file creation + Създаване на Торент файл + + + Input files or directories: + Входни файлове или директории: + + + + Announce urls (trackers): + Предлагащи url (тракери): + + + + Comment (optional): + Коментар (опция): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Частен (не може да се разпространява по мрежа без тракер / DHT е включен) + + + + Web seeds urls (optional): + URL на даващи по Web (опция): + + + + File or folder to add to the torrent: + Файл или папка за добавяне към торента: + + + Add a file + Добави файл + + + Add a folder + Добави папка + + + + Add file + Добави файл + + + + Add folder + Добави папка + + + + Piece size: + Размер на част: + + + + 32 KiB + 32 КБ + + + + 64 KiB + 64 КБ + + + + 128 KiB + 128 КБ + + + + 256 KiB + 256 КБ + + + + 512 KiB + 512 КБ + + + + 1 MiB + 1 МБ + + + + 2 MiB + 2 МБ + + + + 4 MiB + 4 МБ + + + + Private (won't be distributed on DHT network if enabled) + Лично (няма да бъде разпространено по мрежа DHT ако е включено) + + + + Start seeding after creation + Започни даване след образуване + + + + Create and save... + Създай и съхрани... + + + + Progress: + Изпълнение: + + + + createtorrent + + + Select destination torrent file + Избери торент файл получател + + + + Torrent Files + Торент Файлове + + + Select input directory or file + Избери входна директория или файл + + + No destination path set + Не е избран път за получаване + + + Please type a destination path first + Моля първо напишете път за получаване + + + + No input path set + Не е избран входящ път + + + + Please type an input path first + Моля първо напишете входящ път + + + Input path does not exist + Входящият път не съществува + + + Please type a correct input path first + Моля първо напишете правилен входящ път + + + + + + Torrent creation + Създаване на Торент + + + + Torrent was created successfully: + Торента бе създаден успешно: + + + Please type a valid input path first + Моля първо напишете валиден входящ път + + + + Select a folder to add to the torrent + Изберете папка за добавяне към торента + + + Select files to add to the torrent + Изберете файлове за добавяне към торента + + + + Please type an announce URL + Моля въведете даващ URL + + + + Torrent creation was unsuccessful, reason: %1 + Създаване на торент неуспешно, причина: %1 + + + + Announce URL: + Tracker URL + Предлагащ URL: + + + + Please type a web seed url + Моля въведете web даващ url + + + + Web seed URL: + Web даващ URL: + + + + Select a file to add to the torrent + Изберете файл за добавяне към торента + + + No tracker path set + Не е определен път за тракер + + + Please set at least one tracker + Моля изберете поне един тракер + + + + Created torrent file is invalid. It won't be added to download list. + Създаденият торент файл е невалиден. Няма да бъде добавен в листа за сваляне. + + + + downloadFromURL + + + Download Torrents from URLs + Сваляне на Торенти от URL + + + + Only one URL per line + Само един URL на ред + + + + Download + Свали + + + + Cancel + Прекъсни + + + + Download from urls + Свали от url-ове + + + + No URL entered + Невъведен URL + + + + Please type at least one URL. + Моля въведете поне един URL. + + + + downloading + + + Search + Търси + + + Total DL Speed: + Обща DL Скорост: + + + KiB/s + KiB/с + + + Session ratio: + Процент сесия: + + + Total UP Speed: + Обща UP Скорост: + + + Log + Влез + + + IP filter + IP филтър + + + + Start + Старт + + + + Pause + Пауза + + + + Delete + Изтрий + + + Clear + Изтрий + + + + Preview file + Огледай файла + + + + Set upload limit + Определи лимит качване + + + + Set download limit + Определи лимит сваляне + + + + Delete Permanently + Изтрий завинаги + + + + Torrent Properties + Характеристики на Торента + + + + Open destination folder + Отвори папка получател + + + + Name + Име + + + + Size + Размер + + + + Progress + Изпълнение + + + + DLSpeed + DL Скорост + + + + UpSpeed + UP Скорост + + + + Seeds/Leechs + Даващи/Вземащи + + + + Ratio + Съотношение + + + + ETA + ЕТА + + + + Buy it + Купи го + + + + Priority + Предимство + + + + Increase priority + Увеличи предимството + + + + Decrease priority + Намали предимството + + + + Force recheck + Включени проверки за промени + + + + Copy magnet link + Копирай връзка magnet + + + + engineSelect + + + Search plugins + Търси добавки + + + + Installed search engines: + Инсталирани търсачки: + + + + Name + Име + + + + Url + Url + + + + Enabled + Включено + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Можете да вземете нови добавки за търсачката тук: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Инсталирай нов + + + + Check for updates + Провери за обновяване + + + + Close + Затвори + + + + Enable + Включи + + + + Disable + Изключи + + + + Uninstall + Деинсталирай + + + + engineSelectDlg + + True + Вярно + + + False + Грешно + + + + Uninstall warning + Предупреждение за деинсталиране + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Някои добавки не могат да бъдат деинсталирани защото са част от qBittorrent. + Само добавените от вас могат да бъдат деинсталирани. +Обаче добавките бяха изключени. + + + + Uninstall success + Успешно деинсталиране + + + All selected plugins were uninstalled successfuly + Всички избрани добавки бяха успешно деинсталирани + + + + Select search plugins + Избери добавки за търсене + + + + + qBittorrent search plugins + qBittorrent добавки за търсене + + + + + + + + + + + Search plugin install + Инсталиране на добавка за търсене + + + + + + Yes + Да + + + + + + + No + Не + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + По-нова версия на %1 добавката за търсене вече е инсталирана. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + %1 добавка на търсачката беше успешно обновена. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + %1 добавка на търсачката беше успешно инсталирана. + + + + + + + + Search plugin update + Добавката за търсене е обновена + + + + + Sorry, update server is temporarily unavailable. + Съжалявам, сървъра за обновяване е временно недостъпен. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + %1 добавка за търсене беше успешно обновена. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Съжалявам, %1 обновяването на добавката бе неуспешно. + + + + All your plugins are already up to date. + Всички ваши добавки са вече обновени. + + + + All selected plugins were uninstalled successfully + Всички избрани добавки бяха успешно деинсталирани + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 добавка на търсачката не бе обновена, запазване на досегашната версия. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 добавка на търсачката не бе инсталирана. + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 добавка на търсачката беше успешно обновена. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 добавка на търсачката беше успешно обновена. + + + + Search engine plugin archive could not be read. + Файла за добавки на търсачката не бе прочетен. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Съжалявам, инсталацията на %1 добавката за търсене бе неуспешна. + + + + New search engine plugin URL + Нов URL за добавки на търсачката + + + + URL: + URL: + + + + misc + + + B + bytes + Б + + + + KiB + kibibytes (1024 bytes) + КБ + + + + MiB + mebibytes (1024 kibibytes) + МБ + + + + GiB + gibibytes (1024 mibibytes) + ГБ + + + + TiB + tebibytes (1024 gibibytes) + ТБ + + + m + minutes + м + + + h + hours + ч + + + d + days + д + + + h + hours + ч + + + Unknown + Неизвестно + + + + Unknown + Unknown (size) + Неизвестен + + + + < 1m + < 1 minute + < 1мин + + + + %1m + e.g: 10minutes + %1мин + + + + %1h%2m + e.g: 3hours 5minutes + %1ч%2мин + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1д%2ч%3мин + + + + options_imp + + Options saved successfully! + Избора е съхранен успешно! + + + Choose Scan Directory + Изберете Директория за Сканиране + + + Choose save Directory + Изберете Директория за Съхранение + + + Choose ipfilter.dat file + Изберете ipfilter.dat файл + + + I/O Error + Грешка на Вход/Изход + + + Couldn't open: + Не мога да отворя: + + + in read mode. + е в режим четене. + + + Invalid Line + Грешен Ред + + + Line + Ред + + + is malformed. + е повреден. + + + Range Start IP + IP Стартова Област + + + Start IP: + IP на Старт: + + + Incorrect IP + Некоректно IP + + + This IP is incorrect. + Това IP е некоректно. + + + Range End IP + IP Крайна Област + + + End IP: + Крайно IP: + + + IP Range Comment + Коментар IP Област + + + Comment: + Коментар: + + + to + <min port> to <max port> + до + + + Choose your favourite preview program + Моля, изберете любима програма за оглед + + + Invalid IP + Невалиден IP + + + This IP is invalid. + Този IP е невалиден. + + + Options were saved successfully. + Опциите бяха съхранени успешно. + + + + + Choose scan directory + Изберете директория за сканиране + + + Choose an ipfilter.dat file + Изберете ipfilter.dat файл + + + + + Choose a save directory + Изберете директория за съхранение + + + I/O Error + Input/Output Error + В/И Грешка + + + Couldn't open %1 in read mode. + Не мога да отворя %1 в режим четене. + + + + + Choose an ip filter file + Избери файл за ip филтър + + + + + Filters + Филтри + + + + pluginSourceDlg + + + Plugin source + Източник на добавката + + + + Search plugin source: + Търсене на източници на добавки: + + + + Local file + Локален файл + + + + Web link + Web линк + + + + preview + + + Preview selection + Оглед на избраното + + + + File preview + Оглед на файла + + + + The following files support previewing, <br>please select one of them: + Следните файлове поддържат оглед, <br>моля изберете един от тях: + + + + Preview + Оглед + + + + Cancel + Прекъсни + + + + previewSelect + + + + Preview impossible + Оглед невъзможен + + + + + Sorry, we can't preview this file + Съжалявам, не можем да огледаме този файл + + + + Name + Име + + + + Size + Размер + + + + Progress + Изпълнение + + + + properties + + + Torrent Properties + Настройки на Торента + + + Main Infos + Главни Бележки + + + File Name + Име Файл + + + Current Session + Текуща Сесия + + + Total Uploaded: + Общо Качени: + + + Total Downloaded: + Общо Свалени: + + + Download state: + Състояние Сваляне: + + + Current Tracker: + Текущ Тракер: + + + Number of Peers: + Брой на Донори: + + + Torrent Content + Съдържание на Торента + + + + OK + OK + + + Total Failed: + Общо Неуспешни: + + + Finished + Завършен + + + Queued for checking + В опашка за проверка + + + Checking files + Проверка на файловете + + + Connecting to tracker + Свързване с тракер + + + Downloading Metadata + Сваляне на Meta-данни + + + Downloading + Сваляне + + + Seeding + Споделяне + + + Allocating + Уточняване + + + + Unknown + Неизвестен + + + Complete: + Завършен: + + + Partial: + Частично: + + + + Files contained in current torrent: + Файлове включени в торента: + + + + Size + Размер + + + Selected + Избран + + + Unselect + Неизбран + + + Select + Избери + + + You can select here precisely which files you want to download in current torrent. + Тук можете да изберете точно кои файлове искате да свалите от торента. + + + False + Грешка + + + True + Вярно + + + Tracker + Тракер + + + + Trackers: + Тракери: + + + + + None - Unreachable? + Няма - Недостъпни? + + + Errors: + Грешки: + + + + Progress + Изпълнение + + + Main infos + Основна информация + + + Number of peers: + Брой връзки: + + + + Current tracker: + Текущ тракер: + + + + Total uploaded: + Общо качени: + + + + Main info + Главна бележка + + + + Torrent information + Торент информация + + + + Total downloaded: + Общо свалени: + + + + Total failed: + Общо неуспешни: + + + + Torrent content + Съдържание на Торента + + + Options + Опции + + + + Download in correct order (slower but good for previewing) + Сваляне в правилен ред (по-бавен, но добър за оглед на файловете) + + + Share Ratio: + Процент на споделяне: + + + Seeders: + Даващи: + + + Leechers: + Вземащи: + + + + Save path: + Съхрани Път: + + + Torrent infos + Торент бележки + + + + Creator: + Автор: + + + + Torrent hash: + Торент раздробяване: + + + + Comment: + Коментар: + + + + Current session + Текуща сесия + + + + Share ratio: + Процент на споделяне: + + + + Trackers + Тракери + + + New tracker + Нов тракер + + + New tracker url: + Нов тракер url: + + + + Priorities: + Предимства: + + + + Normal: normal priority. Download order is dependent on availability + Нормално: нормално предимство. Поредицата за сваляне зависи от наличността + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Високо: по-високо от нормалното предимство. Частите с висока наличност са предпочитани пред тези с ниска наличност + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Максимално: максимално предимство, наличността се игнорира, частта се предпочита пред всички останали с по-ниско предимство + + + + File name + Име файл + + + + + Priority + Предимство + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + Листата на тракери не може да бъде празна. + + + + Ignored: file is not downloaded at all + Игнорирано: файла изобщо не е свален + + + + Ignored + Игнорирано + + + + Normal + Нормален + + + + Maximum + Максимален + + + + High + Висок + + + + Url seeds + Url даващи + + + + New url seed: + Нов url на даващ: + + + + This url seed is already in the list. + Този url на даващ е вече в списъка. + + + None + i.e: No error message + Няма + + + + New url seed + New HTTP source + Нов url на даващ + + + + The following url seeds are available for this torrent: + Следните url на даващи са налични за този торент: + + + + Priorities error + Грешни предимства + + + + Error, you can't filter all the files in a torrent. + Грешка, не можете да филтрирате всички файлове в един торент. + + + + Downloaded pieces + Свалени парчета + + + + Collapse all + Свий всички + + + + Expand all + Разшири всички + + + + ... + ... + + + + + Choose save path + Избери път за съхранение + + + + Save path creation error + Грешка при създаване на път за съхранение + + + + Could not create the save path + Не мога да създам път за съхранение + + + + search_engine + + + + Search + Търси + + + Search Engines + Търсачки + + + Search Pattern: + Тип на търсене: + + + Stop + Спри + + + + Status: + Състояние: + + + + Stopped + Спрян + + + Results: + Резултати: + + + + Download + Свали + + + Clear + Изтрий + + + Update search plugin + Обнови допълнението за търсене + + + + Search engines... + Търсачки... + + + Close tab + Затвори секцията + + + + seeding + + + Search + Търси + + + The following torrents are finished and shared: + Следните торенти са свалени и споделени: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Бележка :</u> Важно е да споделяте вашите торенти след като са завършени за всички от мрежата. + + + + Start + Старт + + + + Pause + Пауза + + + + Delete + Изтрий + + + + Delete Permanently + Изтрий завинаги + + + + Torrent Properties + Характеристики на Торента + + + + Preview file + Огледай файла + + + + Set upload limit + Определи лимит качване + + + + Open destination folder + Отвори папка получател + + + + Name + Име + + + + Size + Размер + + + + Upload Speed + Скорост на качване + + + + + Connected peers + Свързани двойки + + + + + Seeds / Leechers + Даващи / Вземащи + + + + Copy magnet link + Копирай връзка magnet + + + Leechers + Вземащи + + + + Ratio + Съотношение + + + + Buy it + Купи го + + + + Total uploaded + Общо качени + + + Priority + Предимство + + + Increase priority + Увеличи предимството + + + Decrease priority + Намали предимството + + + + Force recheck + Включени проверки за промени + + + + subDownloadThread + + + Host is unreachable + Хоста е недостъпен + + + + File was not found (404) + Файла не е намерен (404) + + + + Connection was denied + Връзката е отхвърлена + + + + Url is invalid + Невалиден Url + + + + I/O Error + В/И Грешка + + + Connection forbidden (403) + Връзката е забранена (403) + + + Connection was not authorized (401) + Нямате права за тази връзка (401) + + + Content has moved (301) + Съдържанието бе преместено (301) + + + + Connection failure + Неуспешна връзка + + + + Connection was timed out + Връзката изтече + + + + Incorrect network interface + Неточен интерфейс на мрежата + + + + Unknown error + Неизвестна грешка + + + + Could not resolve proxy + Не намерено прокси + + + + torrentAdditionDialog + + True + Вярно + + + + + Unable to decode torrent file: + Не мога да декодирам торент-файла: + + + This file is either corrupted or this isn't a torrent. + Този файла или е разрушен или не е торент. + + + + + Choose save path + Избери път за съхранение + + + False + Грешка + + + Unknown + Неизвестен + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 остават след сваляне на торента) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (още %1 са необходими за свалянето) + + + + Empty save path + Празен път за съхранение + + + + Please enter a save path + Моля въведете път за съхранение + + + + Save path creation error + Грешка при създаване на път за съхранение + + + + Could not create the save path + Не мога да създам път за съхранение + + + + Invalid file selection + Невалиден избор на файл + + + + You must select at least one file in the torrent + Трябва да изберете поне един файл в торента + + + + File name + Име файл + + + + Size + Размер + + + + Progress + Изпълнение + + + + + Priority + Предимство + + + diff --git a/src/lang/qbittorrent_ca.qm b/src/lang/qbittorrent_ca.qm new file mode 100644 index 0000000000000000000000000000000000000000..746d05d6cd644f4adbb09102b0570f63681398f7 GIT binary patch literal 17731 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 ujX + + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + + About qBittorrent + Sobre qBittorrent + + + + About + Sobre + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Un client bittorrent usant Qt4 i libtorrent, programat en C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br><u>Web:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + + Author + Autor + + + qBittorrent Author + Autor de qBittorrent + + + + Name: + Nom: + + + + Country: + Pais: + + + + E-mail: + E-mail: + + + + Home page: + Web: + + + + Christophe Dumez + Christophe Dumez + + + + France + França + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Gracies a + + + + Translation + Traducció + + + + License + Llicencia + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + Aniversari: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Occupation: + Ofici: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Estudiant d' informàtica + + + + Thanks to + + + + + BandwidthAllocationDialog + + + Upload limit: + + + + + Download limit: + + + + + + + + Unlimited + Unlimited (bandwidth) + + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + + + + + General + + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opcions -- qBittorrent + + + Options + Opcions + + + Main + Principal + + + Scanned Dir: + Directori escanejat: + + + ... + ... + + + Save Path: + Guardar a ruta: + + + Connection Settings + Configurar Conexió + + + Download Limit: + Límit Descàrrega: + + + Upload Limit: + Límit Pujada: + + + Max Connects: + Conexions màximes: + + + Port range: + Rang de ports: + + + Share ratio: + Radi descàrrega: + + + Kb/s + Kb/s + + + Disable + Desactivat + + + connections + conexions + + + to + a + + + 1 KB DL = + 1 KB Des. = + + + KB UP max. + KB Puj. màx. + + + Enable directory scan (auto add torrent files inside) + Habilita escaneig de directoris(enganxa el arxius torrent automàticament) + + + + IP Filter + Filtre IP + + + + Activate IP Filtering + Activa Filtre IP + + + + Filter Settings + Configurar Filtre + + + Add Range + Posar rang + + + Remove Range + Esborrar Rang + + + ipfilter.dat URL or PATH: + ipfilter.dat URL o Ruta: + + + Start IP + IP inici + + + End IP + IP final + + + Origin + Origen + + + Comment + Comentari + + + + Proxy + Proxy + + + Enable connection through a proxy server + Habilitar conexió mitjançant servidor proxy + + + Proxy Settings + Configurar Proxy + + + Server IP: + Servidor IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Port: + + + + + + Authentication + Autentificació + + + User Name: + Nom usuari: + + + + + + Password: + Contrasenya: + + + Proxy server requires authentication + Servidor proxy requereix autentificació + + + Language + Llengua + + + Please choose your preferred language in the following list: + Escull la teva llengua de la llista: + + + Language settings will take effect after restart. + La configuració del llenguatge fará efecte després de reiniciar. + + + English + Anglès + + + French + Francès + + + Simplified Chinese + Xinès simplificat + + + Korean + Koreà + + + Spanish + Castellà + + + German + Alemany + + + OK + Acceptar + + + Cancel + Cancelar + + + Apply + Aplicar + + + Add Range + Afegir Rang + + + Remove Range + Esborrar rang + + + Catalan + Català + + + ipfilter.dat Path: + ipfilter.dat Ruta: + + + Clear finished downloads on exit + Neteja les descàrregues finalitzades al sortir + + + Ask for confirmation on exit + Preguntar abans de sortir + + + Go to systray when minimizing window + Habilita la icona de la barra al minimitzar + + + Misc + Misc + + + Localization + Localització + + + + Language: + Llengua: + + + Behaviour + Comportament + + + OSD + OSD + + + Always display OSD + Mostrar sempre OSD + + + Display OSD only if window is minimized or iconified + Mostra l'OSD només si la finestra està minimitzada o iconificada + + + Never display OSD + No mostrar OSD mai + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB Desc. = + + + KiB UP max. + Kib Puj. max. + + + DHT (Trackerless): + DHT (Trackerless): + + + Disable DHT (Trackerless) support + Desactiva suport DHT (Trackerless) + + + Automatically clear finished downloads + Neteja automàticament les descàrregues finalitzades + + + Preview program + Programa per previsualitzar + + + Audio/Video player: + Reproductor de Audio/Video: + + + DHT configuration + Configuració DHT + + + + DHT port: + Port DHT: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Nota:</b>Els canvis s'aplicaran després de reiniciar qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Nota dels traductors:</b>Si qBittorrent no està disponible en la teva llengua, <br/>i si tu vols traduirlo a la teva llengua materna, <br/>si et plau contacta amb mí (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Mostrar el formulari del torrent afegit cada cop que jo afegeixo un torrent + + + Default save path + Ruta guardada per defecte + + + Systray Messages + Barra de Missatges + + + Always display systray messages + Mostrar sempre la barra de missatges + + + Display systray messages only when window is hidden + Mostra barra de missatges només quan la finestra està invisible + + + Never display systray messages + No mostrar mai la barra de missatges + + + + Plastique style (KDE like) + + + + + CDE style (Common Desktop Environment like) + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Port used for incoming connections: + + + + + Random + + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + + + + + Use proxy for connections to trackers + + + + + Use proxy for connections to regular peers + + + + + Use proxy for connections to web seeds + + + + + Use proxy for DHT messages + + + + + Enabled + + + + + Forced + + + + + Disabled + + + + + Preferences + Preferències + + + + User interface settings + + + + + Visual style: + + + + + Cleanlooks style (Gnome like) + + + + + Motif style (Unix like) + + + + + Ask for confirmation on exit when download list is not empty + + + + + Display current speed in title bar + + + + + System tray icon + + + + + Disable system tray icon + + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + + + + + Minimize to tray + + + + + Show notification balloons in tray + + + + + Downloads + Descarregues + + + + Pre-allocate all files + + + + + When adding a torrent + + + + + Display torrent content and some options + + + + + Do not start download automatically + The torrent will be added to download list in pause state + + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + + + + + Connection + + + + + Download list: + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + + + + + Listening port + + + + to + i.e: 1200 to 1300 + a + + + + Enable UPnP port mapping + + + + + Enable NAT-PMP port mapping + + + + + Global bandwidth limiting + + + + + Upload: + + + + + Download: + + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + + + + + + (None) + + + + + + Proxy: + + + + + + + Username: + Usuari: + + + + Bittorrent + + + + + UI + + + + + Connections limit + + + + + Global maximum number of connections: + + + + + Maximum number of connections per torrent: + + + + + Maximum number of upload slots per torrent: + + + + + Enable DHT network (decentralized) + + + + + Enable Local Peer Discovery + + + + + Encryption: + + + + + Share ratio settings + + + + + Desired ratio: + + + + + Filter file path: + + + + + transfer lists refresh interval: + + + + + ms + + + + + + RSS + + + + + RSS feeds refresh interval: + + + + + minutes + + + + + Maximum number of articles per feed: + + + + + File system + + + + + Remove finished torrents when their ratio reaches: + + + + + System default + + + + + Start minimized + + + + + Web UI + + + + + Enable Web User Interface + + + + + HTTP Server + + + + + Enable RSS support + + + + + RSS settings + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Torrent queueing + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Mida + + + + Progress + i.e: % downloaded + Progrès + + + + DL Speed + i.e: Download speed + Vel. Desc + + + + UP Speed + i.e: Upload speed + Vel. Pujada + + + + Seeds/Leechers + i.e: full/partial sources + + + + + Ratio + + + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + + + + This file is either corrupted or this isn't a torrent. + Aquest arxiu està corrupte o no es un arxiu torrent. + + + Couldn't listen on any of the given ports. + No es pot obrir el port especificat. + + + + Hide or Show Column + + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O Error + + + + + + Couldn't open %1 in read mode. + + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Finalitzat + + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Mida + + + + Seeds / Leechers + + + + + Connected peers + + + + Progress + i.e: % downloaded + Progrès + + + DL Speed + i.e: Download speed + Vel. Desc + + + + UP Speed + i.e: Upload speed + Vel. Pujada + + + Status + Estat + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Finalitzat + + + None + i.e: No error message + Res + + + + Ratio + + + + Leechers + i.e: full/partial sources + Leechers + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Hide or Show Column + + + + + GUI + + qBittorrent + qBittorrent + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: By Christophe Dumez :: Copyright (c) 2006 + + + started. + iniciat. + + + + + qBittorrent + qBittorrent + + + DL Speed: + Vel. Desc.: + + + kb/s + kb/s + + + UP Speed: + Vel. Pujada: + + + + Open Torrent Files + Arxius Torrent oberts + + + + Torrent Files + Arxius Torrent + + + Couldn't create the directory: + No es pot crear el directori: + + + already in download list. + <file> already in download list. + torna a estar a la llista de descàrregues. + + + kb/s + kb/s + + + Unknown + Desconegut + + + added to download list. + agregat a la llista de descàrregues. + + + resumed. (fast resume) + reanudat (reanudar ràpidament) + + + Unable to decode torrent file: + Deshabilita el decodificador d' arxius torrent: + + + This file is either corrupted or this isn't a torrent. + Aquest arxiu està corrupte o no es un arxiu torrent. + + + + + + + Are you sure? -- qBittorrent + Estàs segur? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Estàs segur de que vols buidar la llista de descàrregues? + + + + + + + + &Yes + &Yes + + + + + + + + &No + &No + + + Download list cleared. + Llista de descàrregues buidada. + + + + Are you sure you want to delete the selected item(s) in download list? + Estàs segur de que vols esborrar les descàrregues seleccionades? + + + removed. + <file> removed. + esborrat. + + + Listening on port: + Escoltant al port: + + + paused + pausat + + + All Downloads Paused. + Totes les descàrregues Pausades. + + + started + iniciat + + + All Downloads Resumed. + Totes les descàrregues reanudades. + + + paused. + <file> paused. + pausat. + + + resumed. + <file> resumed. + reanudat. + + + <b>Connection Status:</b><br>Online + <b>Connection Status:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Estat de conexió:</b><br>Tallafocs activat?<br><i>No entren conexions...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Estat de conexió:</b><br>Desconectat<br><i>No s'han trobat fonts...</i> + + + has finished downloading. + ha finalitzat la descàrrega. + + + Couldn't listen on any of the given ports. + No es pot obrir el port especificat. + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Speed: + + + /s + <unit>/seconds + /s + + + + Finished + Finalitzat + + + Checking... + Validant... + + + Connecting... + Conectant... + + + Downloading... + Descàrregant... + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + None + Res + + + Empty search pattern + Busqueda pare buida + + + Please type a search pattern first + Si us plau introduïu una busqueda pare primer + + + No seach engine selected + No as seleccionat motor per cercar + + + You must select at least one search engine. + Has de seleccionar un motor de busqueda. + + + Searching... + Cercant... + + + Could not create search plugin. + No es pot crear el plugin per cercar. + + + Stopped + Parat + + + I/O Error + I/O Error + + + Couldn't create temporary file on hard drive. + No es pot crear temporalment l'arxiu al disc dur. + + + Torrent file URL + Arxiu URL Torrent + + + KB/s + KB/s + + + KB/s + KB/s + + + Downloading using HTTP: + Descarregant utilitzant HTTP: + + + Torrent file URL: + Arxiu URL Torrent: + + + A http download failed... + Una descàrrega HTTP ha fallat... + + + A http download failed, reason: + Una descàrrega HTTP ha fallat, raó: + + + Are you sure you want to quit? -- qBittorrent + Estas segur que vols sortir? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Estas segur que vols sortir de qBittorrent? + + + Timed out + Fora de Temps + + + Error during search... + Error mentre cercava... + + + Failed to download: + Descàrrega fallida: + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + A http download failed, reason: + Una descàrrega HTTP ha fallat, raó: + + + Stalled + Lloc + + + Search is finished + La Recerca ha finalitzat + + + An error occured during search... + Hi ha hagut un error durant la recerca... + + + Search aborted + Recerca abortada + + + Search returned no results + La recerca no ha tornat Resultats + + + Search is Finished + La recerca a finalitzat + + + Search plugin update -- qBittorrent + Actualització plugin de recerca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + El plugin de recerca pot ser actualitzat, actualitzar? + +Log: + + + + Sorry, update server is temporarily unavailable. + Ho sento, el servidor per actualitzar està temporalment no disponible. + + + Your search plugin is already up to date. + El teu plugin de recerca torna a estar actualitzat. + + + Results + Resultats + + + Name + Nom + + + Size + Mida + + + Progress + Progrès + + + DL Speed + Vel. Desc + + + UP Speed + Vel. Pujada + + + Status + Estat + + + ETA + ETA + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Motor per cercar + + + Stalled + state of a torrent whose DL Speed is 0 + Parat + + + Paused + Pausat + + + Preview process already running + Previsualitzar els processos que corren + + + There is already another preview process running. +Please close the other one first. + Hi ha un altre procés corrent. +Si et plau tanca l'altre primer. + + + Couldn't download + Couldn't download <file> + NO es pot descarregar + + + reason: + Reason why the download failed + Raó: + + + Downloading + Example: Downloading www.example.com/test.torrent + Descarregant + + + Please wait... + Espera ... + + + Transfers + Transferits + + + Are you sure you want to quit qBittorrent? + Estas segur que vols sortir de qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Estàs segur que vols esborrar els objectes seleccionats de la llista de descàrregues i del disc dur? + + + + Download finished + + + + has finished downloading. + <filename> has finished downloading. + ha finalitzat la descàrrega. + + + Search Engine + Motor de Busqueda + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + + + + + + Connection status: + + + + Name + i.e: file name + Nom + + + Size + i.e: file size + Mida + + + Progress + i.e: % downloaded + Progrès + + + DL Speed + i.e: Download speed + Vel. Desc + + + UP Speed + i.e: Upload speed + Vel. Pujada + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + + + + Finished + i.e: Torrent has finished downloading + Finalitzat + + + Checking... + i.e: Checking already downloaded parts... + Validant... + + + + Are you sure you want to quit? + + + + None + i.e: No error message + Res + + + Connecting... + i.e: Connecting to the tracker... + Conectant... + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + + + + + I/O Error + i.e: Input/Output Error + I/O Error + + + + Connection Status: + + + + + Online + + + + Results + i.e: Search results + Resultats + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + + + + + Search + Cercar + + + + RSS + + + + + + DHT support [OFF] + + + + + PeX support [ON] + + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + + + + + + Downloads + Descarregues + + + + Are you sure you want to delete the selected item(s) in finished list? + + + + + UPnP support [ON] + + + + + Encryption support [ON] + + + + + Encryption support [FORCED] + + + + + Encryption support [OFF] + + + + + Alt+1 + shortcut to switch to first tab + + + + + Alt+2 + shortcut to switch to second tab + + + + + Alt+4 + shortcut to switch to fourth tab + + + + + Url download error + + + + + Couldn't download file at url: %1, reason: %2. + + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + + + + + Alt+3 + shortcut to switch to third tab + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + UPnP support [OFF] + + + + + NAT-PMP support [ON] + + + + + NAT-PMP support [OFF] + + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + + + + + Local Peer Discovery support [OFF] + + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + Options were saved successfully. + + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Per Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Vel. Total Descàrrega: + + + Kb/s + Kb/s + + + Total UP Speed: + Vel. Total Pujada: + + + Name + Nom + + + Size + Mida + + + % DL + % Desc + + + DL Speed + Vel. Desc + + + UP Speed + Vel. Pujada + + + Status + Estat + + + ETA + ETA + + + + &File + &Fitxer + + + &Options + &Opcions + + + + &Help + &Ajuda + + + + &Edit + &Editar + + + + Open + Obre + + + + Exit + Sortir + + + + Preferences + Preferències + + + + About + Sobre + + + + Start + Comença + + + + Pause + Pausa + + + + Delete + Esborra + + + + Pause All + Pausa Tot + + + + Start All + Comença totes + + + + Documentation + Documentació + + + Connexion Status + Estat de la Conexió + + + Delete All + Esborra Tot + + + + Torrent Properties + Propietats del Torrent + + + Connection Status + Estat de la Conexió + + + Downloads + Descarregues + + + Search + Cercar + + + Search Pattern: + Busqueda pare: + + + Status: + Estat: + + + Stopped + Parat + + + Search Engines + Motor per cercar + + + Results: + Resultats: + + + Stop + Parar + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Motor de Busqueda + + + + Download from URL + Descarregant de URL + + + Download + Descàrrega + + + Clear + Neteja + + + KiB/s + KiB/s + + + + Create torrent + Crear torrent + + + Ratio: + Radi: + + + Update search plugin + Actualitza plugin de Recerca + + + Session ratio: + Mitja de sessió: + + + Transfers + Transferits + + + + Preview file + Previsualitza el fitxer + + + + Clear log + Neteja el registre + + + + Delete Permanently + Esborrar Permanentment + + + + Visit website + + + + + Report a bug + + + + + Set upload limit + + + + + Set download limit + + + + + Set global download limit + + + + + Set global upload limit + + + + + Options + Opcions + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + False + Fals + + + True + Cert + + + + + Ignored + + + + + + + Normal + Normal (priority) + + + + + + High + High (priority) + + + + + + Maximum + Maximum (priority) + + + + + QTextEdit + + Clear + Neteja + + + + RSS + + + Search + Cercar + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + + Update all feeds + + + + + + Delete + Esborra + + + + Feed URL + + + + + + Rename + + + + + + Update + + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + + New folder + + + + Create + Crear + + + + Refresh RSS streams + + + + 2 + 2 + + + + RSSImp + + + Please type a rss stream url + + + + + Stream URL: + + + + + + Are you sure? -- qBittorrent + Estàs segur? -- qBittorrent + + + + + &Yes + &Yes + + + + + &No + &No + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + + + + + Author: + + + + + Unread + + + + + RssItem + + + No description available + + + + + RssStream + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Nom + + + Size + i.e: file size + Mida + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Motor per cercar + + + + Empty search pattern + Busqueda pare buida + + + + Please type a search pattern first + Si us plau introduïu una busqueda pare primer + + + You must select at least one search engine. + Has de seleccionar un motor de busqueda. + + + + + Results + Resultats + + + + Searching... + Cercant... + + + Search plugin update -- qBittorrent + Actualització plugin de recerca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + El plugin de recerca pot ser actualitzat, actualitzar? + +Log: + + + + &Yes + &Yes + + + &No + &No + + + Sorry, update server is temporarily unavailable. + Ho sento, el servidor per actualitzar està temporalment no disponible. + + + Your search plugin is already up to date. + El teu plugin de recerca torna a estar actualitzat. + + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Search Engine + Motor de Busqueda + + + + + Search has finished + + + + + An error occured during search... + Hi ha hagut un error durant la recerca... + + + + Search aborted + Recerca abortada + + + + Search returned no results + La recerca no ha tornat Resultats + + + + Results + i.e: Search results + Resultats + + + + + Unknown + Desconegut + + + + SearchTab + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Mida + + + + Seeders + i.e: Number of full sources + Seeders + + + + Leechers + i.e: Number of partial sources + Leechers + + + + Search engine + Motor per cercar + + + + TrackersAdditionDlg + + + Trackers addition dialog + + + + + List of trackers to add (one per line): + + + + + Ui + + qBittorrent + qBittorrent + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Vui agrair a sourceforge.net haver hospedat el projecte qBittorrent. + + + I would like to thank the following people who volonteered to translate qBittorrent: + Vui agrair a les següents persones la seva voluntat per traduir qBittorrent: + + + Please contact me if you would like to translate qBittorrent to your own language. + Si us plau contacteu amb mi si voleu traduir qBittorrent a la teva pròpia llengua. + + + I would like to thank the following people who volunteered to translate qBittorrent: + Vui agrair a les següents persones la seva voluntat per traduir qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Jo vui agrair a sourceforge.net haver hospedat el projecte qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Jo també vui agrair a Jeffery Fernandez (developer@jefferyfernandez.id.au), el nostre empaquetador RPM, pel seu excel·lent treball.</li></ul> + + + Preview impossible + Imposible previsualitzar + + + Sorry, we can't preview this file + Disculpa, no podem previsualitzar aquest fitxer + + + Name + Nom + + + Size + Mida + + + Progress + Progrès + + + No URL entered + URL no entrada + + + Please type at least one URL. + Si et plau entra mínimament una URL. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Vui agrair a les següents persones la seva voluntat per traduir qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + + + + + addTorrentDialog + + + Torrent addition dialog + Formulari d'addició de torrent + + + + Save path: + Ruta guardada: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + Desconegut + + + + Free disk space: + + + + + Torrent content: + Contingut del Torrent: + + + + Download in sequential order (slower but good for previewing) + + + + File name + Nom del fitxer + + + File size + Mida del fitxer + + + Selected + Seleccionat + + + Download in correct order (slower but good for previewing) + Descarrega en l'ordre correcte (més lent però més bona previsualització) + + + + Add to download list in paused state + Afegeix a la llista de descàrregues en estat pausat + + + + Add + Afegir + + + + Cancel + Cancelar + + + select + seleccionat + + + Unselect + Desseleccionat + + + + Ignored + + + + + Normal + + + + + High + + + + + Maximum + + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + Autentificació al Tracker + + + + Tracker: + Tracker: + + + + Login + Autentificació + + + + Username: + Usuari: + + + + Password: + Contrasenya: + + + + Log in + Autentificat + + + + Cancel + Cancelar + + + + bandwidth_dlg + + + Bandwidth allocation + + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + + + + + '%1' was removed. + 'xxx.avi' was removed. + + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + + + + + This file is either corrupted or this isn't a torrent. + Aquest arxiu està corrupte o no es un arxiu torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + No es pot obrir el port especificat. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + + Fast resume data was rejected for torrent %1, checking again... + + + + + Url seed lookup failed for url: %1, message: %2 + + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + + + + + createTorrentDialog + + Create Torrent file + Crear arxiu torrent + + + Destination torrent file: + Arxiu torrent destí: + + + Input file or directory: + Entrar arxiu o directori: + + + Comment: + Comentari: + + + ... + ... + + + Create + Crear + + + + Cancel + Cancelar + + + Announce url (Tracker): + Anunciar url (Tracker): + + + Directory + Directori + + + + Torrent Creation Tool + Eina Creador de Torrent + + + <center>Destination torrent file:</center> + <center>Arxiu torrent destí:</center> + + + <center>Input file or directory:</center> + <center>Arxiu o directori d'entrada:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>URL anunciada:<br>(Una per linia)</center> + + + <center>Comment:</center> + <center>Comentari:</center> + + + + Torrent file creation + + + + + Add file + + + + + Add folder + + + + + Announce urls (trackers): + + + + + Comment (optional): + + + + + Web seeds urls (optional): + + + + + File or folder to add to the torrent: + + + + + Piece size: + + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + + + + + Start seeding after creation + + + + + Create and save... + + + + + Progress: + + + + + createtorrent + + + Select destination torrent file + Seleccionar arxiu torrent destí + + + + Torrent Files + Arxius Torrent + + + Select input directory or file + Selecciona arxiu o directori d'entrada + + + No destination path set + Ruta destí no especificada + + + Please type a destination path first + Si us plau, especifica una ruta destí primer + + + + No input path set + Ruta d'entrada no especificada + + + + Please type an input path first + Si us plau escriu una ruta d'entrada primer + + + Input path does not exist + La ruta d'entrada no existeix + + + Please type a correct input path first + Si us plau escriu una ruta d'entrada primer + + + + + + Torrent creation + Crear Torrent + + + + Torrent was created successfully: + Torrent creatamb éxit: + + + Please type a valid input path first + Entra una ruta vàlida primer si us plau + + + + Select a folder to add to the torrent + + + + + Please type an announce URL + + + + + Torrent creation was unsuccessful, reason: %1 + + + + + Announce URL: + Tracker URL + + + + + Please type a web seed url + + + + + Web seed URL: + + + + + Select a file to add to the torrent + + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + Descarrega Torrents d' URL + + + + Only one URL per line + Només una URL per línia + + + + Download + Descàrrega + + + + Cancel + Cancelar + + + + Download from urls + Descarregant de URLs + + + + No URL entered + URL no entrada + + + + Please type at least one URL. + Si et plau entra mínimament una URL. + + + + downloading + + + Search + Cercar + + + Total DL Speed: + Vel. Total Descàrrega: + + + KiB/s + KiB/s + + + Session ratio: + Mitja de sessió: + + + Total UP Speed: + Vel. Total Pujada: + + + + Start + Comença + + + + Pause + Pausa + + + + Delete + Esborra + + + Clear + Neteja + + + + Preview file + Previsualitza el fitxer + + + + Set upload limit + + + + + Set download limit + + + + + Delete Permanently + Esborrar Permanentment + + + + Torrent Properties + Propietats del Torrent + + + + Open destination folder + + + + + Name + Nom + + + + Size + Mida + + + + Progress + Progrès + + + + DLSpeed + + + + + UpSpeed + + + + + Seeds/Leechs + + + + + Ratio + + + + + ETA + ETA + + + + Buy it + + + + + Priority + + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + + + + + Installed search engines: + + + + + Name + Nom + + + + Url + + + + + Enabled + + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + + Install a new one + + + + + Check for updates + + + + + Close + + + + + Enable + + + + + Disable + Desactivat + + + + Uninstall + + + + + engineSelectDlg + + True + Cert + + + False + Fals + + + + Uninstall warning + + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + + + + + Uninstall success + + + + + Select search plugins + + + + + + qBittorrent search plugins + + + + + + + + + + + + Search plugin install + + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + + + + + + + + + Search plugin update + + + + + + Sorry, update server is temporarily unavailable. + Ho sento, el servidor per actualitzar està temporalment no disponible. + + + + All your plugins are already up to date. + + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + + + + + All selected plugins were uninstalled successfully + + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + + + + + Search engine plugin archive could not be read. + + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + + + + + New search engine plugin URL + + + + + URL: + + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Unknown + Desconegut + + + + Unknown + Unknown (size) + Desconegut + + + + < 1m + < 1 minute + + + + + %1m + e.g: 10minutes + + + + + %1h%2m + e.g: 3hours 5minutes + + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + + + + + options_imp + + Options saved successfully! + Opcions guardades correctament! + + + Choose Scan Directory + Escull el directori a escanejar + + + Choose ipfilter.dat file + Escull l'arxiu ipfilter.dat + + + Choose save Directory + Escull el Directory de Descàrregues + + + I/O Error + I/O Error + + + Couldn't open: + No es por Obrir: + + + in read mode. + in mode lectura. + + + Invalid Line + Linia Invàlida + + + Line + Linia + + + is malformed. + està malformada. + + + Range Start IP + Rang IP Inicial + + + Start IP: + IP Inicial: + + + Incorrect IP + IP Incorrecte + + + This IP is incorrect. + Aquesta IP es incorrecta. + + + Range End IP + Rang IP Final + + + End IP: + IP Final: + + + IP Range Comment + Comentari Rang IP + + + Comment: + Comentari: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + Escull el teu programa per previsualitzar + + + Invalid IP + IP Invàlida + + + This IP is invalid. + Aquesta IP es invalida. + + + + + Choose scan directory + + + + + + Choose a save directory + + + + I/O Error + Input/Output Error + I/O Error + + + + + Choose an ip filter file + + + + + + Filters + + + + + pluginSourceDlg + + + Plugin source + + + + + Search plugin source: + + + + + Local file + + + + + Web link + + + + + preview + + + Preview selection + Previsualitzar seleccionats + + + + File preview + Arxiu Previsualitzat + + + + The following files support previewing, <br>please select one of them: + El següent arxiu suporta previsualització, <br>si et plau selecciona un d'ells: + + + + Preview + Previsualització + + + + Cancel + Cancelar + + + + previewSelect + + + + Preview impossible + Imposible previsualitzar + + + + + Sorry, we can't preview this file + Disculpa, no podem previsualitzar aquest fitxer + + + + Name + Nom + + + + Size + Mida + + + + Progress + Progrès + + + + properties + + + Torrent Properties + Propietats del Torrent + + + + OK + Acceptar + + + Main Infos + Informació Principal + + + Download state: + Estat Descàrrega: + + + Number of Peers: + Nombre de Fonts: + + + Current Session + Sessió Actual + + + Total Uploaded: + Pujades Totals: + + + Total Downloaded: + Descàrregues Totals: + + + Total Failed: + Fallides Totals: + + + File Name + Nom d'Arxiu + + + Tracker + Tracker + + + + Trackers: + Trackers: + + + Current Tracker: + Trackers Actuals: + + + Errors: + Errors: + + + Torrent Content + Contingut Torrent + + + + Files contained in current torrent: + Arxiu continguts en el torrent actual: + + + Unselect + Deseleccionat + + + Select + Seleccionat + + + You can select here precisely which files you want to download in current torrent. + Tu pots seleccionar aquí els arxius que vols descàrregar del torrent actual. + + + + Size + Mida + + + Selected + Seleccionat + + + Finished + Finalitzat + + + Queued for checking + Cua per validar + + + Checking files + Validant arxius + + + Connecting to tracker + Conectant al tracker + + + Downloading Metadata + Descarregant Metadata + + + Downloading + Descarregant + + + Seeding + Extraient llavor + + + Allocating + Localitzant + + + + + None - Unreachable? + Res - No esta disponible? + + + + Unknown + Desconegut + + + Complete: + Completat: + + + Partial: + Pacial: + + + False + Fals + + + True + Cert + + + + Progress + Progrès + + + Main infos + Informació Principal + + + Number of peers: + Nombre d' amics: + + + + Current tracker: + Pista Actual: + + + + Total uploaded: + Total Pujat: + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + Total Descarregat: + + + + Total failed: + Total fallats: + + + + Torrent content + Contingut del torrent + + + Options + Opcions + + + + Download in correct order (slower but good for previewing) + Descarrega en l'ordre correcte (més lent però més bona previsualització) + + + Share Ratio: + Radi de descàrregues: + + + Seeders: + Seeders: + + + Leechers: + Leechers: + + + + Save path: + Ruta guardada: + + + + Creator: + + + + + Torrent hash: + + + + + Comment: + Comentari: + + + + Current session + + + + + Share ratio: + Radi descàrrega: + + + + Trackers + + + + + Priorities: + + + + + Normal: normal priority. Download order is dependent on availability + + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + + + + + File name + Nom del fitxer + + + + + Priority + + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + + + + + Ignored: file is not downloaded at all + + + + + Ignored + + + + + Normal + + + + + Maximum + + + + + High + + + + + Url seeds + + + + + New url seed: + + + + + This url seed is already in the list. + + + + None + i.e: No error message + Res + + + + New url seed + New HTTP source + + + + + The following url seeds are available for this torrent: + + + + + Priorities error + + + + + Error, you can't filter all the files in a torrent. + + + + + Downloaded pieces + + + + + Collapse all + + + + + Expand all + + + + + ... + ... + + + + + Choose save path + Escull ruta per salvar + + + + Save path creation error + Guardar ruta creació d'error + + + + Could not create the save path + No es pot creat la ruta guardada + + + + search_engine + + + + Search + Cercar + + + Search Engines + Motor per cercar + + + Search Pattern: + Busqueda pare: + + + Stop + Parar + + + + Status: + Estat: + + + + Stopped + Parat + + + Results: + Resultats: + + + + Download + Descàrrega + + + Clear + Neteja + + + Update search plugin + Actualitza plugin de Recerca + + + + Search engines... + + + + + seeding + + + Search + Cercar + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + + + + + Start + Comença + + + + Pause + Pausa + + + + Delete + Esborra + + + + Delete Permanently + Esborrar Permanentment + + + + Torrent Properties + Propietats del Torrent + + + + Preview file + Previsualitza el fitxer + + + + Set upload limit + + + + + Open destination folder + + + + + Name + Nom + + + + Size + Mida + + + + Upload Speed + + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + Leechers + Leechers + + + + Ratio + + + + + Buy it + + + + + Force recheck + + + + + Total uploaded + + + + + subDownloadThread + + + Host is unreachable + + + + + File was not found (404) + + + + + Connection was denied + + + + + Url is invalid + + + + + Connection failure + + + + + Connection was timed out + + + + + Incorrect network interface + + + + + Unknown error + + + + + I/O Error + I/O Error + + + + Could not resolve proxy + + + + + torrentAdditionDialog + + True + Cert + + + + + Unable to decode torrent file: + Deshabilita el decodificador d' arxius torrent: + + + This file is either corrupted or this isn't a torrent. + Aquest arxiu està corrupte o no es un arxiu torrent. + + + + + Choose save path + Escull ruta per salvar + + + False + Fals + + + Unknown + Desconegut + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + Ruta buida + + + + Please enter a save path + Si us plau entra una ruta salvada + + + + Save path creation error + Guardar ruta creació d'error + + + + Could not create the save path + No es pot creat la ruta guardada + + + + Invalid file selection + Seleció invàlida de fitxer + + + + You must select at least one file in the torrent + Has de seleccionar mínimament un fitxer en el torrent + + + + File name + Nom del fitxer + + + + Size + Mida + + + + Progress + Progrès + + + + + Priority + + + + diff --git a/src/lang/qbittorrent_cs.qm b/src/lang/qbittorrent_cs.qm new file mode 100644 index 0000000000000000000000000000000000000000..349269df15cc5140afc5257d322f224441c11bbf GIT binary patch literal 67626 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_cs.ts b/src/lang/qbittorrent_cs.ts new file mode 100644 index 000000000..54d6acd37 --- /dev/null +++ b/src/lang/qbittorrent_cs.ts @@ -0,0 +1,3960 @@ + + + + + AboutDlg + + + About qBittorrent + O aplikaci qBittorrent + + + + About + O aplikaci + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bittorrent klient naprogramován v C++, používající Qt4 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Domovská stránka:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Autor + + + + Name: + Jméno: + + + + Country: + Stát: + + + + E-mail: + E-mail: + + + + Home page: + Domovská stránka: + + + + Christophe Dumez + Christophe Dumez + + + + France + Francie + + + + Translation + Překlad + + + + License + Licence + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Bittorrent klient používající Qt4 a libtorrent, naprogramován v C++.<br> +<br> +Copyright © 2006 Christophe Dumez<br> +<br> <u>Domovská stránka:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + Narozeniny: + + + + Occupation: + Zaměstnání: + + + + 03/05/1985 + 5.3.1985 + + + + Student in computer science + Student informatiky + + + + Thanks to + Poděkování + + + + BandwidthAllocationDialog + + + Upload limit: + Limit nahrávání: + + + + Download limit: + Limit stahování: + + + + + + + Unlimited + Unlimited (bandwidth) + Bez limitu + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + qBittorrent konzole + + + + General + Obecné + + + + Blocked IPs + Blokované IP + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Nastavení -- qBittorrent + + + Port range: + Rozsah portů: + + + ... + ... + + + Proxy Settings + Nastavení proxy + + + + + + Port: + Port: + + + + + + Authentication + Ověření + + + + + + Password: + Heslo: + + + + Activate IP Filtering + Aktivovat filtrování IP + + + + Filter Settings + Nastavení filtru + + + + Language: + Jazyk: + + + + + KiB/s + KiB/s + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Poznámka:</b> Změny se projeví až po restartování aplikace qBittorrent. + + + + UI + Uživatelské rozhraní + + + + Connection + Připojení + + + + Plastique style (KDE like) + Styl Plastique (jako KDE) + + + + CDE style (Common Desktop Environment like) + Styl CDE (jako Common Desktop Environment) + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Ovlivněná připojení + + + + Use proxy for connections to trackers + Použít proxy pro připojení k trackeru + + + + Use proxy for connections to regular peers + Použít proxy pro připojení k protějškům + + + + Use proxy for connections to web seeds + Použít proxy pro připojení k seedům + + + + Use proxy for DHT messages + Použít proxy pro DHT zprávy + + + + Enabled + Zapnuto + + + + Forced + Vynuceno + + + + Disabled + Vypnuto + + + + Preferences + Předvolby + + + General + Obecné + + + Network + Síť + + + + IP Filter + IP filtr + + + + User interface settings + Nastavení uživatelského rozhraní + + + + Visual style: + Nastavení vzhledu: + + + + Cleanlooks style (Gnome like) + Styl Cleanlooks (jako Gnome) + + + + Motif style (Unix like) + Styl Motif (jako Unix) + + + + Ask for confirmation on exit when download list is not empty + Potvrdit ukončení programu v případě, že seznam stahování není prázdný + + + + Display current speed in title bar + Zobrazit aktuální rychlost v záhlaví okna + + + + System tray icon + Ikona v oznamovací oblasti (tray) + + + + Disable system tray icon + Vypnout ikonu v oznamovací oblasti (tray) + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Zavřít do oznamovací oblasti (tray) + + + + Minimize to tray + Minimalizovat do oznamovací oblasti (tray) + + + + Show notification balloons in tray + Ukazovat informační bubliny v oznamovací oblasti (tray) + + + + Downloads + Stahování + + + Put downloads in this folder: + Uložit stažené soubory do tohoto adresáře: + + + + Pre-allocate all files + Dopředu přidělit místo všem souborům + + + + When adding a torrent + Při přidání torrentu + + + + Display torrent content and some options + Zobrazit obsah torrentu a některé volby + + + + Do not start download automatically + The torrent will be added to download list in pause state + Nespouštět stahování automaticky + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Sledování adresářů + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Dvojité kliknutí v seznamu přenosů + + + + Download list: + Seznam stahování: + + + + + Start/Stop + Start/Stop + + + + + Open folder + Otevřít adresář + + + + + Show properties + Zobrazit vlastnosti + + + + Seeding list: + Seznam seedů: + + + + Download folder: + Adresář pro stahování: + + + + Temp folder: + Dočasný adresář: + + + + Automatically download torrents present in this folder: + Automaticky stahovat torrenty v tomto adresáři: + + + + Listening port + Naslouchat na portu + + + to + i.e: 1200 to 1300 + + + + + Enable UPnP port mapping + Zapnout mapování portů UPnP + + + + Enable NAT-PMP port mapping + Zapnout mapování portů NAT-PMP + + + + Global bandwidth limiting + Celkový limit pásma + + + + Upload: + Vysílání: + + + + Download: + Stahování: + + + + Bittorrent features + Vlastnosti bittorrentu + + + + Use the same port for DHT and Bittorrent + Použít stejný port pro DHT i bittorrent + + + + DHT port: + Port DHT: + + + + Spoof µtorrent to avoid ban (requires restart) + Předstírat µtorrent a vyhnout se zákazu (vyžaduje restart) + + + + + Type: + Typ: + + + + + (None) + (Žádný) + + + + + Proxy: + Proxy: + + + + + + Username: + Uživatelské jméno: + + + + Bittorrent + Bittorrent + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Akce po dvojitém kliknutí + + + + Port used for incoming connections: + Port použitý pro příchozí spojení: + + + + Random + Náhodný + + + + Connections limit + Limit spojení + + + + Global maximum number of connections: + Celkový maximální počet spojení: + + + + Maximum number of connections per torrent: + Maximální počet spojení na torrent: + + + + Maximum number of upload slots per torrent: + Maximální počet slotů pro nahrávání na torrent: + + + Additional Bittorrent features + Další vlastnosti Bittorrentu + + + + Enable DHT network (decentralized) + Zapnout DHT síť (decentralizovaná) + + + Enable Peer eXchange (PeX) + Zapnout Peer eXchange (PeX) + + + + Enable Local Peer Discovery + Zapnout Local Peer Discovery + + + + Encryption: + Šifrování: + + + + Share ratio settings + Nastavení poměru sdílení + + + + Desired ratio: + Požadovaný poměr: + + + + Filter file path: + Cesta k souboru filtrů: + + + + transfer lists refresh interval: + Interval obnovování seznamu přenosů: + + + + ms + ms + + + Misc + Různé + + + + + RSS + RSS + + + + RSS feeds refresh interval: + Interval obnovování RSS kanálů: + + + + minutes + minut + + + + Maximum number of articles per feed: + Maximální počet článků na kanál: + + + + File system + Souborový systém + + + + Remove finished torrents when their ratio reaches: + Odstranit dokončené torrenty, když jejich poměr dosáhne: + + + + System default + Standardní nastavení + + + + Start minimized + Spustit minimalizovaně + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Akce po dvojitém kliknutí v seznamu přenosů + + + In download list: + V seznamu stahování: + + + Pause/Start torrent + Pozastavit/Spustit torrent + + + Open destination folder + Otevřít cílový adresář + + + Display torrent properties + Zobrazit vlastnosti torrentu + + + In seeding list: + V seznamu seedů: + + + Folder scan interval: + Interval kontroly adresáře: + + + seconds + sekund + + + Spoof Azureus to avoid ban (requires restart) + Klamat Azureus abychom se vyhnuli blokování (vyžaduje restart) + + + + Web UI + Webové rozhraní + + + + Enable Web User Interface + Zapnout webové rozhraní + + + + HTTP Server + HTTP Server + + + + Enable RSS support + Zapnout podporu RSS + + + + RSS settings + Nastavení RSS + + + + Enable queueing system + Zapnout systém zařazování do fronty + + + + Maximum active downloads: + Maximální počet současně stahovaných torrentů: + + + + Torrent queueing + Řazení torrentů do fronty + + + + Maximum active torrents: + Maximální počet aktivních torrentů: + + + + Display top toolbar + Zobrazit horní panel nástrojů + + + + Proxy + Proxy + + + + Search engine proxy settings + Nastvení proxy pro vyhledávače + + + + Bittorrent proxy settings + Nastavení proxy pro bittorrent + + + + Maximum active uploads: + Max. počet aktivních nahrávání: + + + + DownloadingTorrents + + + Name + i.e: file name + Název + + + + Size + i.e: file size + Velikost + + + + Progress + i.e: % downloaded + Průběh + + + + DL Speed + i.e: Download speed + Rychlost stahování + + + + UP Speed + i.e: Upload speed + Rychlost nahrávání + + + + Seeds/Leechers + i.e: full/partial sources + Seedeři/Leecheři + + + Seeds/Leechs + i.e: full/partial sources + Seedeři/Leecheři + + + + Ratio + Poměr + + + + ETA + i.e: Estimated Time of Arrival / Time left + Odh. čas + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 spuštěn. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>byl zablokován</i> + + + Fast resume data was rejected for torrent %1, checking again... + Rychlé obnovení torrentu %1 bylo odmítnuto, zkouším znovu... + + + Url seed lookup failed for url: %1, message: %2 + Vyhledání URL seedu selhalo pro URL: %1, zpráva: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' přidán do seznamu stahování. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' obnoven. (rychlé obnovení) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' už je v seznamu stahování. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nelze dekódovat soubor torrentu: '%1' + + + This file is either corrupted or this isn't a torrent. + Tento soubor je buď poškozen, nebo to není soubor torrentu. + + + Couldn't listen on any of the given ports. + Nelze naslouchat na žádném z udaných portů. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Stahuji '%1', prosím čekejte... + + + + Hide or Show Column + Zobrazit či skrýt sloupec + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Namapování portů selhalo, zpráva: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Namapování portů bylo úspěšné, zpráva: %1 + + + Priority + Priorita + + + + FeedDownloader + + + RSS Feed downloader + Stáhnout z RSS kanálů + + + + RSS feed: + RSS kanál: + + + + Feed name + Název kanálu + + + + Automatically download torrents from this feed + Automaticky stahovat torrenty z tohoto kanálu + + + + Download filters + Filtry stahování + + + + Filters: + Filtry: + + + + Filter settings + Nastavení filtrů + + + + Matches: + Shody: + + + + Does not match: + Neshoduje se: + + + + Destination folder: + Cílový adresář: + + + + ... + ... + + + + Filter testing + Test filtru + + + + Torrent title: + Název torrentu: + + + + Result: + Výsledek: + + + + Test + Test + + + + Import... + Import... + + + + Export... + Export... + + + + + Rename filter + Přejmenovat filtr + + + + + Remove filter + Odstranit filter + + + + Add filter + Přidat filter + + + + FeedDownloaderDlg + + + New filter + Nový filtr + + + + Please choose a name for this filter + Vyberte název pro tento filter + + + + Filter name: + Název filtru: + + + + + + Invalid filter name + Neplatný název filtru + + + + The filter name cannot be left empty. + Název filtru nesmí být prázdný. + + + + + This filter name is already in use. + Tento název filtru již existuje. + + + + Filter testing error + Chyba testu filtru + + + + Please specify a test torrent name. + Prosím zadejte název torrentu pro test. + + + + matches + shody + + + + does not match + neshoduje se + + + + Select file to import + Označit soubory k importu + + + + + Filters Files + Soubory s filtry + + + + Import successful + Import úspěšný + + + + Filters import was successful. + Import filtrů nebyl úspěšný. + + + + Import failure + Import selhal + + + + Filters could not be imported due to an I/O error. + Filtry nemohou být importovány kvůli chybě I/O. + + + + Select destination file + Vybrat cílový soubor + + + + Overwriting confirmation + Potvrzení o přepsání + + + + Are you sure you want to overwrite existing file? + Jste si jist, že chcete přepsat existující soubor? + + + + Export successful + Export byl úspěšný + + + + Filters export was successful. + Export filtrů byl úspěšný. + + + + Export failure + Export selhal + + + + Filters could not be exported due to an I/O error. + Filtry nemohou být exportovány kvůli chybě I/O. + + + + FeedList + + + Unread + Nepřečtené + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Chyba I/O + + + + + + Couldn't open %1 in read mode. + Nelze přečíst %1 . + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 není platný soubor PeerGuardian P2B. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + + Name + i.e: file name + Název + + + + Size + i.e: file size + Velikost + + + + UP Speed + i.e: Upload speed + Rychlost nahrávání + + + + Seeds / Leechers + Seedeři/Leecheři + + + + Connected peers + Připojené protějšky + + + + Total uploaded + i.e: Total amount of uploaded data + Celkově nahráno + + + + Ratio + Poměr + + + Leechers + i.e: full/partial sources + Leecheři + + + + Hide or Show Column + Zobrazit či skrýt sloupec + + + Incomplete torrent in seeding list + Neúplný torrent v seznamu seedovaných + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Zdá se, že stav torrentu '%1' se změnil ze 'seedování' na ''stahování. Chceš ho přesunout zpět do seznamu stahování? (jinak bude prostě smazán) + + + Priority + Priorita + + + + GUI + + + Open Torrent Files + Otevřít torrent soubory + + + + + + + + &Yes + &Ano + + + + + + + + &No + &Ne + + + + Are you sure you want to delete the selected item(s) in download list? + Jste si jist, že chcete smazat vybrané položky ze seznamu stahování? + + + + Torrent Files + Torrent soubory + + + + + + + Are you sure? -- qBittorrent + Jste si jist? -- qBittorrent + + + + Download finished + Stahování dokončeno + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Stav připojení: + + + Offline + Offline + + + No peers found... + Nebyly nalezeny žádné peery... + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Rychlost stahování: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Rychlost nahrávání: %1 KiB/s + + + + Are you sure you want to quit? + Opravdu ukončit program? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' byl odstraněn. + + + All downloads were paused. + Veškeré stahování bylo pozastaveno. + + + '%1' paused. + xxx.avi paused. + '%1' pozastaven. + + + All downloads were resumed. + Veškeré stahování bylo obnoveno. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' obnoven. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + Stahování %1 bylo dokončeno. + + + + I/O Error + i.e: Input/Output Error + Chyba I/O + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Nastala chyba při pokusu o čtení či zápis %1. Disk je provděpodobně plný, stahování bylo pozastaveno + + + + Connection Status: + Stav připojení: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Za firewalem? + + + No incoming connections... + Žádná příchozí spojení... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Nastala chyba (plný disk?), '%1' pozastaven. + + + + Search + Hledat + + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent se váže na port: %1 + + + DHT support [ON], port: %1 + Podpora DHT [ZAP], port: %1 + + + + + DHT support [OFF] + Podpora DHT [VYP] + + + + PeX support [ON] + Podpora PeX [ZAP] + + + PeX support [OFF] + Podpora PeX [VYP] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Seznam stahování není prázdný. +Opravdu chcete ukončit qBittorrent? + + + + + Downloads + Stahování + + + + Finished + Dokončeno + + + + Are you sure you want to delete the selected item(s) in finished list? + Jste si jist, že chcete smazat vybrané položky ze seznamu dokončených? + + + + UPnP support [ON] + Podpora UPnP [ZAP] + + + + Encryption support [ON] + Podpora šifrování [ZAP] + + + + Encryption support [FORCED] + Podpora šifrování [VYNUCENO] + + + + Encryption support [OFF] + Podpora šifrování [VYP] + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Došlo k chybě I/O u torrentu %1. + Důvod: %2 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Chyba stahování URL + + + + Couldn't download file at url: %1, reason: %2. + Nemohu stáhnout soubor na URL: %1, důvod: %2. + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Jste si jist, že chcete smazat vybrané položky ze seznamu stahování a pevného disku? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Jste si jist, že chcete smazat vybrané položky ze seznamu dokončených a pevného disku? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' byl trvale odstraněn. + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent naslouchá na portu: TCP/%1 + + + + UPnP support [OFF] + Podpora UPnP [VYP] + + + + NAT-PMP support [ON] + Podpora NAT-PMP [ZAP] + + + + NAT-PMP support [OFF] + Podpora NAT-PMP [VYP] + + + + DHT support [ON], port: UDP/%1 + Podpora DHT [ZAP], port: UDP/%1 + + + + Local Peer Discovery [ON] + Local Peer Discovery [ZAP] + + + + Local Peer Discovery support [OFF] + Podpora Local Peer Discovery [VYP] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' byl odstraněn protože jeho poměr dosáhl nastaveného maxima. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Stahování: %2KiB/s, Nahrávání: %3KiB/s) + + + + + DL: %1 KiB/s + Stahování: %1 KiB/s + + + + + UP: %1 KiB/s + Nahrávání: %1 KiB/s + + + + + Ratio: %1 + Poměr: %1 + + + + + DHT: %1 nodes + DHT: %1 uzlů + + + + + No direct connections. This may indicate network configuration problems. + Žádná přímá spojení. To může značit problémy s nastavením sítě. + + + + Uploads + Nahrávání + + + + Options were saved successfully. + Nastavení bylo úspěšně uloženo. + + + + MainWindow + + + &Edit + Ú&pravy + + + + &File + &Soubor + + + + &Help + Nápo&věda + + + + Open + Otevřít + + + + Exit + Konec + + + + Preferences + Nastavení + + + + About + O aplikaci + + + + Start + Spustit + + + + Pause + Pozastavit + + + + Delete + Smazat + + + + Pause All + Pozastavit vše + + + + Start All + Spustit vše + + + + Torrent Properties + Vlastnosti torrentu + + + + Download from URL + Stáhnout z URL + + + + Create torrent + Vytvořit torrent + + + + Preview file + Náhled souboru + + + + Clear log + Vyprázdnit log + + + + Delete Permanently + Trvale smazat + + + + Visit website + Navštívit webovou stránku + + + + Report a bug + Nahlásit chybu + + + + Set upload limit + Nastavit limit nahrávání + + + + Set download limit + Nastavit limit stahování + + + + Documentation + Dokumentace + + + + Set global download limit + Nastavit celkový limit stahování + + + + Set global upload limit + Nastavit celkový limit nahrávání + + + + Options + Možnosti + + + + Decrease priority + Snížit prioritu + + + + Increase priority + Zvýšit prioritu + + + + Console + Konzole + + + + PropListDelegate + + + + Ignored + Ignorovat + + + + + + Normal + Normal (priority) + Normální + + + + + High + High (priority) + Vysoká + + + + + Maximum + Maximum (priority) + Maximální + + + + RSS + + + Search + Hledat + + + + + New subscription + Nové přihlášení k odběru + + + + + + Mark items read + Označit jako přečtené + + + + Update all + Aktualizovat vše + + + 1 + 1 + + + + Feed URL + URL kanálu + + + + + Update + Aktualizovat + + + + New folder + Nový adresář + + + + RSS feeds + RSS kanály + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrenty:</span> <span style=" font-style:italic;">(dvojité kliknutí pro stažení)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Aktualizovat všechny kanály + + + + + Delete + Smazat + + + + + Rename + Přejmenovat + + + Refresh + Obnovit + + + + Download torrent + Stáhnout torrent + + + + Open news URL + Otevřít URL s novinkami + + + + Copy feed URL + Kopírovat URL kanálu + + + + RSS feed downloader + Stáhnout z RSS kanálů + + + Delete selected streams + Smazat vybrané kanály + + + + Refresh RSS streams + Obnovit RSS kanály + + + Add a new RSS stream + Přidat nový RSS kanál + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Novinky:</b> <i>(dvojitým kliknutím otevřete odkaz ve webovém prohlížeči)</i> + + + Add RSS stream + Přidat RSS kanál + + + Refresh all streams + Obnovit všechny kanály + + + RSS streams: + RSS kanály: + + + 2 + 2 + + + Mark all as read + Označit vše jako přečtené + + + + RSSImp + + + Please type a rss stream url + Prosím napište URL RSS kanálu + + + + Stream URL: + URL kanálu: + + + Please choose a new name for this stream + Prosím zvolte nový název pro tento kanál + + + New stream name: + Nový název kanálu: + + + + + Are you sure? -- qBittorrent + Jste si jist? -- qBittorrent + + + + + &Yes + &Ano + + + + + &No + &Ne + + + Are you sure you want to delete this stream from the list? + Jste si jist, že chcete smazat tento kanál ze seznamu? + + + Description: + Popis: + + + url: + URL: + + + Last refresh: + Poslední obnova: + + + + Please choose a folder name + Prosím vyberte název adresáře + + + + Folder name: + Název adresáře: + + + + New folder + Nový adresář + + + + Overwrite attempt + Pokus o přepsání + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Nelze přepsat %1. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Tento RSS kanál už v seznamu existuje. + + + + Are you sure you want to delete these elements from the list? + Jste si jist, že chcete smazat tyto prvky ze seznamu? + + + + Are you sure you want to delete this element from the list? + Jste si jist, že chcete smazat tento prvek ze seznamu? + + + + Please choose a new name for this RSS feed + Prosím vyberte nový název pro tento RSS kanál + + + + New feed name: + Název nového kanálu: + + + + Name already in use + Název je již používán + + + + This name is already used by another item, please choose another one. + Tento název již používá jiná položka, vyberte prosím jiný. + + + + Date: + Datum: + + + + Author: + Autor: + + + + Unread + Nepřečtené + + + + RssItem + + + No description available + Popis není k dispozici + + + + RssStream + + %1 ago + 10min ago + Před %1 + + + + Automatically downloading %1 torrent from %2 RSS feed... + Automaticky stahovat %1 torrent z %2 RSS kanálu... + + + Never + Nikdy + + + + SearchCategories + + + All categories + Všechny kategorie + + + + Movies + Filmy + + + + TV shows + TV seriály + + + + Music + Hudba + + + + Games + Hry + + + + Anime + Anime + + + + Software + Software + + + + Pictures + Obrázky + + + + Books + Knihy + + + + SearchEngine + + + Cut + Vyjmout + + + + Copy + Kopírovat + + + + Paste + Vložit + + + + Clear field + Vyprázdnit pole + + + + Clear completion history + Vymazat historii + + + + Empty search pattern + Prázdný hledaný řetězec + + + + Please type a search pattern first + Nejdříve prosím napište hledaný řetězec + + + + + Results + Výsledky + + + + Searching... + Hledám... + + + + Search Engine + Vyhledávač + + + + + Search has finished + Hledání ukončeno + + + + An error occured during search... + Během hledání nastala chyba... + + + + Search aborted + Hledání přerušeno + + + + Search returned no results + Nebyly nalezeny žádné výsledky + + + + Results + i.e: Search results + Výsledky + + + + + Unknown + Neznámý + + + + SearchTab + + + Name + i.e: file name + Název + + + + Size + i.e: file size + Velikost + + + + Seeders + i.e: Number of full sources + Seedeři + + + + Leechers + i.e: Number of partial sources + Leecheři + + + + Search engine + Vyhledávač + + + + TrackersAdditionDlg + + + Trackers addition dialog + Dialog pro přidání torrentu + + + + List of trackers to add (one per line): + Seznam trackerů pro přidání (jeden na řádek): + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Chtěl bych poděkovat následujícím lidem, kteří dobrovolně přeložili qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontaktujte mě, prosím, pokud byste chtěli přeložit qBittorrent do svého jazyka. + + + + addTorrentDialog + + + Torrent addition dialog + Dialog pro přidání torrentu + + + + Save path: + Uložit do: + + + + ... + ... + + + + Torrent size: + Velikost torrentu: + + + + + Unknown + Neznámý + + + + Free disk space: + Volné místo na disku: + + + + Torrent content: + Obsah torrentu: + + + + Download in sequential order (slower but good for previewing) + Stahovat v sekvenčním pořadí (pomalejší, ale dobré pro náhled) + + + Download in correct order (slower but good for previewing) + Stahovat ve správném pořadí (pomalejší, ale dobré pro náhled) + + + + Add to download list in paused state + Přidat do seznamu stahování jako pozastavené + + + + Add + Přidat + + + + Cancel + Zrušit + + + + Ignored + Ignorovat + + + + Normal + Normální + + + + High + Vysoká + + + + Maximum + Maximální + + + + Collapse all + Sbalit vše + + + + Expand all + Rozbalit vše + + + + authentication + + + + Tracker authentication + Tracker - ověření + + + + Tracker: + Tracker: + + + + Login + Přihlášení + + + + Username: + Uživatelské jméno: + + + + Password: + Heslo: + + + + Log in + Přihlásit se + + + + Cancel + Zrušit + + + + bandwidth_dlg + + + Bandwidth allocation + Přidělení pásma + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + '%1' - poměr dosáhl nastaveného maxima. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' byl trvale odstraněn. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' byl odstraněn. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' pozastaven. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' obnoven. + + + + '%1' is not a valid magnet URI. + '%1' není platný magnet URI. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' už je v seznamu stahování. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' obnoven. (rychlé obnovení) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' přidán do seznamu stahování. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nelze dekódovat soubor torrentu: '%1' + + + + This file is either corrupted or this isn't a torrent. + Tento soubor je buď poškozen, nebo to není soubor torrentu. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>byl zablokován kvůli filtru IP</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>byl zakázán kvůli poškozeným částem</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Rekurzivní stahování souboru %1 vloženého v torrentu %2 + + + + Unable to decode %1 torrent file. + Nelze dekódovat soubor torrentu %1. + + + + Couldn't listen on any of the given ports. + Nelze naslouchat na žádném z udaných portů. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Namapování portů selhalo, zpráva: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Namapování portů bylo úspěšné, zpráva: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Rychlé obnovení torrentu %1 bylo odmítnuto, zkouším znovu... + + + + Url seed lookup failed for url: %1, message: %2 + Vyhledání URL seedu selhalo pro URL: %1, zpráva: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Stahuji '%1', prosím čekejte... + + + + createTorrentDialog + + + Cancel + Zrušit + + + + Torrent Creation Tool + Nástroj pro vytváření torrentů + + + + Torrent file creation + Vytvořit soubor torrentu + + + + Add file + Přidat soubor + + + + Add folder + Přidat adresář + + + + Announce urls (trackers): + Oznamovací URL (trackery): + + + + Comment (optional): + Komentář (nepovinné): + + + + Web seeds urls (optional): + URL webových seedů (nepovinné): + + + + File or folder to add to the torrent: + Soubor nebo adresář pro přidání do torrentu: + + + Add a file + Přidat soubor + + + Add a folder + Přidat adresář + + + + Piece size: + Velikost části: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Soukromý (je-li zapnuto, nebude šířen na síti DHT) + + + + Start seeding after creation + Po vytvoření začít seedovat + + + + Create and save... + Vytvořit a uložit... + + + + Progress: + Průběh: + + + + createtorrent + + + Select destination torrent file + Vybrat cílový torrent soubor + + + + Torrent Files + Torrent soubory + + + + No input path set + Nebyla zadaná vstupní cesta + + + + Please type an input path first + Nejdříve prosím zadejte vstupní cestu + + + + + + Torrent creation + Vytvoření torrentu + + + + Torrent was created successfully: + Torrent byl úspěšně vytvořen: + + + + Select a folder to add to the torrent + Vyberte adresář pro přidání do torrentu + + + + Please type an announce URL + Prosím napište oznamovací URL + + + + Torrent creation was unsuccessful, reason: %1 + Vytvoření torrentu selhalo, důvod: %1 + + + + Announce URL: + Tracker URL + Oznamovací URL: + + + + Please type a web seed url + Prosím napište URL webových seedů + + + + Web seed URL: + URL webových seedů: + + + + Select a file to add to the torrent + Vyberte soubor pro přidání do torrentu + + + No tracker path set + Nebyla zadána cesta k trackeru + + + Please set at least one tracker + Prosím nastavte alespoň jeden tracker + + + + Created torrent file is invalid. It won't be added to download list. + Vytvořený torrent soubor je špatný. Nebude přidán do seznamu stahování. + + + + downloadFromURL + + + Download Torrents from URLs + Stahovat torrenty z URL + + + + Only one URL per line + Jen jeden torrent na řádek + + + + Download + Stáhnout + + + + Cancel + Zrušit + + + + Download from urls + Stahovat z URL + + + + No URL entered + Nebylo vloženo žádné URL + + + + Please type at least one URL. + Prosím napište alespoň jedno URL. + + + + downloading + + + Search + Hledat + + + Log + Log + + + IP filter + IP filtr + + + + Start + Spustit + + + + Pause + Pozastavit + + + + Delete + Smazat + + + Clear + Vyčistit + + + + Preview file + Náhled souboru + + + + Set upload limit + Nastavit limit nahrávání + + + + Set download limit + Nastavit limit stahování + + + + Delete Permanently + Trvale smazat + + + + Torrent Properties + Vlastnosti torrentu + + + + Open destination folder + Otevřít cílový adresář + + + + Name + Název + + + + Size + Velikost + + + + Progress + Průběh + + + + DLSpeed + Rychlost stahování + + + + UpSpeed + Rychlost nahrávání + + + + Seeds/Leechs + Seedeři/Leecheři + + + + Ratio + Poměr + + + + ETA + Odh. čas + + + + Buy it + Koupit + + + + Priority + Priorita + + + + Increase priority + Zvýšit prioritu + + + + Decrease priority + Snížit prioritu + + + + Force recheck + Překontrolovat platnost + + + + Copy magnet link + Kopírovat odkaz magnet + + + + engineSelect + + + Search plugins + Hledat zásuvné moduly + + + + Installed search engines: + Nainstalované vyhledávače: + + + + Name + Název + + + + Url + URL + + + + Enabled + Zapnuto + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Nové vyhledávače můžete získat zde: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Nainstalovat nový + + + + Check for updates + Zkontrolovat aktualizace + + + + Close + Zavřít + + + + Enable + Zapnout + + + + Disable + Vypnout + + + + Uninstall + Odinstalovat + + + + engineSelectDlg + + True + Ano + + + False + Ne + + + + Uninstall warning + Upozornění na odstranění + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Některé zásuvné moduly nelze odstranit, protože jsou součástí qBittorrent. +Můžete odstranit pouze moduly, které jste sám přidal. +Nicméně, tyto moduly byly vypnuty. + + + + Uninstall success + Odstranění bylo úspěšné + + + + Select search plugins + Vybrat vyhledávače + + + + + qBittorrent search plugins + qBittorrent - vyhledávače + + + + + + + + + + + Search plugin install + Nainstalovat vyhledávač + + + + + + Yes + Ano + + + + + + + No + Ne + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + V systému je již nainstalována novější verze vyhledávače %1. + + + + + + + + Search plugin update + Aktualizovat vyhledávač + + + + + Sorry, update server is temporarily unavailable. + Omlouvám se, server s aktualizacemi je dočasně nedostupný. + + + + All your plugins are already up to date. + Všechny zásuvné moduly jsou aktuální. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Vyhledávač %1 nelze aktualizovat, ponechávám starou verzi. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Vyhledávač %1 nelze nainstalovat. + + + + All selected plugins were uninstalled successfully + Všechny zásuvné moduly byly úspěšně odstraněny + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Vyhledávač %1 byl úspěšně aktualizován. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Vyhledávač %1 byl úspěšně nainstalován. + + + + Search engine plugin archive could not be read. + Nelze přečíst zásuvný modul vyhledávače. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Omlouvám se, instalace vyhledávače %1 selhala. + + + + New search engine plugin URL + URL nového zásuvného modulu + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + + Unknown + Unknown (size) + Neznámý + + + + < 1m + < 1 minute + < 1m + + + + %1m + e.g: 10minutes + %1m + + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options were saved successfully. + Nastavení bylo úspěšně uloženo. + + + + + Choose scan directory + Vyberte adresář ke sledování + + + + + Choose a save directory + Vyberte adresář pro ukládání + + + + + Choose an ip filter file + Vyberte soubor IP filtrů + + + + + Filters + Filtry + + + + pluginSourceDlg + + + Plugin source + Zdroj zásuvného modulu + + + + Search plugin source: + Hledat zdroj zásuvného modulu: + + + + Local file + Místní soubor + + + + Web link + Webový odkaz + + + + preview + + + Preview selection + Výběr náhledu + + + + File preview + Náhled souboru + + + + The following files support previewing, <br>please select one of them: + Následující soubory podporují náhled, <br>vyberte prosím jeden z nich: + + + + Preview + Náhled + + + + Cancel + Zrušit + + + + previewSelect + + + + Preview impossible + Náhled není možný + + + + + Sorry, we can't preview this file + Je nám líto, nelze zobrazit náhled tohoto souboru + + + + Name + Název + + + + Size + Velikost + + + + Progress + Průběh + + + + properties + + + Torrent Properties + Vlastnosti torrentu + + + + OK + OK + + + + Files contained in current torrent: + Soubory obsažené v aktuálním torrentu: + + + + Size + Velikost + + + + Trackers: + Trackery: + + + + + None - Unreachable? + Žádné - nedostupné? + + + + Progress + Průběh + + + Main infos + Hlavní informace + + + + Current tracker: + Aktuální tracker: + + + + Total uploaded: + Celkově nahráno: + + + + Main info + Základní informace + + + + Torrent information + Informace o torrentu + + + + Total downloaded: + Celkově staženo: + + + + Total failed: + Celkově selhalo: + + + + Torrent content + Obsah torrentu + + + + Download in correct order (slower but good for previewing) + Stahovat ve správném pořadí (pomalejší, ale dobré pro náhled) + + + + Save path: + Uložit do: + + + Torrent infos + Informace o torrentu + + + + Creator: + Tvůrce: + + + + Torrent hash: + Kontrolní součet (hash) torrentu: + + + + Comment: + Komentář: + + + + Current session + Současná relace + + + + Share ratio: + Poměr sdílení: + + + + Trackers + Trackery + + + + Priorities: + Priority: + + + + Normal: normal priority. Download order is dependent on availability + Normální: normální priorita. Pořadí stahování záleží na dostupnosti + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Vysoká: vyšší než normální priorita. Části mají přednost před částmi se stejnou dostupností, ale ne před částmi s dostupností nižší + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximální: maximální priorita, na dostupnost se nebere ohled, část je upřednostněna před částmi s nižší prioritou + + + + File name + Název souboru + + + + + Priority + Priorita + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + Seznam trackerů nesmí být prázdný. + + + + Ignored: file is not downloaded at all + Ignorovat: soubor se vůbec nestahuje + + + + Ignored + Ignorovat + + + + Normal + Normální + + + + Maximum + Maximální + + + + High + Vysoká + + + + Unknown + Neznámý + + + + Url seeds + URL seedy + + + + New url seed: + Nový URL seed: + + + + This url seed is already in the list. + Tento URL seed už v seznamu existuje. + + + + New url seed + New HTTP source + Nový URL seed + + + + The following url seeds are available for this torrent: + Následující URL seedy jsou k dispozici pro tento torrent: + + + + Priorities error + Chyba priorit + + + + Error, you can't filter all the files in a torrent. + Chyba, nemůžete v torrentu filtrovat všechny soubory. + + + + Downloaded pieces + Stažené části + + + + Collapse all + Sbalit vše + + + + Expand all + Rozbalit vše + + + + ... + ... + + + + + Choose save path + Vyberte cestu pro uložení + + + + Save path creation error + Chyba při vytváření cesty pro uložení + + + + Could not create the save path + Nemohu vytvořit cestu pro uložení + + + + search_engine + + + + Search + Hledat + + + Search Pattern: + Hledaný řetězec: + + + Stop + Zastavit + + + + Status: + Status: + + + + Stopped + Zastaveno + + + + Download + Stáhnout + + + + Search engines... + Vyhledávače... + + + + seeding + + + Search + Hledat + + + The following torrents are finished and shared: + Následující torrenty jsou dokončeny a sdíleny: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Poznámka:</u> Pro dobro sítě je důležité, abyste torrent sdílel i po dokončení stahování. + + + + Start + Spustit + + + + Pause + Pozastavit + + + + Delete + Smazat + + + + Delete Permanently + Trvale smazat + + + + Torrent Properties + Vlastnosti torrentu + + + + Preview file + Náhled souboru + + + + Set upload limit + Nastavit limit nahrávání + + + + Open destination folder + Otevřít cílový adresář + + + + Name + Název + + + + Size + Velikost + + + + Upload Speed + Rychlost nahrávání + + + + + Connected peers + Připojené protějšky + + + + + Seeds / Leechers + Seedeři / Leecheři + + + + Copy magnet link + Kopírovat magnet odkaz + + + Leechers + Leecheři + + + + Ratio + Poměr + + + + Buy it + Koupit + + + + Total uploaded + Celkově nahráno + + + Priority + Priorita + + + Increase priority + Zvýšit prioritu + + + Decrease priority + Snížit prioritu + + + + Force recheck + Překontrolovat platnost + + + + subDownloadThread + + + Host is unreachable + Hostitel je nedostupný + + + + File was not found (404) + Soubor nenalezen (404) + + + + Connection was denied + Spojení bylo odepřeno + + + + Url is invalid + URL je neplatné + + + + Connection failure + Chyba spojení + + + + Connection was timed out + Spojení vypršelo + + + + Incorrect network interface + Nesprávné síťové rozhraní + + + + Unknown error + Neznámá chyba + + + + I/O Error + Chyba I/O + + + + Could not resolve proxy + Nemohu přeložit adresu proxy + + + + torrentAdditionDialog + + + + Unable to decode torrent file: + Nelze dekódovat soubor torrentu: + + + This file is either corrupted or this isn't a torrent. + Tento soubor je buď poškozen, nebo to není soubor torrentu. + + + Unknown + Neznámý + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 zbývá po stažení torrentu) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 nebo více je potřeba pro stažení) + + + + + Choose save path + Vyberte cestu pro uložení + + + + Empty save path + Prázdná cesta pro uložení + + + + Please enter a save path + Vložte prosím cestu pro uložení + + + + Save path creation error + Chyba při vytváření cesty pro uložení + + + + Could not create the save path + Nemohu vytvořit cestu pro uložení + + + + Invalid file selection + Neplatný výběr souboru + + + + You must select at least one file in the torrent + Musíte v torrentu vybrat alespoň jeden soubor + + + + File name + Název souboru + + + + Size + Velikost + + + + Progress + Průběh + + + + + Priority + Priorita + + + diff --git a/src/lang/qbittorrent_da.qm b/src/lang/qbittorrent_da.qm new file mode 100644 index 0000000000000000000000000000000000000000..d9cba79c35aab186b68853b462a909556d203191 GIT binary patch literal 20145 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_da.ts b/src/lang/qbittorrent_da.ts new file mode 100644 index 000000000..76dd97151 --- /dev/null +++ b/src/lang/qbittorrent_da.ts @@ -0,0 +1,4577 @@ + + + + + AboutDlg + + + About qBittorrent + Om qBittorrent + + + + About + Om + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Author + Skaber + + + + Name: + Navn: + + + + Country: + Land: + + + + E-mail: + E-mail: + + + + Home page: + Hjemmeside: + + + + Christophe Dumez + Christophe Dumez + + + + France + Frankrig + + + Thanks To + Tak Til + + + + Translation + Oversættelse + + + + License + Licens + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + En C++ programmeret bittorrent klient der gør brug af Qt4 og libtorrent.<br><br>Copyright © 2006 af Christophe Dumez<br><br> <u>Webside:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + Født: + + + + Occupation: + Beskæftigelse: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Studerer "computer science" + + + + Thanks to + + + + + BandwidthAllocationDialog + + + Upload limit: + + + + + Download limit: + + + + + + + + Unlimited + Unlimited (bandwidth) + + + + + KiB/s + KB/s + + + + ConsoleDlg + + + qBittorrent console + + + + + General + + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + KB/s + + + + Dialog + + Options -- qBittorrent + Indstillinger -- qBittorrent + + + Options + Indstillinger + + + Main + Generelle + + + Save Path: + Destination: + + + Download Limit: + Begræns download til: + + + Upload Limit: + Begræns upload til: + + + Max Connects: + Max forbindelser: + + + Port range: + Porte: + + + ... + ... + + + Disable + Slå fra + + + connections + forbindelser + + + + Proxy + Proxy + + + Proxy Settings + Proxy indstillinger + + + Server IP: + Server IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Port: + + + Proxy server requires authentication + Proxy serveren kræver godkendelse + + + + + + Authentication + Godkendelse + + + User Name: + Brugernavn: + + + + + + Password: + Kodeord: + + + Enable connection through a proxy server + Opret forbindelse gennem en proxy server + + + OK + OK + + + Cancel + Annuller + + + Scanned Dir: + Scannet mappe: + + + Enable directory scan (auto add torrent files inside) + Tilkobl scanning af mappe (auto starter fundne torrent filer) + + + Connection Settings + Forbindelses Indstillinger + + + Share ratio: + Delingsforhold: + + + + Activate IP Filtering + Aktiver IP Filtrering + + + + Filter Settings + Filter Indstillinger + + + Start IP + Fra IP + + + End IP + Til IP + + + Origin + Oprindelse + + + Comment + Kommentar + + + Apply + Anvend + + + + IP Filter + IP Filter + + + Add Range + Tilføj Adresser + + + Remove Range + Fjern Adresser + + + ipfilter.dat Path: + Sti til ipfilter.dat: + + + Ask for confirmation on exit + Spørg før lukning + + + Go to systray when minimizing window + Minimer til systray + + + Misc + Diverse + + + Localization + Lokal-indstillinger + + + + Language: + Sprog: + + + Behaviour + Opførsel + + + + + KiB/s + KB/s + + + 1 KiB DL = + 1 KB DL = + + + KiB UP max. + KB UP maks. + + + Automatically clear finished downloads + Fjern automatisk færdige downloads + + + Preview program + Smugkig program + + + Audio/Video player: + Medieafspiller: + + + Systray Messages + Systray Meddelelser + + + Always display systray messages + Vis altid systray meddelelser + + + Display systray messages only when window is hidden + Vis kun systray meddelelser når vinduet er skjult + + + Never display systray messages + Vis aldrig systray meddelelser + + + DHT configuration + DHT konfiguration + + + + DHT port: + DHT port: + + + Language + Sprog + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Bemærk:</b> Ændringer træder først i kraft efter genstart af qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Note til oversættere:</b> Hvis qBittorrent ikke er tilgængeligt på dit sprog, <br/>og du skulle have lyst til at oversætte det til dit modersmål, <br/>kontakt mig da venligst, gerne på engelsk (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Vis dialogboksen for ny torrent når jeg tilføjer en + + + Default save path + Standart mappe + + + Disable DHT (Trackerless) + Afbryd DHT (Trackerless) + + + Disable Peer eXchange (PeX) + Afbryd Peer eXchange (PeX) + + + Go to systray when closing main window + Luk ikke, men minimer til systray + + + + Plastique style (KDE like) + + + + + CDE style (Common Desktop Environment like) + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Port used for incoming connections: + + + + + Random + + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + + + + + Use proxy for connections to trackers + + + + + Use proxy for connections to regular peers + + + + + Use proxy for connections to web seeds + + + + + Use proxy for DHT messages + + + + + Enabled + + + + + Forced + + + + + Disabled + + + + + Preferences + Indstillinger + + + + User interface settings + + + + + Visual style: + + + + + Cleanlooks style (Gnome like) + + + + + Motif style (Unix like) + + + + + Ask for confirmation on exit when download list is not empty + + + + + Display current speed in title bar + + + + + System tray icon + + + + + Disable system tray icon + + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + + + + + Minimize to tray + + + + + Show notification balloons in tray + + + + + Downloads + + + + + Pre-allocate all files + + + + + When adding a torrent + + + + + Display torrent content and some options + + + + + Do not start download automatically + The torrent will be added to download list in pause state + + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + + + + + Connection + + + + + Download list: + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + + + + + Listening port + + + + to + i.e: 1200 to 1300 + til + + + + Enable UPnP port mapping + + + + + Enable NAT-PMP port mapping + + + + + Global bandwidth limiting + + + + + Upload: + + + + + Download: + + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + + + + + + (None) + + + + + + Proxy: + + + + + + + Username: + Brugernavn: + + + + Bittorrent + + + + + UI + + + + + Connections limit + + + + + Global maximum number of connections: + + + + + Maximum number of connections per torrent: + + + + + Maximum number of upload slots per torrent: + + + + + Enable DHT network (decentralized) + + + + + Enable Local Peer Discovery + + + + + Encryption: + + + + + Share ratio settings + + + + + Desired ratio: + + + + + Filter file path: + + + + + transfer lists refresh interval: + + + + + ms + + + + + + RSS + + + + + RSS feeds refresh interval: + + + + + minutes + + + + + Maximum number of articles per feed: + + + + + File system + + + + + Remove finished torrents when their ratio reaches: + + + + + System default + + + + + Start minimized + + + + + Web UI + + + + + Enable Web User Interface + + + + + HTTP Server + + + + + Enable RSS support + + + + + RSS settings + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Torrent queueing + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Progress + i.e: % downloaded + Hentet + + + + DL Speed + i.e: Download speed + DL hastighed + + + + UP Speed + i.e: Upload speed + UP hastighed + + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + Seedere/Leechere + + + + Ratio + + + + + ETA + i.e: Estimated Time of Arrival / Time left + Tid Tilbage + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 startet. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' lagt til download listen. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' fortsat. (hurtig fortsættelse) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' findes allerede i download listen. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kan ikke dekode torrent filen: '%1' + + + This file is either corrupted or this isn't a torrent. + Denne fil er enten korrupt eller ikke en torrent. + + + Couldn't listen on any of the given ports. + Kunne ikke lytte på de opgivne porte. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Downloader '%1', vent venligst... + + + + Hide or Show Column + + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O Fejl + + + + + + Couldn't open %1 in read mode. + Kunne ikke åbne %1 til læsning. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + + KiB/s + KB/s + + + + FinishedTorrents + + Finished + Færdig + + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Seeds / Leechers + + + + + Connected peers + + + + Progress + i.e: % downloaded + Hentet + + + DL Speed + i.e: Download speed + DL hastighed + + + + UP Speed + i.e: Upload speed + UP hastighed + + + Seeds/Leechs + i.e: full/partial sources + Seedere/Leechere + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + Tid Tilbage + + + Finished + i.e: Torrent has finished downloading + Færdig + + + None + i.e: No error message + Intet + + + + Ratio + + + + Leechers + i.e: full/partial sources + Leechere + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Hide or Show Column + + + + + GUI + + + Open Torrent Files + Åbn Torrent Filer + + + This file is either corrupted or this isn't a torrent. + Denne fil er enten korrupt eller ikke en torrent. + + + + + + + + &Yes + &Ja + + + + + + + + &No + &Nej + + + + Are you sure you want to delete the selected item(s) in download list? + Er du sikker på at du vil slette det markerede fra download listen? + + + Connecting... + Forbinder... + + + Downloading... + Downloader... + + + + Torrent Files + Torrent Filer + + + + + + + Are you sure? -- qBittorrent + Er du sikker? -- qBittorrent + + + Couldn't listen on any of the given ports. + Kunne ikke lytte på de opgivne porte. + + + Empty search pattern + Tomt søge kriterie + + + Please type a search pattern first + Indtast venligst et søge kriterie først + + + You must select at least one search engine. + Du skal vælge mindst en søgemaskine. + + + Searching... + Søger... + + + An error occured during search... + Der opstod en fejl under søgningen... + + + Search aborted + Søgning afbrudt + + + Search returned no results + Søgningen gav intet resultat + + + Search plugin update -- qBittorrent + Søge plugin opdatering -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Søge plugin kan opdateres, ønsker du at opdatere det? + +Ændringslog: + + + + Sorry, update server is temporarily unavailable. + Beklager, opdaterings-serveren er midlertidigt utilgængelig. + + + Your search plugin is already up to date. + Dit søge plugin er allerede opdateret fuldt ud. + + + Results + Resultater + + + Status + Status + + + Search engine + Søgemaskine + + + Paused + Pauset + + + Preview process already running + Smugkig kører allerede + + + There is already another preview process running. +Please close the other one first. + En anden Smugkigs proces kører allerede. +Luk venglist denne først. + + + Transfers + Overførsler + + + + Download finished + Download afsluttet + + + Search Engine + Søgemaskine + + + Are you sure you want to quit qBittorrent? + Er du sikker på at du vil afslutte qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Er du sikker på at du vil slette de markerede elementer i download listen og på harddisken? + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Forbindelses status: + + + Offline + Offline + + + No peers found... + Ingen kilder fundet... + + + Name + i.e: file name + Navn + + + Size + i.e: file size + Størrelse + + + Progress + i.e: % downloaded + Hentet + + + DL Speed + i.e: Download speed + DL hastighed + + + UP Speed + i.e: Upload speed + UP hastighed + + + Seeds/Leechs + i.e: full/partial sources + Seedere/Leechere + + + ETA + i.e: Estimated Time of Arrival / Time left + Tid Tilbage + + + Seeders + i.e: Number of full sources + Seedere + + + Leechers + i.e: Number of partial sources + Leechere + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 startet. + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + DL hastighed: %1 KB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + UP hastighed: %1 KB/s + + + Finished + i.e: Torrent has finished downloading + Færdig + + + Checking... + i.e: Checking already downloaded parts... + Kontrollerer... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Gået i stå + + + + Are you sure you want to quit? + Er du sikker på at du vil afslutte? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' blev fjernet. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' lagt til download listen. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' fortsat. (hurtig fortsættelse) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' findes allerede i download listen. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kan ikke dekode torrent filen: '%1' + + + None + i.e: No error message + Intet + + + Listening on port: %1 + e.g: Listening on port: 1666 + Lytter på port: %1 + + + All downloads were paused. + Alle downloads blev sat på pause. + + + '%1' paused. + xxx.avi paused. + '%1' blev sat på pause. + + + Connecting... + i.e: Connecting to the tracker... + Forbinder... + + + All downloads were resumed. + Alle downloads fortsættes. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' fortsat. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 er hentet færdig. + + + + I/O Error + i.e: Input/Output Error + I/O Fejl + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Der opstod en fejl under forsøget på at skrive %1. Disken er måske fuld, downloaden er sat på pause + + + + Connection Status: + Forbindelses Status: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Bag en Firewall? + + + No incoming connections... + Ingen indkommende forbindelser... + + + No search engine selected + Der er ikke valgt nogen søgemaskine + + + Search plugin update + Søge plugin opdatering + + + Search has finished + Søgningen er færdig + + + Results + i.e: Search results + Resultater + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Downloader '%1', vent venligst... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Der opstod en fejl (fuld disk?), '%1' sat på pause. + + + + Search + Søg + + + + RSS + + + + + + DHT support [OFF] + + + + + PeX support [ON] + + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + + + + + + Downloads + + + + + Finished + Færdig + + + + Are you sure you want to delete the selected item(s) in finished list? + + + + + UPnP support [ON] + + + + + Encryption support [ON] + + + + + Encryption support [FORCED] + + + + + Encryption support [OFF] + + + + + Alt+1 + shortcut to switch to first tab + + + + + Alt+2 + shortcut to switch to second tab + + + + + Alt+4 + shortcut to switch to fourth tab + + + + + Url download error + + + + + Couldn't download file at url: %1, reason: %2. + + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + + + + + Alt+3 + shortcut to switch to third tab + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + UPnP support [OFF] + + + + + NAT-PMP support [ON] + + + + + NAT-PMP support [OFF] + + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + + + + + Local Peer Discovery support [OFF] + + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + Options were saved successfully. + Indstillingerne blev gemt. + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Total DL Hastighed: + + + Total UP Speed: + Total UP Hastighed: + + + &Options + &Funktioner + + + + &Edit + &Rediger + + + + &File + &Filer + + + + &Help + &Hjælp + + + + Open + Åben + + + + Exit + Afslut + + + + Preferences + Indstillinger + + + + About + Om + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slet + + + + Pause All + Sæt Alle På Pause + + + + Start All + Start Alle + + + + Torrent Properties + Egenskaber For Torrent + + + Search + Søg + + + Search Pattern: + Søg Efter: + + + Status: + Status: + + + Stopped + Stoppet + + + Search Engines + Søgemaskiner + + + Results: + Resultater: + + + Stop + Stop + + + + Download from URL + Download fra URL + + + Download + Download + + + Clear + Ryd resultater + + + KiB/s + KB/s + + + + Create torrent + Opret torrent + + + Update search plugin + Opdater søge plugin + + + Session ratio: + Sessionens ratio: + + + Transfers + Overførsler + + + + Preview file + Smugkig fil + + + + Clear log + Ryd log + + + + Delete Permanently + Slet Permanent + + + + Visit website + Besøg Website + + + + Report a bug + Rapporter en fejl + + + + Set upload limit + + + + + Set download limit + + + + + Documentation + + + + + Set global download limit + + + + + Set global upload limit + + + + + Options + Indstillinger + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + False + Falsk + + + True + Sandt + + + + + Ignored + + + + + + + Normal + Normal (priority) + + + + + + High + High (priority) + + + + + + Maximum + Maximum (priority) + + + + + RSS + + + Search + Søg + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + + Update all feeds + + + + + + Delete + Slet + + + + Feed URL + + + + + + Rename + + + + + + Update + + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + + New folder + + + + Create + Opret + + + + Refresh RSS streams + + + + 2 + 2 + + + + RSSImp + + + Please type a rss stream url + + + + + Stream URL: + + + + + + Are you sure? -- qBittorrent + Er du sikker? -- qBittorrent + + + + + &Yes + &Ja + + + + + &No + &Nej + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + + + + + Author: + + + + + Unread + + + + + RssItem + + + No description available + + + + + RssStream + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Navn + + + Size + i.e: file size + Størrelse + + + Seeders + i.e: Number of full sources + Seedere + + + Leechers + i.e: Number of partial sources + Leechere + + + Search engine + Søgemaskine + + + + Empty search pattern + Tomt søge kriterie + + + + Please type a search pattern first + Indtast venligst et søge kriterie først + + + No search engine selected + Der er ikke valgt nogen søgemaskine + + + You must select at least one search engine. + Du skal vælge mindst en søgemaskine. + + + + + Results + Resultater + + + + Searching... + Søger... + + + Search plugin update -- qBittorrent + Søge plugin opdatering -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Søge plugin kan opdateres, ønsker du at opdatere det? + +Ændringslog: + + + + &Yes + &Ja + + + &No + &Nej + + + Search plugin update + Søge plugin opdatering + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Beklager, opdaterings-serveren er midlertidigt utilgængelig. + + + Your search plugin is already up to date. + Dit søge plugin er allerede opdateret fuldt ud. + + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Search Engine + Søgemaskine + + + + + Search has finished + Søgningen er færdig + + + + An error occured during search... + Der opstod en fejl under søgningen... + + + + Search aborted + Søgning afbrudt + + + + Search returned no results + Søgningen gav intet resultat + + + + Results + i.e: Search results + Resultater + + + + + Unknown + Ukendt + + + + SearchTab + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Seeders + i.e: Number of full sources + Seedere + + + + Leechers + i.e: Number of partial sources + Leechere + + + + Search engine + Søgemaskine + + + + TrackersAdditionDlg + + + Trackers addition dialog + + + + + List of trackers to add (one per line): + + + + + Ui + + I would like to thank the following people who volunteered to translate qBittorrent: + Jeg vil gerne takke disse personer, som meldte sig frivilligt til at oversætte qBittorrent: + + + Preview impossible + Smugkig ikke muligt + + + Sorry, we can't preview this file + Beklager, denne fil kan ikke smugkigges + + + Name + Navn + + + Size + Størrelse + + + Progress + Hentet + + + No URL entered + Der er ikke indtastet nogen URL + + + Please type at least one URL. + Indtast venligst mindst en URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontakt mig venligst hvis du kunne tænke dig og oversætte qBittorrent til dit eget sprog. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Jeg vil gerne takke disse personer, som meldte sig frivilligt til at oversætte qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontakt mig venligst hvis du kunne tænke dig og oversætte qBittorrent til dit eget sprog. + + + + addTorrentDialog + + + Torrent addition dialog + Tilføj ny torrent + + + + Save path: + Gem i: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + Ukendt + + + + Free disk space: + + + + + Torrent content: + Indhold af torrent: + + + + Download in sequential order (slower but good for previewing) + + + + File name + Fil navn + + + File size + Fil størrelse + + + Selected + Valgt + + + Download in correct order (slower but good for previewing) + Download i korrekt rækkefølge (langsommere, men godt for smugkig) + + + + Add to download list in paused state + Tilføj til download listen som sat på pause + + + + Add + Tilføj + + + + Cancel + Annuller + + + Unselect + Fravælg + + + Select + Vælg + + + + Ignored + + + + + Normal + + + + + High + + + + + Maximum + + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + Godkendelse af tracker + + + + Tracker: + Tracker: + + + + Login + Login + + + + Username: + Brugernavn: + + + + Password: + Kodeord: + + + + Log in + Log på + + + + Cancel + Annuller + + + + bandwidth_dlg + + + Bandwidth allocation + + + + + KiB/s + KB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' blev fjernet. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' blev sat på pause. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' fortsat. + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' findes allerede i download listen. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' fortsat. (hurtig fortsættelse) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' lagt til download listen. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kan ikke dekode torrent filen: '%1' + + + + This file is either corrupted or this isn't a torrent. + Denne fil er enten korrupt eller ikke en torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + Kunne ikke lytte på de opgivne porte. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + + Fast resume data was rejected for torrent %1, checking again... + + + + + Url seed lookup failed for url: %1, message: %2 + + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Downloader '%1', vent venligst... + + + + createTorrentDialog + + Create Torrent file + Opret torrent fil + + + ... + ... + + + Create + Opret + + + + Cancel + Annuller + + + Directory + Mappe + + + + Torrent Creation Tool + Værktøj: Opret torrent + + + <center>Destination torrent file:</center> + <center>Destinations torrent fil:</center> + + + <center>Input file or directory:</center> + <center>Fil eller mappe til torrent:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Udbred url:<br>(En per linje)</center> + + + <center>Comment:</center> + <center>Kommentar:</center> + + + + Torrent file creation + + + + + Add file + + + + + Add folder + + + + + Announce urls (trackers): + + + + + Comment (optional): + + + + + Web seeds urls (optional): + + + + + File or folder to add to the torrent: + + + + + Piece size: + + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + + + + + Start seeding after creation + + + + + Create and save... + + + + + Progress: + + + + + createtorrent + + + Select destination torrent file + Vælg destinations torrent fil + + + + Torrent Files + Torrent FIler + + + Select input directory or file + Vælg input mapper eller fil + + + No destination path set + Ingen destionations sti sat + + + Please type a destination path first + Indtast venligst en destinations sti først + + + + No input path set + Der er ikke sat nogen sti til input + + + + Please type an input path first + Indtast venligst en input sti først + + + Input path does not exist + Stien til input findes ikke + + + + + + Torrent creation + Torrent oprettelse + + + + Torrent was created successfully: + Torrent blev oprettet succesfuldt: + + + Please type a valid input path first + Indtast venligst en gyldig sti til input først + + + + Select a folder to add to the torrent + + + + + Please type an announce URL + + + + + Torrent creation was unsuccessful, reason: %1 + + + + + Announce URL: + Tracker URL + + + + + Please type a web seed url + + + + + Web seed URL: + + + + + Select a file to add to the torrent + + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + Hent torrents fra URL(er) + + + + Only one URL per line + Kun en URL per linje + + + + Download + Hent + + + + Cancel + Annuller + + + + Download from urls + Hent fra url(er) + + + + No URL entered + Der er ikke indtastet nogen URL + + + + Please type at least one URL. + Indtast venligst mindst en URL. + + + + downloading + + + Search + Søg + + + Total DL Speed: + Total DL Hastighed: + + + KiB/s + KB/s + + + Session ratio: + Sessionens ratio: + + + Total UP Speed: + Total UP Hastighed: + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slet + + + Clear + Ryd resultater + + + + Preview file + Smugkig fil + + + + Set upload limit + + + + + Set download limit + + + + + Delete Permanently + Slet Permanent + + + + Torrent Properties + + + + + Open destination folder + + + + + Name + Navn + + + + Size + Størrelse + + + + Progress + Hentet + + + + DLSpeed + + + + + UpSpeed + + + + + Seeds/Leechs + Seedere/Leechere + + + + Ratio + + + + + ETA + Tid Tilbage + + + + Buy it + + + + + Priority + + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + + + + + Installed search engines: + + + + + Name + Navn + + + + Url + + + + + Enabled + + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + + Install a new one + + + + + Check for updates + + + + + Close + + + + + Enable + + + + + Disable + Slå fra + + + + Uninstall + + + + + engineSelectDlg + + True + Sandt + + + False + Falsk + + + + Uninstall warning + + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + + + + + Uninstall success + + + + + Select search plugins + + + + + + qBittorrent search plugins + + + + + + + + + + + + Search plugin install + + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + + + + + + + + + Search plugin update + Søge plugin opdatering + + + + + Sorry, update server is temporarily unavailable. + Beklager, opdaterings-serveren er midlertidigt utilgængelig. + + + + All your plugins are already up to date. + + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + + + + + All selected plugins were uninstalled successfully + + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + + + + + Search engine plugin archive could not be read. + + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + + + + + New search engine plugin URL + + + + + URL: + + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KB + + + + MiB + mebibytes (1024 kibibytes) + MB + + + + GiB + gibibytes (1024 mibibytes) + GB + + + + TiB + tebibytes (1024 gibibytes) + TB + + + Unknown + Ukendt + + + + Unknown + Unknown (size) + Ukendt + + + + < 1m + < 1 minute + < 1 m + + + + %1m + e.g: 10minutes + %1m + + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Range Start IP + Første IP i rækken + + + Start IP: + Første IP: + + + Range End IP + Sidste IP i rækken + + + End IP: + Sidste IP: + + + IP Range Comment + IP Række Kommentar + + + Comment: + Kommentar: + + + to + <min port> to <max port> + til + + + Choose your favourite preview program + Vælg dit foretrukne smugkig program + + + Invalid IP + Ugyldig IP + + + This IP is invalid. + Denne IP er ugyldig. + + + Options were saved successfully. + Indstillingerne blev gemt. + + + + + Choose scan directory + Vælg mappe til scan + + + Choose an ipfilter.dat file + Vælg en ipfilter.dat fil + + + + + Choose a save directory + Vælg en standart mappe + + + I/O Error + Input/Output Error + I/O Fejl + + + Couldn't open %1 in read mode. + Kunne ikke åbne %1 til læsning. + + + + + Choose an ip filter file + + + + + + Filters + + + + + pluginSourceDlg + + + Plugin source + + + + + Search plugin source: + + + + + Local file + + + + + Web link + + + + + preview + + + Preview selection + Smugkig valgte + + + + File preview + Smugkig + + + + The following files support previewing, <br>please select one of them: + De følgende filer kan smugkigges, <br>vælg venligst en af dem: + + + + Preview + Smugkig + + + + Cancel + Annuller + + + + previewSelect + + + + Preview impossible + Smugkig ikke muligt + + + + + Sorry, we can't preview this file + Beklager, denne fil kan ikke smugkigges + + + + Name + Navn + + + + Size + Størrelse + + + + Progress + Hentet + + + + properties + + + Torrent Properties + Egenskaber for torrent + + + File Name + Fil Navn + + + Current Session + Nuværende Session + + + + OK + OK + + + + Unknown + Ukendt + + + + Files contained in current torrent: + Filer i torrent: + + + + Size + Størrelse + + + Selected + Valgte + + + Unselect + Fravælg + + + Select + Vælg + + + You can select here precisely which files you want to download in current torrent. + Her kan du vælge hvike filer i denne torrent du ønsker og hente. + + + Tracker + Tracker + + + + Trackers: + Trackere: + + + + + None - Unreachable? + Ingen - Kan ikke nås? + + + Errors: + Fejl: + + + + Progress + Hentet + + + Main infos + Generel Info + + + + Current tracker: + Nuværende tracker: + + + + Total uploaded: + Sendt ialt: + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + Hentet ialt: + + + + Total failed: + Fejlet ialt: + + + + Torrent content + Indhold af torrent + + + + Download in correct order (slower but good for previewing) + Hent i rækkefølge (langsommere, men godt for smugkig) + + + Share Ratio: + Delings Ratio: + + + + Save path: + Gem til: + + + + Creator: + + + + + Torrent hash: + + + + + Comment: + Kommentar: + + + + Current session + + + + + Share ratio: + Delingsforhold: + + + + Trackers + + + + + Priorities: + + + + + Normal: normal priority. Download order is dependent on availability + + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + + + + + File name + Fil navn + + + + + Priority + + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + + + + + Ignored: file is not downloaded at all + + + + + Ignored + + + + + Normal + + + + + Maximum + + + + + High + + + + + Url seeds + + + + + New url seed: + + + + + This url seed is already in the list. + + + + None + i.e: No error message + Intet + + + + New url seed + New HTTP source + + + + + The following url seeds are available for this torrent: + + + + + Priorities error + + + + + Error, you can't filter all the files in a torrent. + + + + + Downloaded pieces + + + + + Collapse all + + + + + Expand all + + + + + ... + ... + + + + + Choose save path + Gem til denne mappe + + + + Save path creation error + Fejl ved oprettelse af mappe + + + + Could not create the save path + Kunne ikke oprette mappe svarende til den indtastede sti + + + + search_engine + + + + Search + Søg + + + Search Engines + Søgemaskiner + + + Search Pattern: + Søg Efter: + + + Stop + Stop + + + + Status: + Status: + + + + Stopped + Stoppet + + + Results: + Resultater: + + + + Download + + + + Clear + Ryd resultater + + + Update search plugin + Opdater søge plugin + + + + Search engines... + + + + + seeding + + + Search + Søg + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slet + + + + Delete Permanently + Slet Permanent + + + + Torrent Properties + + + + + Preview file + Smugkig fil + + + + Set upload limit + + + + + Open destination folder + + + + + Name + Navn + + + + Size + Størrelse + + + + Upload Speed + + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + Leechers + Leechere + + + + Ratio + + + + + Buy it + + + + + Force recheck + + + + + Total uploaded + + + + + subDownloadThread + + + Host is unreachable + + + + + File was not found (404) + + + + + Connection was denied + + + + + Url is invalid + + + + + Connection failure + + + + + Connection was timed out + + + + + Incorrect network interface + + + + + Unknown error + + + + + I/O Error + I/O Fejl + + + + Could not resolve proxy + + + + + torrentAdditionDialog + + True + Sandt + + + + + Unable to decode torrent file: + Kan ikke dekode torrent filen: + + + This file is either corrupted or this isn't a torrent. + Denne fil er enten korrupt eller ikke en torrent. + + + + + Choose save path + Gem til denne mappe + + + False + Falsk + + + Unknown + Ukendt + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + Ingen mappe + + + + Please enter a save path + Vælg venligst en mappe som der skal hentes til + + + + Save path creation error + Fejl ved oprettelse af mappe + + + + Could not create the save path + Kunne ikke oprette mappe svarende til den indtastede sti + + + + Invalid file selection + Valg af filer ugyldigt + + + + You must select at least one file in the torrent + Du skal vælge mindst en fil per torrent + + + + File name + Fil navn + + + + Size + Størrelse + + + + Progress + Hentet + + + + + Priority + + + + diff --git a/src/lang/qbittorrent_de.qm b/src/lang/qbittorrent_de.qm new file mode 100644 index 0000000000000000000000000000000000000000..6ead513099bea04d59d095895e749ac3e9427683 GIT binary patch literal 58267 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_de.ts b/src/lang/qbittorrent_de.ts new file mode 100644 index 000000000..7b42ca1c8 --- /dev/null +++ b/src/lang/qbittorrent_de.ts @@ -0,0 +1,5669 @@ + + + + + AboutDlg + + + About qBittorrent + Über qBittorrent + + + + About + Info + + + + Author + Autor + + + qBitorrent Author + qBittorrent Autor + + + + Name: + Name: + + + + Country: + Land: + + + + E-mail: + E-mail: + + + + Home page: + Home Page: + + + + Christophe Dumez + Christophe Dumez + + + + France + Frankreich + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Dank an + + + + Translation + Übersetzung + + + + License + Lizenz + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + qBittorrent Author + qBittorrent Autor + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Ein bittorrent client basierend auf Qt4 und libtorrent, programmiert in C++.<br> +<br> +Copyright (c) 2006 Christophe Dumez<br> +<br><u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + Geburtstag: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein Bittorrent Client programmiert in C++, basierend auf dem Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">und libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Occupation: + Beschäftigung: + + + + 03/05/1985 + 03.05.1985 + + + + Student in computer science + Informatikstudent + + + + Thanks to + Dank an + + + + BandwidthAllocationDialog + + + Upload limit: + Upload Begrenzung: + + + + Download limit: + Download Begrenzung: + + + + + + + Unlimited + Unlimited (bandwidth) + Unbegrenzt + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + qBittorrent Konsole + + + + General + Allgemein + + + + Blocked IPs + Geblockte IP's + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Optionen -- qBittorrent + + + Options + Optionen + + + Main + Main + + + Scanned Dir: + Dursuchtes Verzeichnis: + + + ... + ... + + + Save Path: + Speicher-Pfad: + + + Download Limit: + Download Begrenzung: + + + Upload Limit: + Upload Begrenzung: + + + Max Connects: + Maximale Verbindungen: + + + Port range: + Port Bereich: + + + Kb/s + Kb/s + + + Disable + Deaktivieren + + + connections + Verbindungen + + + to + zu + + + Enable directory scan (auto add torrent files inside) + Aktiviere Verzeichnis Abfrage (fügt gefundene torrent Dateien automatisch hinzu) + + + + Proxy + Proxy + + + Enable connection through a proxy server + Ermögliche Verbindungen über einen Proxy Server + + + Proxy Settings + Proxy Einstellungen + + + Server IP: + Server IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Port: + + + Proxy server requires authentication + Proxy Server benötigt Authentifizierung + + + + + + Authentication + Authentifizierung + + + User Name: + Benutzer: + + + + + + Password: + Kennwort: + + + Language + Sprache + + + Please choose your preferred language in the following list: + Bitte wählen Sie die bevorzugte Sprache aus der folgenden Liste: + + + Language settings will take effect after restart. + Spracheinstellungen werden erst nach einem Neustart wirksam. + + + OK + OK + + + Cancel + Abbrechen + + + Connection Settings + Verbindungs-Einstellungen + + + Share ratio: + Share Verhältnis: + + + KB UP max. + KB UP max. + + + + Activate IP Filtering + Aktiviere IP Filter + + + + Filter Settings + Filter Einstellungen + + + ipfilter.dat URL or PATH: + ipfilter.dat URL oder PATH: + + + Origin + Ursprung + + + Comment + Kommentar + + + Apply + Anwenden + + + Add Range + Bereich hinzufügen + + + Remove Range + Bereich entfernen + + + ipfilter.dat Path: + ipfilter.dat Pfad: + + + Clear finished downloads on exit + Abgeschlossene Downloads beim beenden entfernen + + + Ask for confirmation on exit + Beenden bestätigen + + + Go to systray when minimizing window + In den SysTray minimieren + + + Misc + Sonstige + + + Localization + Lokalisation + + + + Language: + Sprache: + + + Behaviour + Verhalten + + + Always display OSD + OSD immer anzeigen + + + Display OSD only if window is minimized or iconified + OSD nur anzeigen, wenn das Fenster minimiert ist + + + Never display OSD + OSD nie anzeigen + + + KiB UP max. + KB UP max. + + + DHT (Trackerless): + DHT (Trackerlos): + + + Disable DHT (Trackerless) support + Deaktiviere DHT (Trackerlos) Unterstützung + + + Automatically clear finished downloads + Abgeschlossene Downloads automatisch beseitigen + + + Preview program + Vorschau Programm + + + Audio/Video player: + Audio/Video Player: + + + + + KiB/s + Kb/s + + + 1 KiB DL = + 1 KiB DL = + + + DHT configuration + DHT Konfiguration + + + + DHT port: + DHT Port: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Hinweis</b> Änderung werden erst beim nächsten Start von qBittorrent aktiv. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Hinweis für Übersetzer</b> Falls qBittorrent nicht in Ihrer Sprache erhältich ist <br>und Sie es in Ihre Muttersprache übersetzen wollen, so setzen Sie sich bitte mit mir in Verbindung (chris@qbittorrent.org). + + + + IP Filter + IP Filter + + + Start IP + Start IP + + + End IP + End IP + + + Display a torrent addition dialog everytime I add a torrent + Immer Dialog zum hinzufügen eines Torrents öffnen, wenn ich einen Torrent hinzufüge + + + Default save path + Vorgegebener Speicher Pfad + + + Systray Messages + Systray Nachrichten + + + Always display systray messages + Systray Nachrichten immer anzeigen + + + Display systray messages only when window is hidden + Systray Nachrichten nur anzeigen wenn das Fenster nicht sichtbar ist + + + Never display systray messages + Systray Nachrichten nie anzeigen + + + Disable DHT (Trackerless) + Deaktiviere DHT (ohne Tracker) + + + Disable Peer eXchange (PeX) + Deaktiviere Peer eXchange (PeX) + + + Go to systray when closing main window + In den SysTray minimieren, wenn das Hauptfenster geschlossen wird + + + + Connection + Verbindung + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (Trackerlos) + + + Torrent addition + Torrent hinzufügen + + + Main window + Hauptfenster + + + Systray messages + Systray Nachrichten + + + Directory scan + Verzeichnis durchsuchen + + + Style (Look 'n Feel) + Aussehen (Look 'n Feel) + + + + Plastique style (KDE like) + Plastique Stil (wie KDE) + + + Cleanlooks style (GNOME like) + Cleanlooks Stil (wie GNOME) + + + Motif style (default Qt style on Unix systems) + Motif Stil (standartmäßiger Qt Stil auf Unix Systemen) + + + + CDE style (Common Desktop Environment like) + CDE Stil (wie Common Desktop Environment) + + + MacOS style (MacOSX only) + MacOS Stil (nur MacOSX) + + + Exit confirmation when the download list is not empty + Beenden bestätigen, wenn die Download Liste nicht leer ist + + + Disable systray integration + Deaktiviere die Einbindung in den Systray + + + WindowsXP style (Windows XP only) + WindowsXP Stil (nur Windows XP) + + + Server IP or url: + Server IP oder URL: + + + Proxy type: + Proxy Typ: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Betroffene Verbindungen + + + + Use proxy for connections to trackers + Benutze den Proxy für die Verbindung zu Trackern + + + + Use proxy for connections to regular peers + Benutze den Proxy für die Verbindung zu den normalen Quellen + + + + Use proxy for connections to web seeds + Benutze den Proxy für die Verbindung zu Web Seeds + + + + Use proxy for DHT messages + Benutze den Proxy für DHT Nachrichten + + + Encryption + Verschlüsselung + + + Encryption state: + Verschlüsselungsstatus: + + + + Enabled + Aktiviert + + + + Forced + Erzwungen + + + + Disabled + Deaktiviert + + + + Preferences + Einstellungen + + + General + Allgemein + + + Network + Netzwerk + + + + User interface settings + Benutzer-Interface Einstellungen + + + + Visual style: + Visueller Stil: + + + + Cleanlooks style (Gnome like) + Cleanlooks Stil (wie in Gnome) + + + + Motif style (Unix like) + Motif Stil (Unixartig) + + + + Ask for confirmation on exit when download list is not empty + Beenden bestötigen, wenn Download-Liste nicht leer + + + + Display current speed in title bar + Zeige derzeitige Geschwindigkeit in der Titel Leiste + + + + System tray icon + Symbol im Infobereich der Taskleiste + + + + Disable system tray icon + Deaktiviere Bild im Infobereich der Taskleiste + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + In den Infobereich der Tasklleiste schliessen + + + + Minimize to tray + In den Infobereich der Taskleiste minimieren + + + + Show notification balloons in tray + Zeige Benachrichtigungs Ballons im Infobereich der Taskleiste + + + Media player: + Media player: + + + + Downloads + Downloads + + + Put downloads in this folder: + Lege Downloads in diesen Ordner: + + + + Pre-allocate all files + Allen Dateien Speicherplatz im vorhinein zuweisen + + + + When adding a torrent + Sobald ein Torrent hinzugefügt wird + + + + Display torrent content and some options + Zeige Torrent Inhalt und einige Optionen + + + + Do not start download automatically + The torrent will be added to download list in pause state + Download nicht automatisch starten + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Beobachte Ordner + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Transferlisten Doppelklick + + + + Download list: + Downloadliste: + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Seeding list: + Seedingliste + + + + Download folder: + Downloadordner: + + + + Temp folder: + Temporärer Ordner: + + + + Automatically download torrents present in this folder: + Lade Torrents in diesem Ordner automatisch: + + + + Listening port + Port auf dem gelauscht wird + + + to + i.e: 1200 to 1300 + bis + + + + Enable UPnP port mapping + Aktiviere UPnP Port Mapping + + + + Enable NAT-PMP port mapping + Aktiviere NAP-PMP Port Mapping + + + + Global bandwidth limiting + Globale bandbreiten Limitierung + + + + Upload: + Upload: + + + + Download: + Download: + + + + Bittorrent features + Bittorrent Funktionen + + + + Use the same port for DHT and Bittorrent + Denselben Port für DHT und Bittorrent verwenden + + + + Spoof µtorrent to avoid ban (requires restart) + µtorrent täuschen um einen Ban zu vermeiden (erfordert Neustart) + + + + + Type: + Typ: + + + + + (None) + (Keine) + + + + + Proxy: + Proxy: + + + + + + Username: + Benutzername: + + + + Bittorrent + Bittorrent + + + + UI + + + + + Connections limit + Verbindungsbeschränkung + + + + Global maximum number of connections: + Globale maximale Anzahl der Verbindungen: + + + + Maximum number of connections per torrent: + Maximale Anzahl der Verbindungen pro Torrent: + + + + Maximum number of upload slots per torrent: + Maximale Anzahl der Upload-Slots pro Torrent: + + + Additional Bittorrent features + Weitere Bittorrent Funktionen + + + + Enable DHT network (decentralized) + Aktiviere DHT Netzwerk (dezentralisiert) + + + Enable Peer eXchange (PeX) + Aktiviere Peer eXchange (PeX) + + + + Enable Local Peer Discovery + Aktiviere Lokale Peer Auffindung + + + + Encryption: + Verschlüssellung: + + + + Share ratio settings + Share Verhältnis Einstellungen + + + + Desired ratio: + Gewünschtes Verhältnis: + + + + Filter file path: + Pfad zur Filter-Datei: + + + + transfer lists refresh interval: + Aktualisierungsinterval der Übetragungslisten: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + Aktualisierungsintervall für RSS Feeds: + + + + minutes + Minuten + + + + Maximum number of articles per feed: + Maximale Anzahl von Artikeln pro Feed: + + + + File system + Datei System + + + + Remove finished torrents when their ratio reaches: + Entferne beendete Torrents bei einem Verhältnis von: + + + + System default + Standardeinstellung + + + + Start minimized + Minimiert starten + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Aktion bei doppelklick in die Transfer Leiste +qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen Torrents automatisch + + + In download list: + In der Download-Liste: + + + Pause/Start torrent + Pausiere/Starte Torrent + + + Open destination folder + Zielverzeichniss öffnen + + + Display torrent properties + Zeige Torrent-Eigenschaften + + + In seeding list: + In der Seed-Liste: + + + Folder scan interval: + Zeitabstand in dem Verzeichnisse gescannt werden: + + + seconds + Sekunden + + + Spoof Azureus to avoid ban (requires restart) + Vortäuschen von Azureus um nicht gebannt zu werden (benötigt Neustart) + + + + Web UI + Web UI + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + Port used for incoming connections: + + + + + Random + + + + + Enable Web User Interface + Aktiviere Web User Interface + + + + HTTP Server + HTTP Server + + + + Enable RSS support + Aktiviere RSS Unterstützung + + + + RSS settings + RSS Einstellungen + + + + Torrent queueing + Torrent Warteschlangen + + + + Enable queueing system + Aktiviere Warteschlangen + + + + Maximum active downloads: + Maximale aktive Downloads: + + + + Maximum active torrents: + Maximale aktive Torrents: + + + + Display top toolbar + Zeige obere Werkzeugleiste + + + + Search engine proxy settings + Suchmaschinen Proxy Einstellungen + + + + Bittorrent proxy settings + Bittorrent Proxy Einstellungen + + + + Maximum active uploads: + Maximale aktive Uploads: + + + + DownloadingTorrents + + + Name + i.e: file name + Name + + + + Size + i.e: file size + Größe + + + + Progress + i.e: % downloaded + Fortschritt + + + + DL Speed + i.e: Download speed + DL Geschwindigkeit + + + + UP Speed + i.e: Upload speed + UP Geschwindigkeit + + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + Seeder/Leecher + + + + Ratio + Verhältnis + + + + ETA + i.e: Estimated Time of Arrival / Time left + voraussichtliche Ankunftszeit + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 gestartet. + + + Be careful, sharing copyrighted material without permission is against the law. + Vorsicht! Die Verbreitung von urheberrechlich geschütztem Material ist gesetzeswidrig. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>wurde geblockt</i> + + + Fast resume data was rejected for torrent %1, checking again... + Fast-Resume Daten für den Torrent %1 wurden zurückgewiesen, prüfe nochmal... + + + Url seed lookup failed for url: %1, message: %2 + URL Seed Lookup für die URL: %1 ist fehlgeschlagen, Begründung: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' zur Download Liste hinzugefügt. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wird fortgesetzt. (Schnelles Fortsetzen) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' befindet sich bereits in der Download Liste. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kann Torrent Datei '%1' nicht dekodieren + + + This file is either corrupted or this isn't a torrent. + Diese Datei ist entweder beschädigt, oder sie ist kein Torrent. + + + Couldn't listen on any of the given ports. + Konnte nicht auf den angegebenen Ports lauschen. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Lade '%1', bitte warten... + + + + Hide or Show Column + Verstecke oder zeige Spalte + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port Mapping Fehler, Fehlermeldung: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port Mapping erfolgreich, Medlung: %1 + + + Priority + Priorität + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O Fehler + + + + + + Couldn't open %1 in read mode. + Konnte %1 nicht öffnen. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 ist keine gültige PeerGuardian-P2B-Datei + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Beendet + + + + Name + i.e: file name + Name + + + + Size + i.e: file size + Größe + + + + Seeds / Leechers + Seeder / Leecher + + + + Connected peers + Verbundene Peers + + + Progress + i.e: % downloaded + Verlauf + + + DL Speed + i.e: Download speed + DL Geschwindigkeit + + + + UP Speed + i.e: Upload speed + UP Geschwindigkeit + + + Seeds/Leechs + i.e: full/partial sources + Seeder/Leecher + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + vorraussichtliche Ankunftszeit + + + Finished + i.e: Torrent has finished downloading + Beendet + + + None + i.e: No error message + Nichts + + + + Ratio + Verhältnis + + + Leechers + i.e: full/partial sources + Leecher + + + + Total uploaded + i.e: Total amount of uploaded data + Insgesamt hochgeladen + + + + Hide or Show Column + Verstecke oder zeige Spalte + + + Incomplete torrent in seeding list + Unvollständiger Torrent in der Seeding-Liste + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Es hat den anschein, dass sich der Status des Torrents '%1' von 'seeding' auf 'downloading' umgestellt hat. Möchtest Du ihn wieder auf die Download-Liste setzen? (Der Torrent wird ansonsten gelöscht) + + + Priority + Priorität + + + + GUI + + qBittorrent + qBittorrent + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: By Christophe Dumez :: Copyright (c) 2006 + + + + + qBittorrent + qBittorrent + + + started. + gestartet. + + + DL Speed: + DL Geschwindigkeit: + + + kb/s + kb/s + + + UP Speed: + UP Geschwindigkeit: + + + + Open Torrent Files + Öffne Torrent-Dateien + + + + Torrent Files + Torrent-Dateien + + + Couldn't create the directory: + Konnte Verzeichniss nicht erstellen: + + + already in download list. + <file> already in download list. + Bereits in der Download Liste. + + + MB + MB + + + kb/s + kb/s + + + Unknown + Unbekannt + + + added to download list. + zur Download Liste hinzugefügt. + + + resumed. (fast resume) + fortgesetzt (schnelles fortsetzen) + + + Unable to decode torrent file: + Torrent Datei kann nicht dekodiert werden: + + + This file is either corrupted or this isn't a torrent. + Diese Datei ist entweder beschädigt, oder kein torrent. + + + + + + + Are you sure? -- qBittorrent + Sind Sie sicher? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Wollen Sie wirklich alle Dateien aus der Download Liste löschen? + + + + + + + + &Yes + &Ja + + + + + + + + &No + &Nein + + + Download list cleared. + Download Liste gelöscht. + + + + Are you sure you want to delete the selected item(s) in download list? + Wollen Sie wirklich die ausgewählten Elemente aus der Download-Liste löschen? + + + removed. + <file> removed. + Entfernt. + + + Listening on port: + Lausche auf Port : + + + Couldn't listen on any of the given ports + Konnte nicht auf den angegebenen Ports lauschen + + + paused + angehalten + + + All Downloads Paused. + Alle Downloads angehalten. + + + started + gestartet + + + All Downloads Resumed. + Alle Downloads forgesetzt. + + + paused. + <file> paused. + angehalten. + + + resumed. + <file> resumed. + fortgesetzt. + + + <b>Connection Status:</b><br>Online + <b>Verbindungs-Status:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Verbindungs-Status:</b><br>Firewalled?<br><i>Keine eingehenden Verbindungen...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Verbindungs-Status:</b><br>Offline<br><i>Keine Peers gefunden...</i> + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Geschwindigkeit: + + + + Finished + Beendet + + + Checking... + Überprüfe... + + + Connecting... + Verbinde... + + + Downloading... + Herunterladen... + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + has finished downloading. + ist vollständig heruntergeladen. + + + Couldn't listen on any of the given ports. + red + Konnte nicht auf den angegebenen Ports lauschen. + + + Couldn't listen on any of the given ports. + Konnte nicht auf den angegebenen Ports lauschen. + + + None + Kein + + + Empty search pattern + Leere Suchanfrage + + + Please type a search pattern first + Bitte geben Sie zuerst eine Suchanfrage ein + + + No seach engine selected + Keine Suchmaschine ausgewählt + + + You must select at least one search engine. + Sie müssen mindestens eine Suchmaschine auswählen. + + + Searching... + Suche... + + + Could not create search plugin. + Konnte Such-Plugin nicht erstellen. + + + Stopped + Angehalten + + + Couldn't create temporary file on hard drive. + Konnte keine temporäre Datei erstellen. + + + Torrent file URL + Torrent Datei URL + + + Downloading using HTTP: + Download über HTTP: + + + Torrent file URL: + Torrent Datei URL: + + + Are you sure you want to quit? -- qBittorrent + Wollen Sie wirklich beenden? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Wollen Sie qbittorrent wirklich beenden? + + + Timed out + Time-out + + + Error during search... + Fehler während der Suche... + + + Failed to download: + Download fehlgeschlagen: + + + A http download failed, reason: + Ein http download schlug fehl, Ursache: + + + A http download failed, reason: + Ein http Download schlug fehl, Begründung: + + + Stalled + Blockiert + + + Search is finished + Suche abgeschlossen + + + An error occured during search... + Während der Suche ist ein Fehler aufgetreten ... + + + Search aborted + Suche abgebrochen + + + Search returned no results + Suche lieferte keine Ergebnisse + + + Search is Finished + Suche abgeschlossen + + + Search plugin update -- qBittorrent + "Such"-Plugin update -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Es liegt eine neuere Version des "Such"-Plugins bereit. Möchten sie updaten? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Update Server vorübergehend nicht erreichbar. + + + Your search plugin is already up to date. + "Such"-Plugin ist schon auf dem neuesten Stand. + + + Results + Ergebnisse + + + Name + Name + + + Size + Grösse + + + Progress + Fortschritt + + + DL Speed + DL Geschwindigkeit + + + UP Speed + UP Geschwindigkeit + + + Status + Status + + + ETA + ETA + + + Seeders + Seeder + + + Leechers + Leecher + + + Search engine + Suchmaschine + + + Stalled + state of a torrent whose DL Speed is 0 + Stehen geblieben + + + Paused + Pausiert + + + Preview process already running + Vorschau Prozess läuft bereits + + + There is already another preview process running. +Please close the other one first. + Ein anderer Vorschau Prozess läuft zu Zeit. +Bitte schliessen Sie diesen zuerst. + + + Couldn't download + Couldn't download <file> + Konnte Datei nicht downloaden + + + reason: + Reason why the download failed + Grund: + + + Downloading + Example: Downloading www.example.com/test.torrent + Lade + + + Please wait... + Bitte warten... + + + Transfers + Transfer + + + Are you sure you want to quit qBittorrent? + Wollen Sie qBittorrent wirklich beenden? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Wollen Sie wirklich die ausgewählten Elemente aus der Download Liste und von der Festplatte löschen? + + + + Download finished + Download abgeschlossen + + + has finished downloading. + <filename> has finished downloading. + ist vollständig heruntergeladen. + + + Search Engine + Suchmaschine + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Verbindungs-Status: + + + Offline + Offline + + + No peers found... + Keine Peers gefunden... + + + Name + i.e: file name + Name + + + Size + i.e: file size + Größe + + + Progress + i.e: % downloaded + Verlauf + + + DL Speed + i.e: Download speed + DL Geschwindigkeit + + + UP Speed + i.e: Upload speed + UP Geschwindigkeit + + + Seeds/Leechs + i.e: full/partial sources + Seeder/Leecher + + + ETA + i.e: Estimated Time of Arrival / Time left + voraussichtliche Ankunftszeit + + + Seeders + i.e: Number of full sources + Seeder + + + Leechers + i.e: Number of partial sources + Leecher + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 gestartet. + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + DL Geschwindigkeit: %1 KB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + UP Geschwindigkeit: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Beendet + + + Checking... + i.e: Checking already downloaded parts... + Überprüfe... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Angehalten + + + + Are you sure you want to quit? + Wollen Sie wirklich beenden? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' wurde entfernt. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' wurde der Download Liste hinzugefügt. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wird fortgesetzt. (Schnelles Fortsetzen) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' befindet sich bereits in der Download Liste. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kann Torrent Datei '%1' nicht dekodieren + + + None + i.e: No error message + Nichts + + + Listening on port: %1 + e.g: Listening on port: 1666 + Lausche auf Port: %1 + + + All downloads were paused. + Alle Downloads wurden angehalten. + + + '%1' paused. + xxx.avi paused. + '%1' angehalten. + + + Connecting... + i.e: Connecting to the tracker... + Verbinde... + + + All downloads were resumed. + Alle Downloads wurden fortgesetzt. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' fortgesetzt. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 vollständig heruntergeladen. + + + + I/O Error + i.e: Input/Output Error + I/O Error + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Es ist ein Fehler beim lesen oder schreiben von %1 aufgetreten. Die Festplatte ist vermutlich voll. Der Download wurde angehalten + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Ein Fehler ist aufgetreten (Festplatte voll?), '%1' angehalten. + + + + Connection Status: + Verbindungs-Status: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Hinter einer Firewall/Router? + + + No incoming connections... + Keine eingehenden Verbindungen... + + + No search engine selected + Keine Suchmaschine ausgewählt + + + Search plugin update + Such-Plugin update + + + Search has finished + Suche abgeschlossen + + + Results + i.e: Search results + Ergebnisse + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Lade '%1', bitte warten... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Ein Fehler ist aufgetreten (Festplatte voll?), '%1' angehalten. + + + + Search + Suche + + + + RSS + RSS + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Ein I/O Fehler ist aufegtreten für die Torrent Datei %1. Ursache: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent lauscht auf Port: %1 + + + DHT support [ON], port: %1 + DHT Unterstützung [Aktiviert], port: %1 + + + + + DHT support [OFF] + DHT Unterstützung [Deaktiviert] + + + + PeX support [ON] + PeX Unterstützung [Aktiviert] + + + PeX support [OFF] + PeX Unterstützung [Deaktiviert] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Die Download Liste ist nicht leer. +Möchten sie qBittorrent wirklich beenden? + + + + + Downloads + Downloads + + + Are you sure you want to delete the selected item(s) in finished list and in hard drive? + Wollen Sie wirklich die ausgewählten Elemente aus der Beendet Liste und von der Festplatte löschen? + + + + Are you sure you want to delete the selected item(s) in finished list? + Wollen Sie wirklich die ausgewählten Elemente aus der Beendet Liste löschen? + + + + UPnP support [ON] + UPNP Unterstützung [Aktiviert] + + + Be careful, sharing copyrighted material without permission is against the law. + ACHTUNG! Die Verbreitung von urheberrechlich geschütztem Material ist gegen das Gesetz. + + + + Encryption support [ON] + Verschlüsselung Unterstützung [Aktiviert] + + + + Encryption support [FORCED] + Verschlüsselung Unterstützung [Erzwungen] + + + + Encryption support [OFF] + Verschlüsselungs-Unterstützung [Deaktiviert] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>wurde geblockt</i> + + + Ratio + Verhältnis + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Strg+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + URL Download Fehler + + + + Couldn't download file at url: %1, reason: %2. + Konnte Datei von URL: %1 nicht laden, Begründung: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Fast-Resume Daten wurden zurückgewiesen für torrent %1, prüfe nochmal... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Sind Sie sicher, daß Sie die ausgewählten Einträge aus der Download Liste und von der Festplatte löschen möchten? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Sind Sie sicher, daß Sie die ausgewählten Einträge aus der Beendet Liste und von der Festplatte löschen möchten? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' wurde endgültig gelöscht. + + + Url seed lookup failed for url: %1, message: %2 + URL Seed Lookup fehlgeschlagen für URL: %1, Begründung: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Strg+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent lauscht auf Port: TCP/%1 + + + + UPnP support [OFF] + UPnP Unterstützung [AUS] + + + + NAT-PMP support [ON] + NAT-PMP Unterstützung [AN] + + + + NAT-PMP support [OFF] + NAT-PMP Unterstützung [AUS] + + + + DHT support [ON], port: UDP/%1 + DHT Unterstützung [EIN], Port: UDP/%1 + + + + Local Peer Discovery [ON] + Lokale Peer Auffindung [AN] + + + + Local Peer Discovery support [OFF] + Unterstützung für Lokale Peer Auffindung [AUS] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' wurde entfernt, weil das von Ihnen eingestellte maximale Verhältnis erreicht wurde. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + DL: %1 KiB/s + + + + + UP: %1 KiB/s + UP: %1 KiB/s + + + + + Ratio: %1 + Verhältnis: %1 + + + + + DHT: %1 nodes + DHT: %1 Nodes + + + + + No direct connections. This may indicate network configuration problems. + Keine direkten Verbindungen. Es könnte bedeuten, daß Sie Probleme mit Ihrer Netzwerkkonfiguration haben. + + + + Uploads + Uploads + + + + Options were saved successfully. + Optionen wurden erfolgreich gespeichert. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Von Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Übertragunsgeschwindigkeit DL: + + + Kb/s + Kb/s + + + Total UP Speed: + Übertragunsgeschwindigkeit UP: + + + Name + Name + + + Size + Grösse + + + % DL + % DL + + + DL Speed + DL Geschwindigkeit + + + UP Speed + UP Geschwindigkeit + + + Status + Status + + + ETA + ETA + + + &Options + &Optionen + + + + &Edit + &Bearbeiten + + + + &Help + &Hilfe + + + + &File + &Datei + + + + Open + Öffnen + + + + Exit + Beenden + + + + Preferences + Einstellungen + + + + About + Info + + + + Start + Start + + + + Pause + Anhalten + + + + Delete + Löschen + + + + Pause All + Alle anhalten + + + + Start All + Alle starten + + + + Documentation + Dokumentation + + + Connexion Status + Verbindungs Status + + + Delete All + Alle löschen + + + + Torrent Properties + Torrent Eigenschaften + + + Connection Status + Verbindungs Status + + + Search + Suche + + + Search Pattern: + Suchanfrage: + + + Status: + Status: + + + Stopped + Angehalten + + + Search Engines + Such-Maschinen + + + Results: + Ergebnisse: + + + Leechers + Leecher + + + Search Engine + Such-Maschine + + + + Download from URL + Download von URL + + + Clear + Leeren + + + KiB/s + KiB/s + + + + Create torrent + Erstelle Torrent + + + Ratio: + Verhältnis: + + + Update search plugin + "Such"-Plugin updaten + + + Session ratio: + Session-Verhältniss: + + + Transfers + Transfer + + + + Preview file + Vorschau Datei + + + + Clear log + Log löschen + + + + Delete Permanently + Endgültig löschen + + + + Visit website + Website besuchen + + + + Report a bug + Einen Fehler melden + + + Downloads + Downloads + + + + Set upload limit + Setze Upload Begrenzung + + + + Set download limit + Setze Download Begrenzung + + + Log + Log + + + IP filter + IP Filter + + + + Set global download limit + Globales Download Limit setzen + + + + Set global upload limit + Globales Upload Limit setzen + + + + Options + Optionen + + + + Decrease priority + Verringere Priorität + + + + Increase priority + Erhöhe Prorität + + + + Console + Konsole + + + + PropListDelegate + + False + Falsch + + + True + Wahr + + + + + Ignored + Ignoriert + + + + + + Normal + Normal (priority) + Normal + + + + + High + High (priority) + Hoch + + + + + Maximum + Maximum (priority) + Maximum + + + + QTextEdit + + Clear + Leeren + + + + RSS + + + Search + Suche + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + Feed URL + + + + + + Update + + + + + New folder + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + + Update all feeds + + + + + + Delete + Löschen + + + + + Rename + Umbenennen + + + Refresh + Aktualisieren + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + Create + Erstellen + + + Delete selected streams + Lösche ausgewählte Streams + + + + Refresh RSS streams + Aktualisiere RSS Streams + + + Add a new RSS stream + neuen RSS Stream hinzufügen + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>News:</b> <i>(Doppelklick um den Link im Webbrowser zu öffnen)</i> + + + Add RSS stream + RSS Stream hinzufügen + + + Refresh all streams + Aktualisiere alle Streams + + + RSS streams: + RSS Streams: + + + 2 + 2 + + + Mark all as read + Markiere alle als gelesen + + + + RSSImp + + + Please type a rss stream url + Bitte eine RSS Stream Adresse eingeben + + + + Stream URL: + Stream URL: + + + Please choose a new name for this stream + Bitte wählen sie einen neuen Namen für diesen Stream + + + New stream name: + Neuer Stream Name: + + + + + Are you sure? -- qBittorrent + Sind Sie sicher? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Möchten sie den Stream wirklich aus der Liste löschen? + + + + + &Yes + &Ja + + + + + &No + &Nein + + + no refresh + keine Aktualisierung + + + no description available + keine Beschreibung verfügbar + + + Are you sure you want to delete this stream from the list? + Möchten sie den Stream wirklich aus der Liste löschen? + + + Description: + Beschreibung: + + + url: + URL: + + + Last refresh: + Letzte Aktualisierung: + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Dieser RSS-Feed ist bereits in der Liste. + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + Datum: + + + + Author: + Autor: + + + + Unread + + + + + RssItem + + + No description available + Keine Beschreibung vorhanden + + + + RssStream + + %1 ago + 10min ago + vor %1 + + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + Never + Niemals + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Name + + + Size + i.e: file size + Größe + + + Seeders + i.e: Number of full sources + Seeder + + + Leechers + i.e: Number of partial sources + Leecher + + + Search engine + Suchmaschine + + + + Empty search pattern + Leere Suchanfrage + + + + Please type a search pattern first + Bitte geben Sie zuerst eine Suchanfrage ein + + + No search engine selected + Keine Suchmaschine ausgewählt + + + You must select at least one search engine. + Sie müssen mindestens eine Suchmaschine auswählen. + + + + + Results + Ergebnisse + + + + Searching... + Suche... + + + Search plugin update -- qBittorrent + "Such"-Plugin update -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Es liegt eine neuere Version des "Such"-Plugins bereit. Möchten sie updaten? + +Changelog: + + + + &Yes + &Ja + + + &No + &Nein + + + Search plugin update + Such-Plugin update + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Update Server vorübergehend nicht erreichbar. + + + Your search plugin is already up to date. + "Such"-Plugin ist schon auf dem neuesten Stand. + + + + Cut + Ausschneiden + + + + Copy + Kopieren + + + + Paste + Einfügen + + + + Clear field + Feld leeren + + + + Clear completion history + Vervollständigungshistorie löschen + + + + Search Engine + Suchmaschine + + + + + Search has finished + Suche abgeschlossen + + + + An error occured during search... + Während der Suche ist ein Fehler aufgetreten ... + + + + Search aborted + Suche abgebrochen + + + + Search returned no results + Suche lieferte keine Ergebnisse + + + + Results + i.e: Search results + Ergebnisse + + + Search plugin download error + Such-Plugin Download Fehler + + + Couldn't download search plugin update at url: %1, reason: %2. + Konnte Such-Plugin Update nicht von URL: %1 laden, Begründung: %2. + + + + + Unknown + Unbekannt + + + + SearchTab + + + Name + i.e: file name + Dateiname + + + + Size + i.e: file size + Dateigrösse + + + + Seeders + i.e: Number of full sources + Seeder + + + + Leechers + i.e: Number of partial sources + Leecher + + + + Search engine + Suchmaschine + + + + TrackersAdditionDlg + + + Trackers addition dialog + Dialog zum hinzufügen eines Trackers + + + + List of trackers to add (one per line): + Liste der hinzuzufügenden Tracker (einer pro Zeile): + + + + Ui + + qBittorrent + qBittorrent + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Ich möchte sourceforge.net für dasHosting des qBittorrent Projektes danken. + + + I would like to thank the following people who volonteered to translate qBittorrent: + Ich möchte folgenden freiwilligen Übersetzern danken: + + + Please contact me if you would like to translate qBittorrent to your own language. + Bitte kontaktieren Sie mich wenn Sie qBittorrent in Ihre Sprache übersetzen möchten. + + + I would like to thank the following people who volunteered to translate qBittorrent: + Ich möchte folgenden freiwilligen Übersetzern danken: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Ich möchte mich bei sourceforge.net für das Hosting des qbittorrent Projektes bedanken.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Weiterhin möchte ich mich bei Jeffrey Fernandez (developer@jefferyfernandez.id.au), unserem RPM packager, für seine großartige Arbeit bedanken.</li></ul> + + + Preview impossible + Vorschau unmöglich + + + Sorry, we can't preview this file + Bedauere, wir können keine Vorschau für diese Datei erstellen + + + Name + Name + + + Size + Grösse + + + Progress + Fortschritt + + + No URL entered + Keine URL eingegeben + + + Please type at least one URL. + Bitte geben Sie mindestens eine URL an. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Bitte kontaktieren Sie mich, falls Sie qBittorrent in Ihre Sprache übersetzen wollen. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Ich möchte folgenden freiwilligen Übersetzern danken: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Bitte kontaktieren Sie mich, falls Sie qBittorrent in Ihre Sprache übersetzen wollen. + + + + addTorrentDialog + + + Torrent addition dialog + Dialog zum hinzufügen eines Torrent + + + + Save path: + Speicher-Pfad: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + Unbekannt + + + + Free disk space: + + + + + Torrent content: + Torrent Inhalt: + + + + Download in sequential order (slower but good for previewing) + + + + File name + Datei Name + + + File size + Datei-Grösse + + + Selected + Ausgewählt + + + Download in correct order (slower but good for previewing) + In richtiger Reihenfolge herunterladen (langsamer, aber besser zum Vorschauen) + + + + Add to download list in paused state + Der Download Liste im Pause-Modus hinzufügen + + + + Add + Hinzufügen + + + + Cancel + Abbrechen + + + select + Auswählen + + + Unselect + Auswahl aufheben + + + Select + Auswählen + + + + Ignored + Ignoriert + + + + Normal + Normal + + + + High + Hoch + + + + Maximum + Maximum + + + + Collapse all + Alle reduzieren + + + + Expand all + Alle erweitern + + + + authentication + + + + Tracker authentication + Tracker Authentifizierung + + + + Tracker: + Tracker: + + + + Login + Login + + + + Username: + Benutzername: + + + + Password: + Kennwort: + + + + Log in + Einloggen + + + + Cancel + Abbrechen + + + + bandwidth_dlg + + + Bandwidth allocation + Bandbreiten Zuordnung + + + + KiB/s + KB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 hat das gesetzte maximale Verhältnis erreicht. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' wurde endgültig entfernt. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' wurde entfernt. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' wird angehalten. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' wird fortgesetzt. + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' befindet sich bereits in der Download-Liste. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wird fortgesetzt. (Schnelles Fortsetzen) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' wurde der Download-Liste hinzugefügt. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kann Torrent Datei nicht dekodieren: '%1' + + + + This file is either corrupted or this isn't a torrent. + Diese Datei ist entweder beschädigt, oder kein Torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>wurde geblockt aufgrund Ihrer IP Filter</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>wurde gebannt aufgrund von beschädigten Teilen</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + Konnte nicht auf den angegebenen Ports lauschen. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port Mapping Fehler, Fehlermeldung: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port Mapping erfolgreich, Meldung: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Fast-Resume Daten für den Torrent %1 wurden zurückgewiesen, prüfe erneut... + + + + Url seed lookup failed for url: %1, message: %2 + URL Seed Lookup für die URL: %1 ist fehlgeschlagen, Meldung: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Lade '%1', bitte warten... + + + + createTorrentDialog + + Create Torrent file + Erstelle Torrent Datei + + + Destination torrent file: + Ziel-Torrent Datei: + + + Input file or directory: + Eingangs-Datei oder -Verzeichnis: + + + Comment: + Kommentar: + + + ... + ... + + + Create + Erstellen + + + + Cancel + Abbrechen + + + Announce url (Tracker): + URL anmelden (Tracker): + + + Directory + Verzeichnis + + + + Torrent Creation Tool + Torrenterstellungs Werkzeug + + + <center>Destination torrent file:</center> + <center>Ziel-Torrent Datei:</center> + + + <center>Input file or directory:</center> + <center>Eingangs-Datei oder -Verzeichnis:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>URL anmelden:<br>(Eine pro Zeile)</center> + + + <center>Comment:</center> + <center>Kommentar:</center> + + + + Torrent file creation + Torrent-Datei Erstellung + + + Input files or directories: + Eingangs-Dateien oder -Verzeichnisse: + + + + Announce urls (trackers): + Announce URLs (Tracker): + + + + Comment (optional): + Kommentar (optional): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privat (wird nicht im Trackerlosen Netzwerk / DHT verbreitet, wenn aktiviert) + + + + Web seeds urls (optional): + Web Seeds URLs (optional): + + + + File or folder to add to the torrent: + Datei oder Ordner die dem Torrent hinzugefügt werden: + + + Add a file + Datei hinzufügen + + + Add a folder + Ordner hinzufügen + + + + Add file + + + + + Add folder + + + + + Piece size: + Größe der Stücke: + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + Privat (wird nicht an das DHT Netzwerk verteilt) + + + + Start seeding after creation + Beginne Seeding nach Erstellung + + + + Create and save... + Erstellen und speichern... + + + + Progress: + Fortschritt: + + + + createtorrent + + + Select destination torrent file + Ziel-Torrent Datei auswählen + + + + Torrent Files + Torrent Dateien + + + Select input directory or file + Eingangs-Datei oder -Verzeichnis wählen + + + No destination path set + Kein Ziel-Pfad gesetzt + + + Please type a destination path first + Bitte geben Sie zuerst einen Zielpfad ein + + + + No input path set + Kein Eingangs-Pfad gesetzt + + + + Please type an input path first + Bitte geben Sie zuerst einen Eingangspfad an + + + Input path does not exist + Eingangs-Pfad existiert nicht + + + Please type a correct input path first + Bitte geben Sie einen gültigen Eingangs-Pfad an + + + + + + Torrent creation + Torrent Erstellung + + + + Torrent was created successfully: + Torrent erfolgreich erstellt: + + + Please type a valid input path first + Bitte geben Sie zuerst einen gültigen Eingangs Pfad ein + + + + Select a folder to add to the torrent + Ordner wählen um ihn dem Torrent hinzuzufügen + + + Select files to add to the torrent + Dateien wählen um sie dem Torrent hinzuzufügen + + + + Please type an announce URL + Bitte Announce URL eingeben + + + + Torrent creation was unsuccessful, reason: %1 + Torrent Erstellung nicht erfolgreich, Grund: %1 + + + + Announce URL: + Tracker URL + Announce URL: + + + + Please type a web seed url + Bitte Web Seed URL eingeben + + + + Web seed URL: + Web Seed URL: + + + + Select a file to add to the torrent + Datei wählen um sie dem Torrent hinzuzufügen + + + No tracker path set + Pfad zu Tracker nicht gesetzt + + + Please set at least one tracker + Bitte geben Sie mindestens einen Tracker an + + + + Created torrent file is invalid. It won't be added to download list. + Die erstellte Torrent-Datei ist ungültig. Sie wird nicht der Donwload-Liste hinzugefügt. + + + + downloadFromURL + + + Download Torrents from URLs + Torrents von URLs laden + + + + Only one URL per line + Nur eine URL pro Zeile + + + + Download + Lade + + + + Cancel + Abbrechen + + + + Download from urls + Von URLs laden + + + + No URL entered + Keine URL eingegeben + + + + Please type at least one URL. + Bitte geben Sie mindestens eine URL an. + + + + downloading + + + Search + Suche + + + Total DL Speed: + Gesamte DL Geschwindigkeit: + + + KiB/s + KiB/s + + + Session ratio: + Sitzungs Verhältniss: + + + Total UP Speed: + Gesamte UP Geschwindigkeit: + + + Log + Log + + + IP filter + IP Filter + + + + Start + Start + + + + Pause + Anhalten + + + + Delete + Löschen + + + Clear + Leeren + + + + Preview file + Vorschau Datei + + + + Set upload limit + Upload Begrenzung einstellen + + + + Set download limit + Download Begrenzung einstellen + + + + Delete Permanently + Endgültig löschen + + + + Torrent Properties + Torrent Eigenschaften + + + + Open destination folder + Zielverzeichniss öffnen + + + + Name + Name + + + + Size + Größe + + + + Progress + Fortschritt + + + + DLSpeed + DL-Geschwindigkeit + + + + UpSpeed + UP-Geschwindigkeit + + + + Seeds/Leechs + Seeds/Leechs + + + + Ratio + Verhältnis + + + + ETA + voraussichtliche Ankunftszeit + + + + Buy it + Kaufen + + + + Priority + Priorität + + + + Increase priority + Erhöhe Prorität + + + + Decrease priority + Verringere Priorität + + + + Force recheck + Erzwinge erneutes Überprüfen + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + Suchplugins + + + + Installed search engines: + Installierte Suchmaschinen: + + + + Name + Name + + + + Url + URL + + + + Enabled + Aktiviert + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Sie können neue Suchmaschinen Plugins hier herunterladen: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Intalliere ein neue + + + + Check for updates + Auf Updates prüfen + + + + Close + Schließen + + + + Enable + Aktivieren + + + + Disable + Deaktivieren + + + + Uninstall + Deinstallieren + + + + engineSelectDlg + + True + Wahr + + + False + Falsch + + + + Uninstall warning + Deinstallations Warnung + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Einige Plugins konnten nicht deinstalliert werden, da sie ein fester Bestandteil von qBitttorrent sind. + Nur Plugins, die sie selber installiert haben können wieder entfernt werden. +Die Plugins wurden jedoch deaktiviert. + + + + Uninstall success + Deinstallation erfolgreich + + + All selected plugins were uninstalled successfuly + Alle ausgewählten Plugins wurden erfolgreich deinstalliert + + + + Select search plugins + Wähle Suchplugin + + + + + qBittorrent search plugins + qBittorrent Suchplugins + + + + + + + + + + + Search plugin install + Suchplugin installieren + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Eine neuere Version des Suchmaschinen Plugins %1 ist bereits installiert. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Das Suchmaschinen Plugin %1 wurde erfolgreich geupdated. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Das Suchmaschinen Plugin wurde erfolgreich installiert. + + + + + + + + Search plugin update + Such-Plugin update + + + + + Sorry, update server is temporarily unavailable. + Update Server vorübergehend nicht erreichbar. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Das Suchplugin %1 wurde erfolgreich geupdated. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Update des Suchplugins %1 fehlgeschlagen. + + + + All your plugins are already up to date. + Alle Plugins sind auf dem neuesten Stand. + + + + All selected plugins were uninstalled successfully + Alle ausgewählten Plugins wurden erfolgreich deinstalliert + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 Suchmaschinen Plugin konnte nich aktualisiert werden, behalte alte Version. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 Suchmaschinen Plugin konnte nicht installiert werden. + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 Suchmaschinen Plugin wurder erfolgreich geupdated. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 Suchmaschinen Plugin wurde erfolgreich installiert. + + + + Search engine plugin archive could not be read. + Konnte Suchmaschinen Plugin Archiv nicht lesen. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Installation des Suchmaschinen Plugins %1 fehlgeschlagen. + + + + New search engine plugin URL + Neue Suchmaschinen Plugin URL + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KB + + + + MiB + mebibytes (1024 kibibytes) + MB + + + + GiB + gibibytes (1024 mibibytes) + GB + + + + TiB + tebibytes (1024 gibibytes) + TB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Unknown + Unbekannt + + + + Unknown + Unknown (size) + Unbekannt + + + + < 1m + < 1 minute + < 1 Minute + + + + %1m + e.g: 10minutes + %1 Min + + + + %1h%2m + e.g: 3hours 5minutes + %1 Std %2 Min + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1 Tage %2 Std %3 Min + + + + options_imp + + Options saved successfully! + Optionen erfolgreich gespeichert! + + + Choose Scan Directory + Wähle zu durchsuchendes Verzeichnis + + + Choose save Directory + Wähle Speicher Verzeichnis + + + Choose ipfilter.dat file + Wähle ipfilter.dat Datei + + + Couldn't open: + Konnte Datei nicht öffnen: + + + in read mode. + im Schreibmodus. + + + Invalid Line + Ungültige Zeile + + + Line + Zeile + + + is malformed. + ist fehlerhaft. + + + Range Start IP + Bereich Start IP + + + Start IP: + Start IP: + + + Incorrect IP + Fehlerhafte IP + + + This IP is incorrect. + Diese IP ist fehlerhaft. + + + Range End IP + Bereich End IP + + + End IP: + End IP: + + + IP Range Comment + IP Bereich Kommentar + + + Comment: + Kommentar: + + + to + <min port> to <max port> + bis + + + Choose your favourite preview program + Wählen Sie ihr bevorzugtes Vorschau Programm + + + Invalid IP + Ungültige IP + + + This IP is invalid. + Diese IP ist ungültig. + + + Options were saved successfully. + Optionen wurden erfolgreich gespeichert. + + + + + Choose scan directory + Verzeichnis zum scannen auswählen + + + Choose an ipfilter.dat file + ipfilter.dat Datei auswählen + + + + + Choose a save directory + Verzeichnis zum Speichern auswählen + + + Couldn't open %1 in read mode. + Kein Lesezugriff auf %1. + + + + + Choose an ip filter file + IP-Filter-Datei wählen + + + + + Filters + Filter + + + + pluginSourceDlg + + + Plugin source + Plugin Quelle + + + + Search plugin source: + Such Plugin Quelle: + + + + Local file + Lokale Datei + + + + Web link + Web Link + + + + preview + + + Preview selection + Vorschau Auswahl + + + + File preview + Datei vorschauen + + + + The following files support previewing, <br>please select one of them: + Die folgenden Dateien unterstützen Vorschau, <br>bitte wählen Sie eine: + + + + Preview + Vorschau + + + + Cancel + Abbrechen + + + + previewSelect + + + + Preview impossible + Vorschau unmöglich + + + + + Sorry, we can't preview this file + Bedauere, wir können keine Vorschau für diese Datei erstellen + + + + Name + Name + + + + Size + Größe + + + + Progress + Verlauf + + + + properties + + + Torrent Properties + Torrent Eigenschaften + + + + OK + OK + + + Cancel + Abbrechen + + + Main Infos + Hauptinfos + + + Download state: + Download Status: + + + Current Tracker: + Aktueller Tracker: + + + Number of Peers: + Anzahl der Peers: + + + dlState + dlStatus + + + tracker_URL + Tracker URL + + + nbPeers + nbPeers + + + (Complete: 0.0%, Partial: 0.0%) + (Komplett: 0.0%, Unvollständig: 0,0%) + + + File Name + Datei Name + + + Current Session + Aktuelle Session + + + Total Uploaded: + Upload gesamt: + + + Total Downloaded: + Download gesamt: + + + Total Failed: + Verworfen gesamt: + + + upTotal + upGesamt + + + dlTotal + dlGesamt + + + failed + verworfen + + + Torrent Content + Torrent Inhalt + + + + Files contained in current torrent: + Dateien im aktuellen Torrent: + + + Finished + Beendet + + + Queued for checking + Zur Überprüfung eingereiht + + + Checking files + Überprüfe Dateien + + + Connecting to tracker + Verbinde zu Tracker + + + Downloading Metadata + Lade Metadaten + + + Downloading + Lade + + + Seeding + Seeding + + + Allocating + Teile zu + + + Unreachable? + Unerreichbar? + + + MB + MB + + + + Unknown + Unbekannt + + + Complete: + Komplett: + + + Partial: + Unvollständig: + + + Tracker + Tracker + + + + Trackers: + Tracker: + + + Unselect + Auswahl aufheben + + + Select + Auswählen + + + You can select here precisely which files you want to download in current torrent. + Sie können hier präzise wählen, welche Dateien aus dem aktuellen Torrent downgeloadet werden. + + + + Size + Grösse + + + Selected + Ausgewählt + + + + + None - Unreachable? + Keine - Unerreichbar? + + + False + Falsch + + + True + Wahr + + + Errors: + Fehler: + + + + Progress + Fortschritt + + + Main infos + Haupt-Informationen + + + Number of peers: + Anzahl der Peers: + + + + Current tracker: + Derzeitiger Tracker: + + + + Total uploaded: + Gesamter Upload: + + + + Main info + Hauptinformation + + + + Torrent information + Torrentinformation + + + + Total downloaded: + Gesamter Download: + + + + Total failed: + Insgesamt fehlgeschlagen: + + + + Torrent content + Torrent Inhalt + + + Options + Optionen + + + + Download in correct order (slower but good for previewing) + In richtiger Reihenfolge herunterladen (langsamer, aber besser zum Vorschauen) + + + Share Ratio: + Share Verhältnis: + + + Seeders: + Seeder: + + + Leechers: + Leecher: + + + + Save path: + Speicher-Pfad: + + + Torrent infos + Torrent Infos + + + + Creator: + Ersteller: + + + + Torrent hash: + Torrent Prüfsumme: + + + + Comment: + Kommentar: + + + + Current session + Derzeitige Sitzung + + + + Share ratio: + Share Verhältnis: + + + + Trackers + Tracker + + + New tracker + neuer Tracker + + + New tracker url: + neue Tracker URL: + + + + Priorities: + Prioritäten: + + + + Normal: normal priority. Download order is dependent on availability + Normal: Normale Priorität. Die Download Reihenfolge hängt von der Verfügbarkeit ab + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Hoch: höher als normal. Bevorzugte Teile werden Teilen gleicher Verfügbarkeit vorgezogen, jedoch nicht Teilen mit einer besseren Verfügbarkeit + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximum: Höchste Priorität, die Verfügbarkeit wird nicht beachtet, das Teil wird allen anderen Teilen mit niedrigerer Priorität bevorzugt + + + + File name + Dateiname + + + + + Priority + Priorität + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + die Tracker Liste kann nicht leer sein. + + + + Ignored: file is not downloaded at all + Ignoriert: Datei wird nicht heruntergeladen + + + + Ignored + Ignoriert + + + + Normal + Normal + + + + Maximum + Maximum + + + + High + Hoch + + + + Url seeds + URL Seeds + + + + New url seed: + Neue URL Seeds: + + + + This url seed is already in the list. + Dieser URL Seed ist bereits in der Liste. + + + Hard-coded url seeds cannot be deleted. + Fest verdrahtete URL Seeds können nicht gelöscht werden. + + + None + i.e: No error message + Keine + + + + New url seed + New HTTP source + Neuer URL Seed + + + + The following url seeds are available for this torrent: + Die folgenden URL Seeds sind für diesen Torrent nicht erhältlich: + + + + Priorities error + Prioritätsfehler + + + + Error, you can't filter all the files in a torrent. + Sie können nicht alle Dateien aus einem Torrent filtern. + + + + Downloaded pieces + Download Stücke + + + + Collapse all + Alle reduzieren + + + + Expand all + Alle erweitern + + + + ... + ... + + + + + Choose save path + Wählen Sie den Speicher-Pfad + + + + Save path creation error + Fehler beim erstellen des Speicher-Pfades + + + + Could not create the save path + Speicher-Pfad konnte nicht erstellt werden + + + + search_engine + + + + Search + Suche + + + Search Engines + Such-Maschinen + + + Search Pattern: + Suchanfrage: + + + Stop + Stop + + + + Status: + Status: + + + + Stopped + Angehalten + + + Results: + Ergebnisse: + + + + Download + Lade + + + Clear + Leeren + + + Update search plugin + "Such"-Plugin updaten + + + + Search engines... + Suchmaschinen... + + + Close tab + Schließe Tab + + + + seeding + + + Search + Suche + + + The following torrents are finished and shared: + Die folgenden Torrents sind komplett und werden geseeded: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Note:</u> Es ist wichtig, dass heruntergeladene Torrents weiter geseedet werden. Dies ist ein wichtiger Bestandteil des Bittorrent Netzwerkes. + + + + Start + Start + + + + Pause + Anhalten + + + + Delete + Löschen + + + + Delete Permanently + Endgültig löschen + + + + Torrent Properties + Torrent Eigenschaften + + + + Preview file + Vorschau Datei + + + + Set upload limit + setze Upload Begrenzung + + + + Open destination folder + Zielverzeichniss öffnen + + + + Name + Name + + + + Size + Größe + + + + Upload Speed + Upload-Geschwindigkeit + + + + + Connected peers + Verbundene Peers + + + + + Seeds / Leechers + Seeder / Leecher + + + + Copy magnet link + + + + Leechers + Leecher + + + + Ratio + Verhältnis + + + + Buy it + Kaufen + + + + Total uploaded + Insgesamt hochgeladen + + + Priority + Priorität + + + Increase priority + Erhöhe Prorität + + + Decrease priority + Verringere Priorität + + + + Force recheck + Erzwinge erneutes Überprüfen + + + + subDownloadThread + + + Host is unreachable + Host ist unerreichbar + + + + File was not found (404) + Datei nicht gefunden (404) + + + + Connection was denied + Verbindung verweigert + + + + Url is invalid + URL ist ungültig + + + + I/O Error + + + + Connection forbidden (403) + Verbindung verboten (403) + + + Connection was not authorized (401) + Verbindung war nicht authorisiert (401) + + + Content has moved (301) + Inhalt wurde verschoben (301) + + + + Connection failure + Verbindungs-Fehler + + + + Connection was timed out + Verbidung wurde unterbrochen + + + + Incorrect network interface + Falsches Netzwerk Interface + + + + Unknown error + Unbekannter Fehler + + + + Could not resolve proxy + Der Proxy konnte nicht aufgelöst werden + + + + torrentAdditionDialog + + True + Wahr + + + + + Unable to decode torrent file: + Torrent Datei kann nicht dekodiert werden: + + + This file is either corrupted or this isn't a torrent. + Diese Datei ist entweder beschädigt, oder kein Torrent. + + + + + Choose save path + Wählen Sie den Speicher-Pfad + + + False + Falsch + + + Unknown + Unbekannt + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + Leerer Speicher-Pfad + + + + Please enter a save path + Bitte geben Sie einen Speicher-Pfad ein + + + + Save path creation error + Fehler beim erstellen des Speicher-Pfades + + + + Could not create the save path + Speicher-Pfad konnte nicht erstellt werden + + + + Invalid file selection + Ungültige Datei Auswahl + + + + You must select at least one file in the torrent + Sie müssen mindestens eine Datei aus dem Torrent selektieren + + + + File name + Dateiname + + + + Size + Größe + + + + Progress + Verlauf + + + + + Priority + Priorität + + + diff --git a/src/lang/qbittorrent_el.qm b/src/lang/qbittorrent_el.qm new file mode 100644 index 0000000000000000000000000000000000000000..258436f96d757b3addcaaf372af4d01d73ab3b32 GIT binary patch literal 71511 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 Th7M;(MiiOBm6%+~kRksIv6kd5 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_el.ts b/src/lang/qbittorrent_el.ts new file mode 100644 index 000000000..29c42ff6a --- /dev/null +++ b/src/lang/qbittorrent_el.ts @@ -0,0 +1,5749 @@ + + + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + + About qBittorrent + Σχετικά με το qBittorrent + + + + About + Σχετικά + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ένα τόρεντ πρόγραμμα γραμμένο σε C++, βασισμένο στην εργαλειοθήκη Qt4 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">και το libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Αρχική Σελίδα:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Δημιουργός + + + + Name: + Όνομα: + + + + Country: + Χώρα: + + + + E-mail: + Διεύθυνση ηλ.ταχυδρομείου: + + + + Home page: + Δικτυακός τόπος: + + + + Christophe Dumez + Christophe Dumez + + + + France + Γαλλία + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Ευχαριστίες + + + + Translation + Μετάφραση + + + + License + Άδεια + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Ένα τορεντ πελάτης που χρησιμοποιεί Qt4 και libtorrent, προγραμματισμένος σε C++.<br> +<br> +Copyright © 2006 από τον Christophe Dumez<br> +<br> <u>Ιστοσελίδα:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + qBittorrent Δημιουργός + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + Ημ/νία γέννησης: + + + + Occupation: + Απασχόληση: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Φοιτητής επιστήμης των υπολογιστών + + + + Thanks to + Ευχαριστώ + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + 'Ενα πρόγραμμα τορεντ που χρησιμοποιεί τα Qt4 και libtorrent, προγραμματισμένο στη C++.<br> +<br> +Copyright © 2006 από τον Christophe Dumez<br> +<br> <u>Ιστοσελίδα:</u> <i>http://www.qbittorrent.org</i><br> + + + + BandwidthAllocationDialog + + + Upload limit: + Όριο Ανεβάσματος: + + + + Download limit: + Όριο Κατεβάσματος: + + + + + + + Unlimited + Unlimited (bandwidth) + Απεριόριστο + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + Κονσόλα qBittorrent + + + + General + Γενικά + + + + Blocked IPs + Μποκαρισμένες IP + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Ρυθμίσεις -- qBittorrent + + + Options + Ρυθμίσεις + + + Main + Κύρια + + + Save Path: + Αποθήκευση σε: + + + Download Limit: + Όριο Κατεβάσματος: + + + Upload Limit: + Όριο Ανεβάσματος: + + + Max Connects: + Μέγ. Συνδέσεις: + + + Port range: + Εύρος Θύρας: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Απενεργοποίηση + + + connections + συνδέσεις + + + to + προς + + + + Proxy + Proxy + + + Proxy Settings + Ρυθμίσεις Proxy + + + Server IP: + IP Εξυπηρετητή: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Θύρα: + + + Proxy server requires authentication + Ο εξυπηρετητής Proxy ζητά πιστοποίηση + + + + + + Authentication + Πιστοποίηση + + + User Name: + Όνομα Χρήστη: + + + + + + Password: + Κωδικός: + + + Enable connection through a proxy server + Ενεργοποίηση σύνδεσης μέσω εξυπηρετητή proxy + + + Language + Γλώσσα + + + Please choose your preferred language in the following list: + Παρακαλώ επιλέξτε την γλώσσα της προτίμησής σας από την παρακάτω λίστα: + + + English + Αγγλικά + + + French + Γαλλικά + + + Simplified Chinese + Απλουστευμένα Κινέζικα + + + OK + Εντάξει + + + Cancel + Άκυρο + + + Language settings will take effect after restart. + Οι ρυθμίσεις γλώσσας θα αλλάξουν μετά την επανεκίννηση. + + + Scanned Dir: + Σαρωμένοι Φάκελοι: + + + Enable directory scan (auto add torrent files inside) + Ενεργοποίηση σάρωσης φακέλου (αυτόματη προσθήκη αρχείων τορεντ) + + + Korean + Κορεάτικα + + + Spanish + Ισπανικά + + + German + Γερμανικά + + + Connection Settings + Ρυθμίσεις Σύνδεσης + + + Share ratio: + Ποσοστό μοιράσματος: + + + 1 KB DL = + 1 KB DL= + + + KB UP max. + Μέγ. KB Up. + + + + Activate IP Filtering + Ενεργοποίηση Φιλτραρίσματος ΙΡ + + + + Filter Settings + Ρυθμίσεις Φίλτρου + + + ipfilter.dat URL or PATH: + ipfilter.dat Διεύθυνση ή διαδρομή: + + + Start IP + Αρχή ΙΡ + + + End IP + Τέλος ΙΡ + + + Origin + Καταγωγή + + + Comment + Σχόλιο + + + Apply + Εφαρμογή + + + + IP Filter + Φίλτρο ΙΡ + + + Add Range + Προσθήκη Εύρους + + + Remove Range + Αφαίρεση Εύρους + + + Catalan + Καταλανικά + + + ipfilter.dat Path: + ipfilter.dat διαδρομή: + + + Clear finished downloads on exit + Εκκαθάριση τελειωμένων κατεβασμάτων κατά την έξοδο + + + Ask for confirmation on exit + Ερώτηση για επιβεβαίωση κατά την έξοδο + + + Go to systray when minimizing window + Εμφάνιση στην μπάρα συστήματος κατά την ελαχιστοποίηση παραθύρου + + + Misc + Άλλα + + + Localization + Ρυθμίσεις Τοποθεσίας + + + + Language: + Γλώσσα: + + + Behaviour + Συμπεριφορά + + + OSD + OSD + + + Always display OSD + Εμφάνιση πάντα OSD + + + Display OSD only if window is minimized or iconified + Εμφάνιση OSD μόνο αν το παράθυρο είναι ελαχιστοποιημένο ή εικονοποιημένο + + + Never display OSD + Απόκρυψη OSD + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB Κατ.= + + + KiB UP max. + KiB ανέβ. μέγ. + + + DHT (Trackerless): + DHT (χωρίς ηχνηλάτη): + + + Disable DHT (Trackerless) support + Απενεργοποίηση υποστήριξης DHT (χωρίς ηχνηλάτη) + + + Automatically clear finished downloads + Αυτόματη εκκαθάριση ολοκληρωμένων κατεβασμάτων + + + Preview program + Πρόγραμμα προεπισκόπησης + + + Audio/Video player: + Αναπαραγωγή Ήχου/Βίντεο: + + + DHT configuration + Ρυθμίσεις DHT + + + + DHT port: + Θύρα DHT: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Σημείωση:</b> Οι αλλαγές θα εφαρμοσθούν μετά την επανεκίννηση του qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Σημείωση Μεταφραστών:</b> Αν το qBittorrent δεν είναι διαθέσιμο στη γλώσσα σας, <br/> και αν θα θέλατε να το μεταφράσετε στη μητρική σας γλώσσα, <br/>παρακαλώ επικοινωνήστε μαζί μου (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Εμφάνιση διαλόγου προσθήκης τορεντ κάθε φορά που προσθέτω ένα τορεντ + + + Default save path + Προεπιλεγμένη διαδρομή αποθήκευσης + + + Systray Messages + Μηνύματα Μπάρας Εργασιών + + + Always display systray messages + Εμφάνιση πάντοτε μηνυμάτων στη μπάρα εργασιών + + + Display systray messages only when window is hidden + Εμφάνιση μηνυμάτων στη μπάρα εργασιών μόνο όταν το παράθυρο είναι κρυμμένο + + + Never display systray messages + Μη εμφάνιση μηνυμάτων στη μπάρα εργασιών + + + Disable DHT (Trackerless) + Απενεργοποίηση DHT (Χωρίς Ιχνηλάτη) + + + Disable Peer eXchange (PeX) + Απενεργοποίηση Μοιράσματος Συνδέσεων (PeX) + + + Go to systray when closing main window + Εμφάνιση στην μπάρα συστήματος στο κλείσιμο κυρίως παραθύρου + + + + Connection + Σύνδεση + + + Peer eXchange (PeX) + Μοίρασμα Συνδέσεων (PeX) + + + DHT (trackerless) + DHT (Χωρίς Ιχνηλάτη) + + + Torrent addition + Προσθήκη τορεντ + + + Main window + Κυρίως παράθυρο + + + Systray messages + Μηνύματα μπάρας εργασιών + + + Directory scan + Σάρωση φακέλου + + + Style (Look 'n Feel) + Στυλ (Look 'n Feel) + + + + Plastique style (KDE like) + Πλαστικό στυλ (KDE like) + + + Cleanlooks style (GNOME like) + "Καθαρό" στυλ (GNOME like) + + + Motif style (default Qt style on Unix systems) + Στυλ μοτίβ (προκαθορισμένο στυλ του Qt σε Unix συστήματα) + + + + CDE style (Common Desktop Environment like) + Στυλ CDE (Common Desktop Environment like) + + + MacOS style (MacOSX only) + Στυλ MacOS (μόνο MacOSX) + + + Exit confirmation when the download list is not empty + Επιβεβαίωση εξόδου όταν η λίστα κατεβάσματος δεν είναι άδεια + + + Disable systray integration + Απενεργοποίηση εμφάνισης στη μπάρα εργασιών + + + WindowsXP style (Windows XP only) + Στυλ WindowsXP (μόνο WindowsXP) + + + Server IP or url: + IP ή url Διαμοιραστή: + + + Proxy type: + Τύπος Proxy: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Επηρεασμένες συνδέσεις + + + + Use proxy for connections to trackers + Χρήση proxy για σύνδεση με ιχνηλάτες + + + + Use proxy for connections to regular peers + Χρήση proxy για σύνδεση με όλους τους χρήστες + + + + Use proxy for connections to web seeds + Χρήση proxy για σύνδεση με διαμοιραστές διαδικτύου + + + + Use proxy for DHT messages + Χρήση proxy για μηνύματα DHT + + + Encryption + Κρυπτογράφηση + + + Encryption state: + Κατάσταση κρυπτογράφησης: + + + + Enabled + Ενεργοποιημένο + + + + Forced + Αναγκαστικά + + + + Disabled + Απενεργοποιημένο + + + + Preferences + Προτιμήσεις + + + General + Γενικά + + + Network + Δίκτυο + + + + User interface settings + Ρυθμίσεις interface χρήστη + + + + Visual style: + Στυλ: + + + + Cleanlooks style (Gnome like) + Στυλ cleanlooks (Gnome like) + + + + Motif style (Unix like) + Στυλ motif (Unix like) + + + + Ask for confirmation on exit when download list is not empty + Επιβεβαίωση εξόδου όταν η λίστα κατεβάσματος έχει περιεχόμενα + + + + Display current speed in title bar + Ένδειξη τρέχουσας ταχύτητας στην μπάρα τίτλου + + + + System tray icon + Εικόνα μπάρας εργασιών + + + + Disable system tray icon + Απενεργοποίηση εικόνας μπάρας εργασιών + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Κλείσιμο στη μπάρα εργασιών + + + + Minimize to tray + Ελαχιστοποίηση στη μπάρα εργασιών + + + + Show notification balloons in tray + Εμφάνιση μπαλονιών ειδοποιήσεων στη μπάρα εργασιών + + + Media player: + Media player: + + + + Downloads + Κατέβασματα + + + Put downloads in this folder: + Προσθήκη κατεβασμένων σε αυτό το φάκελο: + + + + Pre-allocate all files + Πρώιμη τοποθέτηση όλων των αρχείων + + + + When adding a torrent + Όταν προστίθεται κάποιο τορεντ + + + + Display torrent content and some options + Εμφάνιση περιεχομένων τορεντ και μερικών ρυθμίσεων + + + + Do not start download automatically + The torrent will be added to download list in pause state + Μη αυτόματη εκκίνηση κατεβάσματος + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Παρακολούθηση φακέλου + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Το qBittorrent θα κοιτάξει 'εναν φάκελο και θα κατεβάζει αυτόματα τα τορεντ που υπάρχουν + Διπλό κλικ λίστας κατεβασμάτων + + + + Download list: + Λίστα κατεβασμάτων: + + + + + Start/Stop + Έναρξη/Παύση + + + + + Open folder + Άνοιγμα φακέλου + + + + + Show properties + Εμφάνιση ιδιοτήτων + + + + Seeding list: + Λίστα μοιράσματος: + + + + Download folder: + Φάκελος κατεβασμένων: + + + + Temp folder: + Προσωρινός φάκελος: + + + + Automatically download torrents present in this folder: + Αυτόματο κατέβασμα τορεντ που βρίσκονται σε αυτό το φάκελο: + + + + Listening port + Θύρα ακρόασης + + + to + i.e: 1200 to 1300 + ως + + + + Enable UPnP port mapping + Ενεργοποίηση χαρτογράφησης θυρών UPnP + + + + Enable NAT-PMP port mapping + Ενεργοποίηση χαρτογράφησης θυρών NAT-PMP + + + + Global bandwidth limiting + Συνολικό όριο σύνδεσης + + + + Upload: + Ανέβασμα: + + + + Download: + Κατέβασμα: + + + + Bittorrent features + Λειτουργίες Bittorrent + + + + Use the same port for DHT and Bittorrent + Χρήση της ίδιας θύρας για DHT και Bittorrent + + + + Spoof µtorrent to avoid ban (requires restart) + Παραλλαγή του µtorrent για αποφυγή εκδίωξης (απαιτεί επανεκκίνηση) + + + + + Type: + Είδος: + + + + + (None) + (Κανένα) + + + + + Proxy: + Proxy: + + + + + + Username: + Όνομα χρήστη: + + + + Bittorrent + Bittorrent + + + + UI + UI + + + + Connections limit + Όριο συνδέσεων + + + + Global maximum number of connections: + Συνολικός αριθμός μεγίστων συνδέσεων: + + + + Maximum number of connections per torrent: + Μέγιστος αριθμός συνδέσεων ανά τορεντ: + + + + Maximum number of upload slots per torrent: + Μέγιστες θυρίδες ανεβάσματος ανά τορεντ: + + + Additional Bittorrent features + Πρόσθετα χαρακτηριστικά Bittorrent + + + + Enable DHT network (decentralized) + Ενεργοποίηση δικτύου DHT (αποκεντροποιημένο) + + + Enable Peer eXchange (PeX) + Ενεργοποίηση Μοιράσματος Συνδέσεων (PeX) + + + + Enable Local Peer Discovery + Ενεργοποίηση Ανακάλυψης Νέων Συνδέσεων + + + + Encryption: + Κρυπτογράφηση: + + + + Share ratio settings + Ρυθμίσεις ποσοστού μοιράσματος + + + + Desired ratio: + Επιθυμητή αναλογία: + + + + Filter file path: + Διαδρομή αρχείου φίλτρου: + + + + transfer lists refresh interval: + χρονικό διάστημα ανανέωσης λιστών μεταφοράς: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + χρονικό διάστημα ανανέωσης παροχών RSS: + + + + minutes + λεπτά + + + + Maximum number of articles per feed: + Μέγιστος αριθμός άρθρων ανά τροφοδοσία: + + + + File system + Σύστημα αρχείων + + + + Remove finished torrents when their ratio reaches: + Αφαίρεση τελειωμένων τορεντ όταν η αναλογία τους φτάσει στο: + + + + System default + Προεπιλογή συστήματος + + + + Start minimized + Εκκίνηση σε ελαχιστοποίηση + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Δράση κατά το διπλό κλικ στις λίστες προς μεταφορά + + + In download list: + Στη λίστα κατεβάσματος: + + + Pause/Start torrent + Παύση/Εκκίνηση τορεντ + + + Open destination folder + Άνοιγμα φακέλου προορισμού + + + Display torrent properties + Προβολή ιδιοτήτων τορεντ + + + In seeding list: + Στη λίστα διαμοιράσματος: + + + Folder scan interval: + Χρονική περίοδος σάρωσης φακέλου: + + + seconds + δευτερόλεπτα + + + Spoof Azureus to avoid ban (requires restart) + Προσομοίωση σε Azureus για αποφυγή ban (απαιτεί επανεκκίνηση) + + + + Web UI + Web UI + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Δράση που εκτελείται όταν γίνεται διπλό κλικ σε ένα αντικείμενο στην λίστα κατεβασμάτων/ανεβασμάτων + Δράση διπλού κλικ + + + + Port used for incoming connections: + Θύρα που χρησιμοποιείται για εισερχόμενες συνδέσεις: + + + + Random + Τυχαία + + + + Enable Web User Interface + Ενεργοποίηση Interface Δικτυακού Χρήστη + + + + HTTP Server + Διακομοιστής HTTP + + + + Enable RSS support + Ενεργοποίηση υποστήριξης RSS + + + + RSS settings + Ρυθμίσεις RSS + + + + Torrent queueing + Σειρά τορεντ + + + + Enable queueing system + Ενεργοποίηση συστήματος σειρών + + + + Maximum active downloads: + Μέγιστα ενεργά κατεβάσματα: + + + + Maximum active torrents: + Μέγιστα ενεργά τορεντ: + + + + Display top toolbar + Εμφάνιση άνω μπάρας εργαλείων + + + + Search engine proxy settings + Ρυθμίσεις proxy μηχανής αναζήτησης + + + + Bittorrent proxy settings + Ρυθμίσεις proxy bittorrent + + + + Maximum active uploads: + Μέγιστα ενεργά ανεβάσματα: + + + + DownloadingTorrents + + + Name + i.e: file name + Όνομα + + + + Size + i.e: file size + Μέγεθος + + + + Progress + i.e: % downloaded + Πρόοδος + + + + DL Speed + i.e: Download speed + DL Ταχύτητα + + + + UP Speed + i.e: Upload speed + UP Ταχύτητα + + + + Seeds/Leechers + i.e: full/partial sources + δηλ.:πλήρεις/ελλειπείς πηγές + Διαμοιραστές/Συνδέσεις + + + Seeds/Leechs + i.e: full/partial sources + Διαμοιραστές/Συνδέσεις + + + + Ratio + Αναλογία + + + + ETA + i.e: Estimated Time of Arrival / Time left + Χρόνος που απομένει + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + Εκκινήθηκε το qBittorrent %1. + + + Be careful, sharing copyrighted material without permission is against the law. + Προσοχή, η διακίνηση υλικού προστατευόμενου από πνευματικά δικαιώματα χωρίς άδεια είναι παράνομη. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>αποκλείστηκε</i> + + + Fast resume data was rejected for torrent %1, checking again... + Γρήγορη συνέχεια κατεβάσματος αρχείων απορρίφθηκε για το τορεντ %1, επανέλεγχος... + + + Url seed lookup failed for url: %1, message: %2 + Αποτυχία ελέγχου url μοιράσματος για το url: %1, μήνυμα: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + Το '%1' προστέθηκε στη λίστα κατεβάσματος. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + Το '%1' ξανάρχισε. (γρήγορη επανασύνδεση) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + Το '%1' είναι ήδη στη λίστα κατεβάσματος. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: '%1' + + + This file is either corrupted or this isn't a torrent. + Το αρχείο είτε είναι κατεστραμμένο, ή δεν ειναι ενα τορεντ. + + + Couldn't listen on any of the given ports. + Δεν "ακροάστηκα" καμία σπό τις δωσμένες θύρες. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Κατέβασμα του '%1', παρακαλώ περιμένετε... + + + + Hide or Show Column + Απόκρυψη ή Εμφάνιση Στήλης + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Σφάλμα χαρτογράφησης θυρών, μήνυμα: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Χαρτογράφηση θυρών επιτυχής, μήνυμα: %1 + + + Priority + Προτεραιότητα + + + + FeedDownloader + + + RSS Feed downloader + Κατέβασμα παροχών RSS + + + + RSS feed: + Παροχή RSS: + + + + Feed name + Όνομα παροχής + + + + Automatically download torrents from this feed + Αυτόματο κατέβασμα τορεντ από αυτήν την παροχή + + + + Download filters + Φίλτρο κατεβασμάτων + + + + Filters: + Φίλτρα: + + + + Filter settings + Ρυθμίσεις φίλτρου + + + + Matches: + Αντιστοιχίες: + + + + Does not match: + Δεν αντιστοιχεί: + + + + Destination folder: + Φάκελος προορισμού: + + + + ... + ... + + + + Filter testing + Δοκιμή φίλτρου + + + + Torrent title: + Τίτλος τορεντ: + + + + Result: + Αποτέλεσμα: + + + + Test + Δοκιμή + + + + Import... + Εισαγωγή... + + + + Export... + Εξαγωγή... + + + + + Rename filter + Μετονομασία φίλτρου + + + + + Remove filter + Αφαίρεση φίλτρου + + + + Add filter + Προσθήκη φίλτρου + + + + FeedDownloaderDlg + + + New filter + Νέο φίλτρο + + + + Please choose a name for this filter + Παρακαλώ επιλέξτε ένα όνομα για αυτό το φίλτρο + + + + Filter name: + Όνομα φίλτρου: + + + + + + Invalid filter name + Άκυρο όνομα φίλτρου + + + + The filter name cannot be left empty. + Το όνομα του φίλτρου δεν μπορεί να μείνει κενό. + + + + + This filter name is already in use. + Αυτό το όνομα φίλτρου ήδη χρησιμοποιείται. + + + + Filter testing error + Σφάλμα δοκιμής φίλτρου + + + + Please specify a test torrent name. + Παρακαλώ διευκρινήστε ένα δοκιμαστικό όνομα τορεντ. + + + + matches + αντιστοιχίες + + + + does not match + δεν αντιστοιχεί + + + + Select file to import + Επιλέξτε αρχείο για είσαγωγή + + + + + Filters Files + Αρχεία Φίλτρων + + + + Import successful + Επιτυχής εισαγωγή + + + + Filters import was successful. + Η εισαγωγή των φίλτρων ήταν επιτυχής. + + + + Import failure + Σφάλμα εισαγωγής + + + + Filters could not be imported due to an I/O error. + Τα φίλτρα δεν ήταν δυνατό να εισαχθούν εξαιτίας ενός σφάλματος I/O. + + + + Select destination file + Επιλογή αρχείου προορισμού + + + + Overwriting confirmation + Επιβεβαίωση επανεγγραφής + + + + Are you sure you want to overwrite existing file? + Είστε σίγουρος οτι θέλετε να επανεγγράψετε το υπάρχον αρχείο? + + + + Export successful + Εξαγωγή επιτυχής + + + + Filters export was successful. + Η εξαγωγή των φίλτρων ήταν επιτυχής. + + + + Export failure + Αποτυχία εξαγωγής + + + + Filters could not be exported due to an I/O error. + Τα φίλτρα δεν ήταν δυνατό να εξαχθούν εξαιτίας ενός σφάλματος I/O. + + + + FeedList + + + Unread + Μη διαβασμένα + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O Σφάλμα + + + + + + Couldn't open %1 in read mode. + Αδύνατο το άνοιγμα του %1 σε λειτουργία ανάγνωσης. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + Το %1 δεν είναι έγκυρο αρχείο PeerGuardian P2. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Τελείωσε + + + + Name + i.e: file name + Όνομα + + + + Size + i.e: file size + Μέγεθος + + + + Seeds / Leechers + Διαμοιραστές/Συνδέσεις + + + + Connected peers + Συνδεδεμένοι χρήστες + + + Progress + i.e: % downloaded + Πρόοδος + + + DL Speed + i.e: Download speed + DL Ταχύτητα + + + + UP Speed + i.e: Upload speed + UP Ταχύτητα + + + Seeds/Leechs + i.e: full/partial sources + Διαμοιραστές/Συνδέσεις + + + Status + Κατάσταση + + + ETA + i.e: Estimated Time of Arrival / Time left + Χρόνος που απομένει + + + None + i.e: No error message + Κανένα + + + + Ratio + Αναλογία + + + Leechers + i.e: full/partial sources + Συνδέσεις + + + + Total uploaded + i.e: Total amount of uploaded data + δηλ.: Συνολικό ποσό ανεβασμένων δεδομένων + Σύνολο ανεβασμένων + + + + Hide or Show Column + Απόκρυψη ή Εμφάνιση Στήλης + + + Incomplete torrent in seeding list + Μη τελειωμένο τορεντ στη λίστα μοιράσματος + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Φαίνεται πως η κατάσταση του τορεντ '%1' έχει αλλάξει από 'μοίρασμα' σε 'λήψη'. Θα θέλατε να το μεταφέρετε πίσω στη λίστα κατεβάσματος; (αλλιώς το τορεντ απλά θα διαγραφεί) + + + Priority + Προτεραιότητα + + + + GUI + + + Open Torrent Files + Άνοιγμα Αρχείων τορεντ + + + kb/s + kb/s + + + Unknown + Άγνωστο + + + This file is either corrupted or this isn't a torrent. + Το αρχείο είτε είναι κατεστραμμένο, ή δεν ειναι ενα τορεντ. + + + Are you sure you want to delete all files in download list? + Σίγουρα θέλετε να διαγράψετε όλα τα αρχεία στην λίστα κατεβάσματος? + + + + + + + + &Yes + &Ναι + + + + + + + + &No + &Όχι + + + + Are you sure you want to delete the selected item(s) in download list? + Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα κατεβάσματος? + + + paused + έπαυσε + + + started + άρχισε + + + kb/s + kb/s + + + + Finished + Τελείωσε + + + Checking... + Έλεγχος... + + + Connecting... + Σύνδεση... + + + Downloading... + Κατέβασμα... + + + Download list cleared. + Λίστα κατεβάσματος άδειασε. + + + All Downloads Paused. + Όλα τα Κατεβάσματα Σταμάτησαν. + + + All Downloads Resumed. + Όλα τα Κατεβάσματα συνέχισαν. + + + DL Speed: + Ταχύτητα Κατεβάσματος: + + + started. + ξεκίνησε. + + + UP Speed: + Ταχύτητα Ανεβάσματος: + + + Couldn't create the directory: + Δεν μπόρεσε να δημιουργηθεί η κατηγορία: + + + + Torrent Files + Αρχεία Τορεντ + + + already in download list. + <file> already in download list. + ήδη ατην λίστα κατεβάσματος. + + + added to download list. + προστέθηκε στη λίστα κατεβάσματος. + + + resumed. (fast resume) + συνέχισε. (γρήγορη συνέχεια) + + + Unable to decode torrent file: + Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: + + + removed. + <file> removed. + αφαιρέθηκε. + + + paused. + <file> paused. + έπαυσε. + + + resumed. + <file> resumed. + συνέχισε. + + + m + minutes + λ + + + h + hours + ω + + + d + days + μ + + + Listening on port: + Ακρόαση στη θύρα: + + + qBittorrent + qBittorrent + + + + + qBittorrent + qBittorrent + + + + + + + Are you sure? -- qBittorrent + Είστε σίγουρος? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Ταχύτητα Κατεβάσματος: + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: Από τον Christophe Dumez :: Copyright (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Κατάσταση Σύνδεσης:</b><br>Ενεργή + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Κατάσταση Σύνδεσης:</b><br>Με firewall?<br><i>Χωρίς εισερχόμενες συνδέσεις...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Κατάσταση Σύνδεσης:</b><br>Ανενεργή<br><i>Χωρίς να έχουν βρεθεί συνδέσεις...</i> + + + /s + <unit>/seconds + /s + + + has finished downloading. + έχει τελειώσει το κατέβασμα. + + + Couldn't listen on any of the given ports. + Δεν "ακροάστηκα" καμία σπό τις δωσμένες θύρες. + + + None + Κανένα + + + Empty search pattern + Κενό πρότυπο εύρεσης + + + Please type a search pattern first + Παρακαλώ εισάγετε ένα σχέδιο εύρεσης πρώτα + + + No seach engine selected + Δεν έχει επιλεχθεί μηχανή αναζήτησης + + + You must select at least one search engine. + Πρέπει να επιλέξετε τουλάχιστο μια μηχανή αναζήτησης. + + + Searching... + Αναζήτηση... + + + Could not create search plugin. + Αδύνατο να δημιουργηθεί επέκταση αναζήτησης. + + + Stopped + Σταμάτησε + + + I/O Error + I/O Λάθος + + + Couldn't create temporary file on hard drive. + Αδύνατο να δημιουργηθεί προσωρινό αρχείο στον σκληρό δίσκο. + + + Torrent file URL + URL αρχείου τορεντ + + + KB/s + KB/s + + + KB/s + KB/s + + + Downloading using HTTP: + Κατέβασμα με χρήση HTTP: + + + Torrent file URL: + URL αρχείου τορεντ: + + + A http download failed... + 'Ενα κατέβασμα http απέτυχε... + + + A http download failed, reason: + 'Ενα κατέβασμα http απέτυχε, αιτία: + + + Are you sure you want to quit? -- qBittorrent + Είστε σίγουρος οτι θέλετε να βγείτε? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Είστε σίγουρος οτι θέλετε να βγείτε από το qbittorrent? + + + Error during search... + Σφάλμα κατά την αναζήτηση... + + + Timed out + Προσωρινή διακοπή + + + Failed to download: + Αποτυχία κατεβάσματος: + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + A http download failed, reason: + Ένα κατέβασμα http απέτυχε, λόγος: + + + Stalled + Αποτυχία λειτουργίας + + + Search is finished + Αναζήτηση τελείωσε + + + An error occured during search... + Σφάλμα κατά την εύρεση... + + + Search aborted + Αναζήτηση διεκόπη + + + Search returned no results + Η αναζήτηση δεν έφερε αποτελέσματα + + + Search is Finished + Αναζήτηση τελείωσε + + + Search plugin update -- qBittorrent + Αναβάθμιση plugin αναζήτησης -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin αναζήτησης μπορεί να αναβαθμιστεί, θέλετε να το αναβαθμίσετε; + +Κατάλογος αλλαγών: + + + + Sorry, update server is temporarily unavailable. + Λυπούμαστε, ο εξηπυρετητής αναβάθμισης δεν είναι προσωρινά διαθέσιμος. + + + Your search plugin is already up to date. + Το plugin αναζήτησης είναι ήδη αναβαθμισμένο. + + + Results + Αποτελέσματα + + + Name + Όνομα + + + Size + Μέγεθος + + + Progress + Πρόοδος + + + DL Speed + DL Ταχύτητα + + + UP Speed + UP Ταχύτητα + + + Status + Κατάσταση + + + ETA + Χρόνος που απομένει + + + Seeders + Διαμοιραστές + + + Leechers + Συνδέσεις + + + Search engine + Μηχανή αναζήτησης + + + Stalled + state of a torrent whose DL Speed is 0 + Αποτυχία λειτουργίας + + + Paused + Παύση + + + Preview process already running + Προεπισκόπηση ήδη ανοικτή + + + There is already another preview process running. +Please close the other one first. + Υπάρχει ήδη άλλη προεπισκόπηση ανοιχτή. +Παρακαλώ κλείστε την άλλη πρώτα. + + + Couldn't download + Couldn't download <file> + Αδύνατο κατέβασμα + + + reason: + Reason why the download failed + αιτία: + + + Downloading + Example: Downloading www.example.com/test.torrent + Κατέβασμα + + + Please wait... + Παρακαλώ περιμένετε... + + + Transfers + Μεταφορές + + + Are you sure you want to quit qBittorrent? + Είστε σίγουρος/η οτι θέλετε να κλείσετε το qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Είστε σίγουρος/η οτι θέλετε να διαγράψετε το(α) επιλεγμένο(α) αντικείμενο(α) από τη λίστα κατεβάσματος και το σκληρό δίσκο? + + + + Download finished + Το κατέβασμα τελείωσε + + + has finished downloading. + <filename> has finished downloading. + έχει τελειώσει το κατέβασμα. + + + Search Engine + Μηχανή Αναζήτησης + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Κατάσταση Σύνδεσης: + + + Offline + Offline + + + No peers found... + Δεν βρέθηκαν συνδέσεις... + + + Name + i.e: file name + Όνομα αρχείου + + + Size + i.e: file size + Μέγεθος + + + Progress + i.e: % downloaded + Πρόοδος + + + DL Speed + i.e: Download speed + DL Ταχύτητα + + + UP Speed + i.e: Upload speed + UP Ταχύτητα + + + Seeds/Leechs + i.e: full/partial sources + Διαμοιραστές/Συνδέσεις + + + ETA + i.e: Estimated Time of Arrival / Time left + Χρόνος που απομένει + + + Seeders + i.e: Number of full sources + Διαμοιραστές + + + Leechers + i.e: Number of partial sources + Συνδέσεις + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + Εκκινήθηκε το qBittorrent %1. + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Ταχύτητα Κατεβάσματος: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Ταχύτητα Ανεβάσματος: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Τελείωσε + + + Checking... + i.e: Checking already downloaded parts... + Έλεγχος... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Αποτυχία λειτουργίας + + + + Are you sure you want to quit? + Είστε σίγουρος/η οτι θέλετε να κλείσετε την εφαρμογή? + + + '%1' was removed. + 'xxx.avi' was removed. + Το '%1' αφαιρέθηκε. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + Το '%1' προστέθηκε στη λίστα κατεβάσματος. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + Το '%1' ξανάρχισε. (γρήγορη επανασύνδεση) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + Το '%1' είναι ήδη στη λίστα κατεβάσματος. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: '%1' + + + None + i.e: No error message + Κανένα + + + Listening on port: %1 + e.g: Listening on port: 1666 + Ακρόαση στη θύρα: %1 + + + All downloads were paused. + Όλα τα κατεβάσματα είναι σε παύση. + + + '%1' paused. + xxx.avi paused. + '%1' σε παύση. + + + Connecting... + i.e: Connecting to the tracker... + Σύνδεση... + + + All downloads were resumed. + Όλα τα κατεβάσματα ξανάρχισαν. + + + '%1' resumed. + e.g: xxx.avi resumed. + Το '%1' ξανάρχισε. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + Έχει τελειώσει το κατέβασμα του '%1'. + + + + I/O Error + i.e: Input/Output Error + I/O Λάθος + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Ένα σφάλμα προέκυψε κατά την προσπάθεια ανάγνωσης ή εγγραφής του %1. Ο δίσκος είναι πιθανόν πλήρης, το κατέβασμα είναι σε παύση + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Ένα σφάλμα προέκυψε (δίσκος πλήρης?), το '%1' είναι σε παύση. + + + + Connection Status: + Κατάσταση Σύνδεσης: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Σε τοίχο προστασίας (firewall)? + + + No incoming connections... + Καμία εισερχόμενη σύνδεση... + + + No search engine selected + Δεν έχει επιλεγεί μηχανή αναζήτησης + + + Search plugin update + Αναβάθμιση plugin αναζήτησης + + + Search has finished + Η αναζήτηση τελείωσε + + + Results + i.e: Search results + Αποτελέσματα + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Κατέβασμα του '%1', παρακαλώ περιμένετε... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Ένα σφάλμα προέκυψε (δίσκος πλήρης?), το '%1' είναι σε παύση. + + + + Search + Εύρεση + + + + RSS + RSS + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Ένα σφάλμα I/O προέκυψε για το τόρεντ %1 + Αιτία: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + Το qBittorrent χρησιμοποιεί τη θύρα: %1 + + + DHT support [ON], port: %1 + Υποστήριξη DHT [ΝΑΙ], θύρα: %1 + + + + + DHT support [OFF] + Υποστήριξη DHT [ΟΧΙ] + + + + PeX support [ON] + Υποστήριξη PeX [ΝΑΙ] + + + PeX support [OFF] + Υποστήριξη PeX [ΟΧΙ] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Η λίστα κατεβάσματος δεν είναι άδεια. +Σίγουρα θέλετε να κλείσετε το qBittorrent? + + + + + Downloads + Κατέβασματα + + + + Are you sure you want to delete the selected item(s) in finished list? + Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα των ολοκληρωμένων? + + + + UPnP support [ON] + Υποστήριξη UPnP [ΝΑΙ] + + + Be careful, sharing copyrighted material without permission is against the law. + Προσοχή, η διακίνηση υλικού προστατευόμενου από πνευματικά δικαιώματα χωρίς άδεια είναι παράνομη. + + + + Encryption support [ON] + Υποστήριξη κρυπτογράφησης [ΝΑΙ] + + + + Encryption support [FORCED] + Υποστήριξη κρυπτογράφησης [ΑΝΑΓΚΑΣΤΙΚΑ] + + + + Encryption support [OFF] + Υποστήριξη κρυπτογράφησης [ΟΧΙ] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>αποκλείστηκε</i> + + + Ratio + Αναλογία + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Σφάλμα κατεβάσματος url + + + + Couldn't download file at url: %1, reason: %2. + Αδύνατο κατέβασμα αρχείου από το url: %1,αιτία: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Γρήγορη συνέχεια κατεβάσματος αρχείων απορρίφθηκε για το τορεντ %1, επανέλεγχος... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα κατεβάσματος και από το σκληρό δίσκο? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από το σκληρό δίσκο? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' διαγράφηκε για πάντα. + + + Url seed lookup failed for url: %1, message: %2 + Αποτυχία ελέγχου url μοιράσματος για το url: %1, μήνυμα: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + Το qBittorrent χρησιμοποιεί τη θύρα: TCP/%1 + + + + UPnP support [OFF] + Υποστήριξη UPnP [ΟΧΙ] + + + + NAT-PMP support [ON] + Υποστήριξη NAT-PMP [NAI] + + + + NAT-PMP support [OFF] + Υποστήριξη NAT-PMP [OXI] + + + + DHT support [ON], port: UDP/%1 + Υποστήριξη DHT [NAI], θύρα: UDP/%1 + + + + Local Peer Discovery [ON] + Ανακάλυψη Τοπικών Συνδέσεων [ΝΑΙ] + + + + Local Peer Discovery support [OFF] + Ανακάλυψη Τοπικών Συνδέσεων [ΟΧΙ] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + Το '%1' αφαιρέθηκε επειδή η αναλογία του έφτασε τη μέγιστη τιμή που θέσατε. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + DL: %1 KiB/s + + + + + UP: %1 KiB/s + UP: %1 KiB/s + + + + + Ratio: %1 + Αναλογία: %1 + + + + + DHT: %1 nodes + DHT: %1 κόμβοι + + + + + No direct connections. This may indicate network configuration problems. + Χωρίς απευθείας συνδέσεις. Αυτό μπορεί να οφείλεται σε προβλήματα ρυθμίσεων δικτύου. + + + + Uploads + Ανεβάσματα + + + + Options were saved successfully. + Οι επιλογές αποθηκεύτηκαν επιτυχώς. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Από τον Christophe Dumez + + + Log: + Ημερολόγιο: + + + Total DL Speed: + Συνολική DL Ταχύτητα: + + + Kb/s + Kb/s + + + Total UP Speed: + Συνολική UP Ταχύτητα: + + + Name + Όνομα + + + Size + Μέγεθος + + + % DL + % DL + + + DL Speed + DL Ταχύτητα + + + UP Speed + UP Ταχύτητα + + + Status + Κατάσταση + + + ETA + Χρόνος που απομένει + + + &Options + &Ρυθμίσεις + + + + &Edit + &Αλλαγή + + + + &File + &Αρχείο + + + + &Help + &Βοήθεια + + + + Open + Άνοιγμα + + + + Exit + Έξοδος + + + + Preferences + Προτιμήσεις + + + + About + Σχετικά + + + + Start + Έναρξη + + + + Pause + Παύση + + + + Delete + Σβήσιμο + + + + Pause All + Παύση Όλων + + + + Start All + Έναρξη Όλων + + + + Documentation + Έγγραφα + + + Connexion Status + Κατάσταση Σύνδεσης + + + Delete All + Σβήσιμο Όλων + + + + Torrent Properties + Ιδιότητες τορεντ + + + Connection Status + Κατάσταση Σύνδεσης + + + Downloads + Κατεβάσματα + + + Search + Αναζήτηση + + + Search Pattern: + Πρότυπο εύρεσης: + + + Status: + Κατάσταση: + + + Stopped + Σταμάτησε + + + Search Engines + Μηχανές Αναζήτησης + + + Results: + Αποτελέσματα: + + + Stop + Σταμάτησε + + + Seeds + Διαμοιραστές + + + Leechers + Συνδέσεις + + + Search Engine + Μηχανή Αναζήτησης + + + + Download from URL + Κατέβασμα από URL + + + Download + Κατέβασμα + + + Clear + Ξεκάθαρο/α + + + KiB/s + KiB/s + + + + Create torrent + Δημιουργία τορεντ + + + Ratio: + Αναλογία: + + + Update search plugin + Αναβάθμιση plugin αναζήτησης + + + Session ratio: + Ποσοστό συνεδρίας: + + + Transfers + Μεταφορές + + + + Preview file + Προεπισκόπηση αρχείου + + + + Clear log + Εκκαθάριση καταγραφών + + + + Delete Permanently + Οριστική Διαγραφή + + + + Visit website + Επίσκεψη ιστοσελίδας + + + + Report a bug + Αναφορά σφάλματος + + + + Set upload limit + Ρύθμιση ορίου ανεβάσματος + + + + Set download limit + Ρύθμιση ορίου κατεβάσματος + + + Log + Αρχείο + + + IP filter + Φίλτρο ΙΡ + + + + Set global download limit + Ρύθμιση συνολικού ορίου κατεβάσματος + + + + Set global upload limit + Ρύθμιση συνολικού ορίου ανεβάσματος + + + + Options + Ρυθμίσεις + + + + Decrease priority + Μικρότερη προτεραιότητα + + + + Increase priority + Μεγαλύτερη προτεραιότητα + + + + Console + Κονσόλα + + + + PropListDelegate + + False + Λανθασμένο + + + True + Σωστό + + + + + Ignored + Αγνοείται + + + + + + Normal + Normal (priority) + Κανονική + + + + + High + High (priority) + Υψηλή + + + + + Maximum + Maximum (priority) + Μέγιστη + + + + QTextEdit + + Clear + Καθάρισε + + + + RSS + + + Search + Αναζήτηση + + + + + New subscription + Νέα εγγραφή + + + + + + Mark items read + Μαρκάρισμα αντικειμένων ως διαβασμένα + + + + Update all + Ανανέωση όλων + + + 1 + 1 + + + + Feed URL + URL Παροχής + + + + + Update + Ανανέωση + + + + New folder + Νέος φάκελος + + + + RSS feeds + Παροχές RSS + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Τόρεντ:</span> <span style=" font-style:italic;">(διπλό κλικ για κατέβασμα)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Ανανέωση όλων των παροχών + + + + + Delete + Διαγραφή + + + + + Rename + Μετονομασία + + + Refresh + Ανανέωση + + + + Download torrent + Κατέβασμα τόρεντ + + + + Open news URL + Άνοιγμα URL ειδήσεων + + + + Copy feed URL + Αντιγραφή URL παροχής + + + + RSS feed downloader + Κατέβασμα παροχών RSS + + + Create + Δημιουργία + + + Delete selected streams + Διαγραφή επιλεγμένων τροφοδοτήσεων + + + + Refresh RSS streams + Ανανέωση RSS τροφοδοτήσεων + + + Add a new RSS stream + Προσθήκη μιας νέας τροφοδότησης RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Νέα:</b> <i>(διπλό κλικ για άνοιγμα της σελίδας στον περιηγητή σας)</i> + + + Add RSS stream + Προσθήκη τροφοδότησης RSS + + + Refresh all streams + Ανανέωση όλων των τροφοδοτήσεων + + + RSS streams: + Τροφοδοτήσεις RSS: + + + 2 + 2 + + + Mark all as read + Μαρκάρισμα ως όλων αναγνωσθέντων + + + + RSSImp + + + Please type a rss stream url + Παρακαλώ εισάγετε ένα url τροφοδοσίας rss + + + + Stream URL: + URL τροφοδοσίας: + + + Please choose a new name for this stream + Παρακαλώ επιέξτε ένα νέο όνομα για αυτήν την τροφοδοσία + + + New stream name: + Νέο όνομα τροφοδοσίας: + + + + + Are you sure? -- qBittorrent + Είστε σίγουρος? -- qBittorrent + + + + + &Yes + &Ναι + + + + + &No + &Όχι + + + Are you sure you want to delete this stream from the list? + Είστε σίγουρος οτι θέλετε να διαγράψετε αυτή τη τροφοδοσία από τη λίστα? + + + Description: + Περιγραφή: + + + url: + url: + + + Last refresh: + Τελευταία ανανέωση: + + + + Please choose a folder name + Παρακαλώ επιλέξτε ένα όνομα φακέλου + + + + Folder name: + Όνομα φακέλου: + + + + New folder + Νέος φάκελος + + + + Overwrite attempt + Προσπάθεια επαννεγγραφής + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Δεν προρείτε να επανεγγράψετε το myFolder αντικείμενο. + Δεν μπορείτε να επανεγγράψετε το %1 αντικείμενο. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Αυτή η τροφοδοσία rss είναι ήδη στη λίστα. + + + + Are you sure you want to delete these elements from the list? + Είστε σίγουρος οτι θέλετε να διαγράψετε αυτά τα στοιχεία από τη λίστα? + + + + Are you sure you want to delete this element from the list? + Είστε σίγουρος οτι θέλετε να διαγράψετε αυτό το στοιχείο από τη λίστα? + + + + Please choose a new name for this RSS feed + Παρακαλώ επιλέξτε ένα νέο όνομα για αυτή την παροχή RSS + + + + New feed name: + Νέο όνομα παροχής: + + + + Name already in use + Το όνομα ήδη χρησιμοποιείται + + + + This name is already used by another item, please choose another one. + Αυτό το όνομα ήδη χρησιμοποιείται από ένα άλλο αντικείμενο. Παρακαλώ επιλέξτε ένα άλλο. + + + + Date: + Ημερομηνία: + + + + Author: + Δημιουργός: + + + + Unread + Μη διαβασμένο + + + + RssItem + + + No description available + Δεν υπάρχει διαθέσιμη περιγραφή + + + + RssStream + + %1 ago + 10min ago + %1 πριν + + + + Automatically downloading %1 torrent from %2 RSS feed... + Αυτόματο κατέβασμα του τόρεντ %1 από την παροχή RSS %2... + + + Never + Ποτέ + + + + SearchCategories + + + All categories + Όλες οι κατηγορίες + + + + Movies + Ταινίες + + + + TV shows + Τηλεοπτικές σειρές + + + + Music + Μουσική + + + + Games + Παιχνίδια + + + + Anime + Anime + + + + Software + Λογισμικό + + + + Pictures + Εικόνες + + + + Books + Βιβλία + + + + SearchEngine + + Name + i.e: file name + Όνομα + + + Size + i.e: file size + Μέγεθος + + + Seeders + i.e: Number of full sources + Διαμοιραστές + + + Leechers + i.e: Number of partial sources + Συνδέσεις + + + Search engine + Μηχανή αναζήτησης + + + + Empty search pattern + Κενό πρότυπο εύρεσης + + + + Please type a search pattern first + Παρακαλώ εισάγετε ένα σχέδιο εύρεσης πρώτα + + + No search engine selected + Δεν έχει επιλεγεί μηχανή αναζήτησης + + + You must select at least one search engine. + Πρέπει να επιλέξετε τουλάχιστο μια μηχανή αναζήτησης. + + + + + Results + Αποτελέσματα + + + + Searching... + Αναζήτηση... + + + Search plugin update -- qBittorrent + Αναβάθμιση plugin αναζήτησης -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin αναζήτησης μπορεί να αναβαθμιστεί, θέλετε να το αναβαθμίσετε; + +Κατάλογος αλλαγών: + + + + &Yes + &Ναι + + + &No + &Όχι + + + Search plugin update + Αναβάθμιση plugin αναζήτησης + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Λυπούμαστε, ο εξηπυρετητής αναβάθμισης δεν είναι προσωρινά διαθέσιμος. + + + Your search plugin is already up to date. + Το plugin αναζήτησης είναι ήδη αναβαθμισμένο. + + + + Cut + Αποκοπή + + + + Copy + Αντιγραφή + + + + Paste + Επικόλληση + + + + Clear field + Εκκαθάριση πεδίου + + + + Clear completion history + Εκκαθάριση ιστορικού φόρμας + + + + Search Engine + Μηχανή Αναζήτησης + + + + + Search has finished + Η αναζήτηση τελείωσε + + + + An error occured during search... + Σφάλμα κατά την εύρεση... + + + + Search aborted + Αναζήτηση διεκόπη + + + + Search returned no results + Η αναζήτηση δεν έφερε αποτελέσματα + + + + Results + i.e: Search results + Αποτελέσματα + + + Search plugin download error + Σφάλμα κατά το κατέβασμα plugin αναζήτησης + + + Couldn't download search plugin update at url: %1, reason: %2. + Αδύνατο κατέβασμα plugin αναζήτησης από το url: %1,αιτία: %2. + + + + + Unknown + Άγνωστο + + + + SearchTab + + + Name + i.e: file name + Όνομα + + + + Size + i.e: file size + Μέγεθος + + + + Seeders + i.e: Number of full sources + Διαμοιραστές + + + + Leechers + i.e: Number of partial sources + Συνδέσεις + + + + Search engine + Μηχανή αναζήτησης + + + + TrackersAdditionDlg + + + Trackers addition dialog + Παράθυρο προσθήκης ιχνηλατών + + + + List of trackers to add (one per line): + Λίστα ιχνηλατών προς προσθήκη (ένα ανά σειρά): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + Θα ήθελα να ευχαριστήσω τους παρακάτω ανθρώπους που εθελοντικά μετέφρασαν το qBittorrent: + + + Please contact me if you would like to translate qBittorrent to your own language. + Παρακαλώ επικοινωνήστε μαζί μου αν θα θέλατε να μεταφράσετε το qBittorrent στην δική σας γλώσσα. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Θα ήθελα να ευχαριστήσω το sourceforge.net για την φιλοξένηση του qBittorrent project. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Θα ήθελα να ευχαριστήσω τους παρακάτω ανθρώπους που εθελοντικά μετέφρασαν το qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Θα ήθελα να ευχαριστήσω το sourceforge.net για την φιλοξενία του qBittorrent project.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Επίσης θα ήθελα να ευχαριστήσω τον Jeffery Fernandez (developer@jefferyfernandez.id.au), τον RPM packager μας, για την εξαιρετική δουλειά του.</li></ul> + + + Preview impossible + Προεπισκόπηση αδύνατη + + + Sorry, we can't preview this file + Λυπούμαστε, δεν μπορεί να προεσκοπηθεί αυτό το αρχείο + + + Name + Όνομα + + + Size + Μέγεθος + + + Progress + Πρόοδος + + + No URL entered + Δεν έχετε εισάγει URL + + + Please type at least one URL. + Παρακαλώ εισάγετε τουλάχιστο ένα URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Παρακαλώ επικοινωνήστε μαζί μου αν θα θέλατε να μεταφράσετε το qBittorrent στη δική σας γλώσσα. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Θα ήθελα να ευχαριστήσω τους παρακάτω που εθελοντικά μετέφρασαν το qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Παρακαλώ επικοινωνήστε μαζί μου αν θα θέλατε να μεταφράσετε το qBittorrent στη δική σας γλώσσα. + + + + addTorrentDialog + + + Torrent addition dialog + Διάλογος προσθήκης τορεντ + + + + Save path: + Αποθήκευση σε: + + + + ... + ... + + + + Torrent size: + Μέγεθος τόρεντ: + + + + + Unknown + Άγνωστο + + + + Free disk space: + Ελεύθερος χώρος στο δίσκο: + + + + Torrent content: + Περιεχόμενο τορεντ: + + + + Download in sequential order (slower but good for previewing) + Κατέβασμα σε συνεχόμενη σειρά (πιο αργό αλλά καλό για preview) + + + File name + Όνομα αρχείου + + + File size + Μέγεθος αρχείου + + + Selected + Επιλεγμένο(α) + + + Download in correct order (slower but good for previewing) + Κατέβασμα στη σωστή σειρά (πιο αργό αλλα καλό για προεπισκόπηση) + + + + Add to download list in paused state + Προσθήκη στη λίστα κατεβάσματος σε κατάσταση παύσης + + + + Add + Προσθήκη + + + + Cancel + Ακύρωση + + + select + επιλογή + + + Unselect + Ακύρωση επιλογής + + + Select + Επιλογή + + + + Ignored + Αγνοήθηκε + + + + Normal + Κανονικό + + + + High + Υψηλό + + + + Maximum + Μέγιστο + + + + Collapse all + Κατάρρευση όλων + + + Expand All + Επέκταση όλων + + + + Expand all + Επέκταση όλων + + + + authentication + + + + Tracker authentication + Πιστοποίηση ιχνηλάτη + + + + Tracker: + Ιχνηλάτης: + + + + Login + Είσοδος + + + + Username: + Όνομα χρήστη: + + + + Password: + Κωδικός: + + + + Log in + Είσοδος + + + + Cancel + Ακύρωση + + + + bandwidth_dlg + + + Bandwidth allocation + Κατανομή bandwidth + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + Το %1 έφτασε στη μέγιστη αναλογία που θέσατε. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' διαγράφηκε για πάντα. + + + + '%1' was removed. + 'xxx.avi' was removed. + Το '%1' αφαιρέθηκε. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' σε παύση. + + + '%1' resumed. + e.g: xxx.avi resumed. + Το '%1' ξανάρχισε. + + + + '%1' is not a valid magnet URI. + Το '%1' δεν είναι ένα έγκυρο magnet URI. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + Το '%1' είναι ήδη στη λίστα κατεβάσματος. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + Το '%1' ξανάρχισε. (γρήγορη επανασύνδεση) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + Το '%1' προστέθηκε στη λίστα κατεβάσματος. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: '%1' + + + + This file is either corrupted or this isn't a torrent. + Το αρχείο είτε είναι κατεστραμμένο, ή δεν ειναι τορεντ. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>μπλοκαρίστηκε εξαιτίας του IP φίλτρου</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>απαγορεύτηκε εξαιτίας κατεστραμμένων κομματιών</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Προγραμματισμένο κατέβασμα του αρχείου %1,που βρίσκεται στο τόρεντ %2 + + + + Unable to decode %1 torrent file. + Αδύνατο να αποκωδικοποιηθεί το αρχείο τόρεντ %1. + + + + Couldn't listen on any of the given ports. + Δεν "ακροάστηκα" καμία σπό τις δωσμένες θύρες. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Σφάλμα χαρτογράφησης θυρών, μήνυμα: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Χαρτογράφηση θυρών επιτυχής, μήνυμα: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Γρήγορη συνέχεια κατεβάσματος αρχείων απορρίφθηκε για το τορεντ %1, επανέλεγχος... + + + + Url seed lookup failed for url: %1, message: %2 + Αποτυχία ελέγχου url μοιράσματος για το url: %1, μήνυμα: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Κατέβασμα του '%1', παρακαλώ περιμένετε... + + + + createTorrentDialog + + Create Torrent file + Δημιουργία Αρχείου Τορεντ + + + Destination torrent file: + Προορισμός αρχείου τορεντ: + + + Input file or directory: + Τοποθετήστε αρχείο ή κατηγορία: + + + Comment: + Σχόλια: + + + ... + ... + + + Create + Δημιουργία + + + + Cancel + Ακύρωση + + + Announce url (Tracker): + Ανακοίνωση url (Ιχνηλάτη): + + + Directory + Φάκελος + + + + Torrent Creation Tool + Εργαλείο Δημιουργίας Τορεντ + + + <center>Destination torrent file:</center> + <center>Προορισμός αρχείου torrent:</center> + + + <center>Input file or directory:</center> + <center>Είσοδος αρχείου ή διαδρομής:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Ανακοινωτικό url:<br>(Μια ανά γραμμή)</center> + + + <center>Comment:</center> + <center>Σχόλιο:</center> + + + + Torrent file creation + Δημιουργία αρχείου τορεντ + + + Input files or directories: + Είσοδος αρχείων ή φακέλων: + + + + Announce urls (trackers): + Url ανακοίνωσης (ιχνηλάτες): + + + + Comment (optional): + Σχόλιο (προαιρετικό): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Πριβέ (δεν θα διανεμηθεί σε δίκτυο χωρίς ιχνηλάτη / αν έχει ενεργοποιηθεί DHT) + + + + Web seeds urls (optional): + Url δικτυακού μοιράσματος (προαιρετικά): + + + + File or folder to add to the torrent: + Αρχείο ή φάκελος να προστεθεί στο τορεντ: + + + Add a file + Προσθήκη αρχείου + + + Add a folder + Προσθήκη φακέλου + + + + Add file + Προσθήκη αρχείου + + + + Add folder + Προσθήκη φακέλου + + + + Piece size: + Μέγεθος κομματιού: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Ιδιωτικό (αν ενεργοποιηθεί, δε θα διανεμηθεί σε δίκτυο DHT) + + + + Start seeding after creation + Εκκίνηση μοιράσματος μετά τη δημιουργία + + + + Create and save... + Δημιουργία και αποθήκευση... + + + + Progress: + Πρόοδος: + + + + createtorrent + + + Select destination torrent file + Επιλέξτε προορισμό αρχείου τορεντ + + + + Torrent Files + Αρχεία Τορεντ + + + Select input directory or file + Επιλέξτε αρχείο ή κατηγορία εισόδου + + + No destination path set + Δεν έχει ρυθμιστεί η διαδρομή φακέλου + + + Please type a destination path first + Παρακαλώ πληκτρολογήστε έναν προορισμό διαδρομής πρώτα + + + + No input path set + Δεν έχει ρυθμιστεί διαδρομή εισόδου + + + + Please type an input path first + Παρακαλώ πληκτρολογήστε μία διαδρομή εισόδου πρώτα + + + Input path does not exist + Διαδρομή εισόδου δεν υπάρχει + + + Please type a correct input path first + Παρακαλώ πληκτρολογήστε έναν έγκυρο προορισμό διαδρομής πρώτα + + + + + + Torrent creation + Δημιουργία τορεντ + + + + Torrent was created successfully: + Τόρεντ δημιουργήθηκε επιτυχώς: + + + Please type a valid input path first + Παρακαλώ πληκτρολογήστε μία έγκυρη διαδρομή εισόδου πρώτα + + + + Select a folder to add to the torrent + Επιλέξτε ένα φάκελο για να προστεθεί το τορεντ + + + Select files to add to the torrent + Επιλέξτε αρχεία να προστεθούν στο τορεντ + + + + Please type an announce URL + Παρακαλώ πληκτρολογήστε ένα URL ανακοίνωσης + + + + Torrent creation was unsuccessful, reason: %1 + Η δημιουργία τορεντ ήταν ανεπιτυχής. αιτία: %1 + + + + Announce URL: + Tracker URL + URL ιχνηλάτη (ανακοίνωσης): + + + + Please type a web seed url + Παρακαλώ πληκτρολογήστε ένα url δικτυακού μοιράσματος + + + + Web seed URL: + URL δικτυακού μοιράσματος: + + + + Select a file to add to the torrent + Επιλέξτε ένα αρχείο να προστεθεί στο τορεντ + + + No tracker path set + Καμία διαδρομή ιχνηλάτη δεν έχει ρυθμιστεί + + + Please set at least one tracker + Παρακαλώ εισάγετε τουλάχιστο ένα ιχνηλάτη + + + + Created torrent file is invalid. It won't be added to download list. + Το αρχείο τορεντ που δημιουργήσατε δεν είναι έγκυρο. Δε θα προστεθεί στη λίστα κατεβασμάτων. + + + + downloadFromURL + + + Download Torrents from URLs + Κατέβασμα Τορεντ από URL + + + + Only one URL per line + Μόνο ένα URL ανα γραμμή + + + + Download + Κατέβασμα + + + + Cancel + Άκυρο + + + + Download from urls + Κατέβασμα από URL + + + + No URL entered + Δεν έχετε εισάγει URL + + + + Please type at least one URL. + Παρακαλώ εισάγετε τουλάχιστο ένα URL. + + + + downloading + + + Search + Αναζήτηση + + + Total DL Speed: + Συνολική DL Ταχύτητα: + + + KiB/s + KiB/s + + + Session ratio: + Ποσοστό συνεδρίας: + + + Total UP Speed: + Συνολική UP Ταχύτητα: + + + Log + Αρχείο + + + IP filter + Φίλτρο ΙΡ + + + + Start + Έναρξη + + + + Pause + Παύση + + + + Delete + Διαγραφή + + + Clear + Εκκαθάριση + + + + Preview file + Προεπισκόπηση αρχείου + + + + Set upload limit + Ρύθμιση ορίου ανεβάσματος + + + + Set download limit + Ρύθμιση ορίου κατεβάσματος + + + + Delete Permanently + Οριστική Διαγραφή + + + + Torrent Properties + Ιδιότητες τορεντ + + + + Open destination folder + Άνοιγμα φακέλου προορισμού + + + + Name + Όνομα + + + + Size + Μέγεθος + + + + Progress + Πρόοδος + + + + DLSpeed + DLΤαχύτητα + + + + UpSpeed + UPΤαχύτητα + + + + Seeds/Leechs + Διαμοιραστές/Συνδέσεις + + + + Ratio + Αναλογία + + + + ETA + Χρόνος που απομένει + + + + Buy it + Αγόρασέ το + + + + Priority + Προτεραιότητα + + + + Increase priority + Μεγαλύτερη προτεραιότητα + + + + Decrease priority + Μικρότερη προτεραιότητα + + + + Force recheck + Αναγκαστικός επανέλεγχος + + + + Copy magnet link + Αντιγραφή magnet link + + + + engineSelect + + + Search plugins + Plugin αναζήτησης + + + + Installed search engines: + Εγκατεστημένες μηχανές αναζήτησης: + + + + Name + Όνομα + + + + Url + Url + + + + Enabled + Ενεργοποιημένο + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Μπορείτε να βρείτε νέα plugin αναζήτησης εδώ: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Εγκατάσταση ενός καινούριου + + + + Check for updates + Έλεγχος για αναβαθμίσεις + + + + Close + Κλείσιμο + + + + Enable + Ενεργοποίηση + + + + Disable + Απενεργοποίηση + + + + Uninstall + Απεγκατάσταση + + + + engineSelectDlg + + True + Σωστό + + + False + Λάθος + + + + Uninstall warning + Προειδοποίηση απεγκατάστασης + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Μερικά plugin δεν μπόρεσαν να απεγκατασταθούν διότι συμπεριλαμβάνονται στο qBittorrent. + Μόνο αυτά που προσθέσατε μόνος σας μπορούν να απεγκατασταθούν. +Ωστόσο, αυτά τα plugin απενεργοποιήθηκαν. + + + + Uninstall success + Επιτυχής απεγκατάσταση + + + All selected plugins were uninstalled successfuly + Όλα τα επιλεγμένα plugin απεγκαταστήθηκαν επιτυχώς + + + + Select search plugins + Επιλέξτε plugin αναζήτησης + + + + + qBittorrent search plugins + plugin αναζήτησης του qBittorrent + + + + + + + + + + + Search plugin install + Εγκατάσταση plugin αναζήτησης + + + + + + Yes + Ναι + + + + + + + No + Όχι + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Μια πιο πρόσφατη έκδοση plugin αναζήτησης %1 έχει ήδη εγκατασταθεί. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Το plugin αναζήτησης %1 αναβαθμίστηκε επιτυχώς. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Το plugin αναζήτησης %1 εγκαταστήθηκε επιτυχώς. + + + + + + + + Search plugin update + Αναβάθμιση plugin αναζήτησης + + + + + Sorry, update server is temporarily unavailable. + Λυπούμαστε, ο εξυπηρετητής αναβάθμισης δεν είναι προσωρινά διαθέσιμος. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Το plugin αναζήτησης %1 αναβαθμίστηκε επιτυχώς. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Λυπούμαστε, η αναβάθμιση του plugin αναζήτησης %1 απέτυχε. + + + + All your plugins are already up to date. + Όλα τα plugin σας είναι ήδη αναβαθμισμένα. + + + + All selected plugins were uninstalled successfully + Όλα τα επιλεγμένα plugin απεγκαταστάθηκαν επιτυχώς + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Το plugin αναζήτησης %1 δεν ήταν δυνατό να αναβαθμιστεί, παραμένει η παλιά έκδοση. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Το plugin αναζήτησης %1 δεν ήταν δυνατό να εγκατασταθεί. + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Το plugin αναζήτησης %1 αναβαθμίστηκε επιτυχώς. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Το plugin αναζήτησης %1 εγκαταστάθηκε επιτυχώς. + + + + Search engine plugin archive could not be read. + Το αρχείο του plugin αναζήτησης δεν ήταν δυνατό να διαβαστεί. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Λυπούμαστε, η εγκατάσταση του plugin αναζήτησης %1 απέτυχε. + + + + New search engine plugin URL + Νέο URL plugin αναζήτησης + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB/s + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + λ + + + h + hours + ώ + + + d + days + μ + + + Unknown + Άγνωστος + + + h + hours + ώ + + + d + days + μ + + + + Unknown + Unknown (size) + Άγνωστο + + + + < 1m + < 1 minute + < 1λ + + + + %1m + e.g: 10minutes + %1λ + + + + %1h%2m + e.g: 3hours 5minutes + %1ώ%2λ + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1μ%2ώ%3λ + + + + options_imp + + Options saved successfully! + Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς! + + + Choose Scan Directory + Επιλέξτε Φάκελο Σάρωσης + + + Choose save Directory + Επιλέξτε Φάκελο Αποθήκευσης + + + Choose ipfilter.dat file + Επιλέξτε αρχείο ipfilter.dat + + + I/O Error + I/O Λάθος + + + Couldn't open: + Δεν άνοιξε: + + + in read mode. + σε φάση ανάγνωσης. + + + Invalid Line + Άκυρη Γραμμή + + + Line + Η Γραμμή + + + is malformed. + είναι κακοσχηματισμένη. + + + Range Start IP + Εύρος Αρχής ΙΡ + + + Start IP: + Αρχή ΙΡ: + + + Incorrect IP + Λάθος ΙΡ + + + This IP is incorrect. + Η ΙΡ είναι λάθος. + + + Range End IP + Εύρος Τέλους ΙΡ + + + End IP: + Τέλος ΙΡ: + + + IP Range Comment + Σχόλιο Εύρους ΙΡ + + + Comment: + Σχόλιο: + + + to + <min port> to <max port> + έως + + + Choose your favourite preview program + Επιλέξτε το αγαπημένο σας πρόγραμμα προεπισκόπησης + + + Invalid IP + Άκυρο IP + + + This IP is invalid. + Αυτό το IP είναι άκυρο. + + + Options were saved successfully. + Οι επιλογές αποθηκεύτηκαν επιτυχώς. + + + + + Choose scan directory + Επιλέξτε φάκελο αναζήτησης + + + Choose an ipfilter.dat file + Επιλέξτε ένα αρχείο ipfilter.dat + + + + + Choose a save directory + Επιλέξτε φάκελο αποθήκευσης + + + I/O Error + Input/Output Error + I/O Σφάλμα + + + Couldn't open %1 in read mode. + Αδύνατο το άνοιγμα του %1 σε λειτουργία ανάγνωσης. + + + + + Choose an ip filter file + Επιλέξτε ένα αρχείο φίλτρου ip + + + + + Filters + Φίλτρα + + + + pluginSourceDlg + + + Plugin source + Πηγή plugin + + + + Search plugin source: + Πηγή plugin αναζήτησης: + + + + Local file + Τοπικό αρχείο + + + + Web link + Web σύνδεσμος + + + + preview + + + Preview selection + Προεπισκόπηση επιλογής + + + + File preview + Προεπισκόπηση αρχείου + + + + The following files support previewing, <br>please select one of them: + Τα παρακάτω αρχεία υποστηρίζουν προεπισκόπηση, <br>παρακαλώ επιλέξτε ένα από αυτά: + + + + Preview + Προεπισκόπηση + + + + Cancel + Άκυρο + + + + previewSelect + + + + Preview impossible + Αδύνατη η προεπισκόπηση + + + + + Sorry, we can't preview this file + Λυπούμαστε, δεν μπορεί να προεσκοπηθεί αυτό το αρχείο + + + + Name + Όνομα + + + + Size + Μέγεθος + + + + Progress + Πρόοδος + + + + properties + + + Torrent Properties + Ιδιότητες τορεντ + + + Main Infos + Κύριες Πληροφορίες + + + File Name + Όνομα Αρχείου + + + Current Session + Παρούσα Περίοδος + + + Total Uploaded: + Σύνολο Ανεβασμένων: + + + Total Downloaded: + Σύνολο Κατεβασμένων: + + + Download state: + Κατάσταση κατεβάσματος: + + + Current Tracker: + Παρόν ιχνηλάτης: + + + Number of Peers: + Αριθμός Συνδέσεων: + + + Torrent Content + Περιεχόμενο τορεντ + + + + OK + OK + + + Total Failed: + Σύνολο Αποτυχημένων: + + + Finished + Τελειωμένο + + + Queued for checking + Στην ουρά για έλεγχο + + + Checking files + Ελέγχει αρχεία + + + Connecting to tracker + Σύνδεση με ιχνηλάτη + + + Downloading Metadata + Κατέβασμα Metadata + + + Downloading + Κατεβάζει + + + Seeding + Μοιράζει + + + Allocating + Προσδιορίζει + + + + Unknown + Άγνωστο + + + Complete: + Ολόκληρο: + + + Partial: + Μερικό: + + + + Files contained in current torrent: + Αρχεία που περιέχονται στο παρόν τορεντ: + + + + Size + Μέγεθος + + + Selected + Επιλεγμένο + + + Unselect + Απόρριψη + + + Select + Επιλογή + + + You can select here precisely which files you want to download in current torrent. + Εδώ μπορείτε να επιλέξετε με ακρίβεια ποιά αρχεία θέλετε να κατεβάσετε στο παρόν τορεντ. + + + False + Λάθος + + + True + Σωστό + + + Tracker + Ιχνηλάτης + + + + Trackers: + Ιχνηλάτες: + + + + + None - Unreachable? + Κανένα - Απροσπέλαστο? + + + Errors: + Λάθη: + + + + Progress + Πρόοδος + + + Main infos + Γενικές πληροφορίες + + + Number of peers: + Αριθμός διαμοιραστών: + + + + Current tracker: + Τρέχων ιχνηλάτης: + + + + Total uploaded: + Σύνολο ανεβασμένων: + + + + Main info + Γενικές πληροφορίες + + + + Torrent information + Πληροφορίες τορεντ + + + + Total downloaded: + Σύνολο κατεβασμένων: + + + + Total failed: + Σύνολο αποτυχημένων: + + + + Torrent content + Περιεχόμενο τορεντ + + + Options + Επιλογές + + + + Download in correct order (slower but good for previewing) + Κατέβασμα στη σωστή σειρά (πιο αργό αλλα καλό για προεπισκόπηση) + + + Share Ratio: + Ποσοστό μοιράσματος: + + + Seeders: + Διαμοιραστές: + + + Leechers: + Συνδέσεις: + + + + Save path: + Αποθήκευση σε: + + + Torrent infos + Πληροφορίες τορεντ + + + + Creator: + Δημιουργός: + + + + Torrent hash: + Τορεντ hash: + + + + Comment: + Σχόλιο: + + + + Current session + Τρέχουσα συνεδρία + + + + Share ratio: + Ποσοστό μοιράσματος: + + + + Trackers + Ιχνηλάτες + + + New tracker + Νέος ιχνηλάτης + + + New tracker url: + Url νέου ιχνηλάτη: + + + + Priorities: + Προτεραιότητες: + + + + Normal: normal priority. Download order is dependent on availability + Κανονική: κανονική προτεραιότητα. Η σειρά κατεβάσματος εξαρτάται από τη διαθεσιμότητα + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Υψηλή: υψηλότερη από τη κανονική προτεραιότητα. Τα κομμάτια προτιμόνται από άλλα με την ίδια διαθεσιμότητα, αλλά όχι από κομμάτια με χαμηλότερη διαθεσιμότητα + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Μέγιστη: μέγιστη προτεραιότητα, η διαθεσιμότητα παραβλέπεται, το κομμάτι προτιμάται από κάθε άλλο κομμάτι με χαμηλότερη προτεραιότητα + + + + File name + Όνομα αρχείου + + + + + Priority + Προτεραιότητα + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + Η λίστα των ιχνηλατών δεν γίνεται να είναι άδεισ. + + + + Ignored: file is not downloaded at all + Αγνοέιται: το αρχείο δεν κατεβάζεται καθόλου + + + + Ignored + Αγνοείται + + + + Normal + Κανονικό + + + + Maximum + Μέγιστο + + + + High + Υψηλό + + + + Url seeds + Url μοιράσματα + + + + New url seed: + Νέο url μοιράσματος: + + + + This url seed is already in the list. + Αυτό το url μοιράσματος είναι ήδη στη λίστα. + + + Hard-coded url seeds cannot be deleted. + "Hard-coded" url μοιράσματος δεν μπορούν να διαγραφούν. + + + None + i.e: No error message + Κανένα + + + + New url seed + New HTTP source + Νέο url μοιράσματος + + + + The following url seeds are available for this torrent: + Τα ακόλουθα url μοιράσματος είναι διαθέσιμα για αυτό το τορεντ: + + + + Priorities error + Σφάλμα προτεραιοτήτων + + + + Error, you can't filter all the files in a torrent. + Σφάλμα, δεν μπορείτε να φιλτράρετε όλα τα αρχεία σε ένα τορεντ. + + + + Downloaded pieces + Κατεβασμένα κομμάτια + + + + Collapse all + Κατάρρευση όλων + + + + Expand all + Επέκταση όλων + + + + ... + ... + + + + + Choose save path + Επιλέξτε διαδρομή αποθήκευσης + + + + Save path creation error + Σφάλμα δημιουργίας διαδρομής αποθήκευσης + + + + Could not create the save path + Δεν μπόρεσε να δημιουργηθεί η διαδρομή αποθήκευσης + + + + search_engine + + + + Search + Αναζήτηση + + + Search Engines + Μηχανές Αναζήτησης + + + Search Pattern: + Πρότυπο εύρεσης: + + + Stop + Σταμάτησε + + + + Status: + Κατάσταση: + + + + Stopped + Σταμάτησε + + + Results: + Αποτελέσματα: + + + + Download + Κατέβασμα + + + Clear + Εκκαθάριση + + + Update search plugin + Αναβάθμιση plugin αναζήτησης + + + + Search engines... + Μηχανές αναζήτησης... + + + Close tab + Κλείσιμο καρτέλας + + + + seeding + + + Search + Αναζήτηση + + + The following torrents are finished and shared: + Τα ακόλουθα τορεν τελείωσαν και μοιράζονται: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Σημείωση:</u> Είναι σημαντικό να συνεχίσετε το μοίρασμα των τορεντ σας μετά το κατέβασμα για το καλό του δικτύου. + + + + Start + Έναρξη + + + + Pause + Παύση + + + + Delete + Σβήσιμο + + + + Delete Permanently + Οριστική Διαγραφή + + + + Torrent Properties + Ιδιότητες τορεντ + + + + Preview file + Προεπισκόπηση αρχείου + + + + Set upload limit + Ρύθμιση ορίου ανεβάσματος + + + + Open destination folder + Άνοιγμα φακέλου προορισμού + + + + Name + Όνομα + + + + Size + Μέγεθος + + + + Upload Speed + Όριο Ανεβάσματος + + + + + Connected peers + Συνδεδεμένοι χρήστες + + + + + Seeds / Leechers + Διαμοιραστές/Συνδέσεις + + + + Copy magnet link + Αντιγραφή magnet link + + + Leechers + Συνδέσεις + + + + Ratio + Αναλογία + + + + Buy it + Αγόρασέ το + + + + Total uploaded + Σύνολο ανεβασμένων + + + Priority + Προτεραιότητα + + + Increase priority + Μεγαλύτερη προτεραιότητα + + + Decrease priority + Μικρότερη προτεραιότητα + + + + Force recheck + Αναγκαστικός επανέλεγχος + + + + subDownloadThread + + + Host is unreachable + Ο φορέας δεν βρέθηκε + + + + File was not found (404) + Το αρχείο δε βρέθηκε (404) + + + + Connection was denied + Άρνηση σύνδεσης + + + + Url is invalid + Άκυρο url + + + + I/O Error + Σφάλμα I/O + + + Connection forbidden (403) + Απαγόρευση σύνδεσης (403) + + + Connection was not authorized (401) + Η σύνδεση δεν εγκρίθηκε (401) + + + Content has moved (301) + Το περιεχόμενο έχει μετακινηθεί (301) + + + + Connection failure + Σφάλμα σύνδεσης + + + + Connection was timed out + Τέλος χρόνου σύνδεσης + + + + Incorrect network interface + Λανθασμένο interface δικτύου + + + + Unknown error + Άγνωστο σφάλμα + + + + Could not resolve proxy + Δεν μπόρεσε να βρεθεί το proxy + + + + torrentAdditionDialog + + True + Σωστό + + + + + Unable to decode torrent file: + Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: + + + This file is either corrupted or this isn't a torrent. + Το αρχείο είτε είναι κατεστραμμένο, ή δεν ειναι ενα τορεντ. + + + + + Choose save path + Επιλέξτε διαδρομή αποθήκευσης + + + False + Λάθος + + + Unknown + Άγνωστο + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 απομένουν μετά από το κατέβασμα του τόρεντ) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 επιπλέον απαιτούνται για κατέβασμα) + + + + Empty save path + Κενή διαδρομή αποθήκευσης + + + + Please enter a save path + Παρακαλώ εισάγετε μία διαδρομή αποθήκευσης + + + + Save path creation error + Σφάλμα δημιουργίας διαδρομής αποθήκευσης + + + + Could not create the save path + Δεν μπόρεσε να δημιουργηθεί η διαδρομή αποθήκευσης + + + + Invalid file selection + Άκυρη επιλογή αρχείου + + + + You must select at least one file in the torrent + Πρέπει να επιλέξετε τουλάχιστο ένα αρχείο του τορεντ + + + + File name + Όνομα αρχείου + + + + Size + Μέγεθος + + + + Progress + Πρόοδος + + + + + Priority + Προτεραιότητα + + + diff --git a/src/lang/qbittorrent_en.qm b/src/lang/qbittorrent_en.qm new file mode 100644 index 000000000..be651eede --- /dev/null +++ b/src/lang/qbittorrent_en.qm @@ -0,0 +1 @@ + + + + + AboutDlg + + + About qBittorrent + + + + + About + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Author + + + + + Name: + + + + + Country: + + + + + E-mail: + + + + + Home page: + + + + + Christophe Dumez + + + + + France + + + + + Translation + + + + + License + + + + + <h3><b>qBittorrent</b></h3> + + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + + + + + Occupation: + + + + + 03/05/1985 + + + + + Student in computer science + + + + + Thanks to + + + + + BandwidthAllocationDialog + + + Upload limit: + + + + + Download limit: + + + + + + + + Unlimited + Unlimited (bandwidth) + + + + + KiB/s + + + + + ConsoleDlg + + + qBittorrent console + + + + + General + + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + + + + + Dialog + + + + + Port: + + + + + + + Authentication + + + + + + + Password: + + + + + Activate IP Filtering + + + + + Filter Settings + + + + + Language: + + + + + + KiB/s + + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + + + + + Connection + + + + + Plastique style (KDE like) + + + + + CDE style (Common Desktop Environment like) + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Port used for incoming connections: + + + + + Random + + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + + + + + Use proxy for connections to trackers + + + + + Use proxy for connections to regular peers + + + + + Use proxy for connections to web seeds + + + + + Use proxy for DHT messages + + + + + Enabled + + + + + Forced + + + + + Disabled + + + + + Preferences + + + + + IP Filter + + + + + User interface settings + + + + + Visual style: + + + + + Cleanlooks style (Gnome like) + + + + + Motif style (Unix like) + + + + + Ask for confirmation on exit when download list is not empty + + + + + Display current speed in title bar + + + + + System tray icon + + + + + Disable system tray icon + + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + + + + + Minimize to tray + + + + + Show notification balloons in tray + + + + + Downloads + + + + + Pre-allocate all files + + + + + When adding a torrent + + + + + Display torrent content and some options + + + + + Do not start download automatically + The torrent will be added to download list in pause state + + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + + + + + UI + + + + + Proxy + + + + + Download list: + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + + + + + Listening port + + + + + Enable UPnP port mapping + + + + + Enable NAT-PMP port mapping + + + + + Global bandwidth limiting + + + + + Upload: + + + + + Download: + + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + DHT port: + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + + + + + + (None) + + + + + + Proxy: + + + + + + + Username: + + + + + Bittorrent + + + + + Connections limit + + + + + Global maximum number of connections: + + + + + Maximum number of connections per torrent: + + + + + Maximum number of upload slots per torrent: + + + + + Enable DHT network (decentralized) + + + + + Enable Local Peer Discovery + + + + + Encryption: + + + + + Share ratio settings + + + + + Desired ratio: + + + + + Filter file path: + + + + + transfer lists refresh interval: + + + + + ms + + + + + + RSS + + + + + RSS feeds refresh interval: + + + + + minutes + + + + + Maximum number of articles per feed: + + + + + File system + + + + + Remove finished torrents when their ratio reaches: + + + + + System default + + + + + Start minimized + + + + + Web UI + + + + + Enable Web User Interface + + + + + HTTP Server + + + + + Enable RSS support + + + + + RSS settings + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Torrent queueing + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + + + + + DL Speed + i.e: Download speed + + + + + UP Speed + i.e: Upload speed + + + + + Seeds/Leechers + i.e: full/partial sources + + + + + Ratio + + + + + ETA + i.e: Estimated Time of Arrival / Time left + + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + + + + + Hide or Show Column + + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + + + + + + + Couldn't open %1 in read mode. + + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + + KiB/s + + + + + FinishedTorrents + + + Name + i.e: file name + + + + + Size + i.e: file size + + + + + UP Speed + i.e: Upload speed + + + + + Seeds / Leechers + + + + + Connected peers + + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Ratio + + + + + Hide or Show Column + + + + + GUI + + + Open Torrent Files + + + + + + + + + &Yes + + + + + + + + + &No + + + + + Are you sure you want to delete the selected item(s) in download list? + + + + + Torrent Files + + + + + + + + Are you sure? -- qBittorrent + + + + + Download finished + + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + + + + + + Connection status: + + + + + + qBittorrent + + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + + + + + Are you sure you want to quit? + + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + + + + + I/O Error + i.e: Input/Output Error + + + + + Connection Status: + + + + + Online + + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + + + + + Search + + + + + RSS + + + + + + DHT support [OFF] + + + + + PeX support [ON] + + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + + + + + + Downloads + + + + + Finished + + + + + Are you sure you want to delete the selected item(s) in finished list? + + + + + UPnP support [ON] + + + + + Encryption support [ON] + + + + + Encryption support [FORCED] + + + + + Encryption support [OFF] + + + + + Alt+1 + shortcut to switch to first tab + + + + + Alt+2 + shortcut to switch to second tab + + + + + Alt+4 + shortcut to switch to fourth tab + + + + + Url download error + + + + + Couldn't download file at url: %1, reason: %2. + + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + + + + + Alt+3 + shortcut to switch to third tab + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + UPnP support [OFF] + + + + + NAT-PMP support [ON] + + + + + NAT-PMP support [OFF] + + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + + + + + Local Peer Discovery support [OFF] + + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + Options were saved successfully. + + + + + MainWindow + + + &Edit + + + + + &File + + + + + &Help + + + + + Open + + + + + Exit + + + + + Preferences + + + + + About + + + + + Start + + + + + Pause + + + + + Delete + + + + + Pause All + + + + + Start All + + + + + Torrent Properties + + + + + Download from URL + + + + + Create torrent + + + + + Preview file + + + + + Clear log + + + + + Delete Permanently + + + + + Visit website + + + + + Report a bug + + + + + Set upload limit + + + + + Set download limit + + + + + Documentation + + + + + Set global download limit + + + + + Set global upload limit + + + + + Options + + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + + + Ignored + + + + + + + Normal + Normal (priority) + + + + + + High + High (priority) + + + + + + Maximum + Maximum (priority) + + + + + RSS + + + Search + + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + Feed URL + + + + + + Delete + + + + + + Rename + + + + + + Update + + + + + + Update all feeds + + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + + New folder + + + + + Refresh RSS streams + + + + + RSSImp + + + Please type a rss stream url + + + + + Stream URL: + + + + + + Are you sure? -- qBittorrent + + + + + + &Yes + + + + + + &No + + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + + + + + This rss feed is already in the list. + + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + + + + + Author: + + + + + Unread + + + + + RssItem + + + No description available + + + + + RssStream + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Empty search pattern + + + + + Please type a search pattern first + + + + + + Results + + + + + Searching... + + + + + Search Engine + + + + + + Search has finished + + + + + An error occured during search... + + + + + Search aborted + + + + + Search returned no results + + + + + Results + i.e: Search results + + + + + + Unknown + + + + + SearchTab + + + Name + i.e: file name + + + + + Size + i.e: file size + + + + + Seeders + i.e: Number of full sources + + + + + Leechers + i.e: Number of partial sources + + + + + Search engine + + + + + TrackersAdditionDlg + + + Trackers addition dialog + + + + + List of trackers to add (one per line): + + + + + about + + + qBittorrent + + + + + I would like to thank the following people who volunteered to translate qBittorrent: + + + + + Please contact me if you would like to translate qBittorrent into your own language. + + + + + addTorrentDialog + + + Torrent addition dialog + + + + + Save path: + + + + + ... + + + + + Torrent size: + + + + + + Unknown + + + + + Free disk space: + + + + + Torrent content: + + + + + Download in sequential order (slower but good for previewing) + + + + + Add to download list in paused state + + + + + Add + + + + + Cancel + + + + + Ignored + + + + + Normal + + + + + High + + + + + Maximum + + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + + + + + Tracker: + + + + + Login + + + + + Username: + + + + + Password: + + + + + Log in + + + + + Cancel + + + + + bandwidth_dlg + + + Bandwidth allocation + + + + + KiB/s + + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + + + + + '%1' was removed. + 'xxx.avi' was removed. + + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + + + + + This file is either corrupted or this isn't a torrent. + + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + + Fast resume data was rejected for torrent %1, checking again... + + + + + Url seed lookup failed for url: %1, message: %2 + + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + + + + + createTorrentDialog + + + Cancel + + + + + Torrent Creation Tool + + + + + Torrent file creation + + + + + Add file + + + + + Add folder + + + + + Announce urls (trackers): + + + + + Comment (optional): + + + + + Web seeds urls (optional): + + + + + File or folder to add to the torrent: + + + + + Piece size: + + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + + + + + Start seeding after creation + + + + + Create and save... + + + + + Progress: + + + + + createtorrent + + + Select destination torrent file + + + + + Torrent Files + + + + + No input path set + + + + + Please type an input path first + + + + + + + Torrent creation + + + + + Torrent was created successfully: + + + + + Select a folder to add to the torrent + + + + + Please type an announce URL + + + + + Torrent creation was unsuccessful, reason: %1 + + + + + Announce URL: + Tracker URL + + + + + Please type a web seed url + + + + + Web seed URL: + + + + + Select a file to add to the torrent + + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + + + + + Only one URL per line + + + + + Download + + + + + Cancel + + + + + Download from urls + + + + + No URL entered + + + + + Please type at least one URL. + + + + + downloading + + + Search + + + + + Start + + + + + Pause + + + + + Delete + + + + + Preview file + + + + + Set upload limit + + + + + Set download limit + + + + + Delete Permanently + + + + + Torrent Properties + + + + + Open destination folder + + + + + Name + + + + + Size + + + + + Progress + + + + + DLSpeed + + + + + UpSpeed + + + + + Seeds/Leechs + + + + + Ratio + + + + + ETA + + + + + Buy it + + + + + Priority + + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + + + + + Installed search engines: + + + + + Name + + + + + Url + + + + + Enabled + + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + + Install a new one + + + + + Check for updates + + + + + Close + + + + + Enable + + + + + Disable + + + + + Uninstall + + + + + engineSelectDlg + + + Uninstall warning + + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + + + + + Uninstall success + + + + + Select search plugins + + + + + + qBittorrent search plugins + + + + + + + + + + + + Search plugin install + + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + + + + + + + + + Search plugin update + + + + + + Sorry, update server is temporarily unavailable. + + + + + All your plugins are already up to date. + + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + + + + + All selected plugins were uninstalled successfully + + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + + + + + Search engine plugin archive could not be read. + + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + + + + + New search engine plugin URL + + + + + URL: + + + + + misc + + + B + bytes + + + + + KiB + kibibytes (1024 bytes) + + + + + MiB + mebibytes (1024 kibibytes) + + + + + GiB + gibibytes (1024 mibibytes) + + + + + TiB + tebibytes (1024 gibibytes) + + + + + Unknown + Unknown (size) + + + + + < 1m + < 1 minute + + + + + %1m + e.g: 10minutes + + + + + %1h%2m + e.g: 3hours 5minutes + + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + + + + + options_imp + + + + Choose scan directory + + + + + + Choose a save directory + + + + + + Choose an ip filter file + + + + + + Filters + + + + + pluginSourceDlg + + + Plugin source + + + + + Search plugin source: + + + + + Local file + + + + + Web link + + + + + preview + + + Preview selection + + + + + File preview + + + + + The following files support previewing, <br>please select one of them: + + + + + Preview + + + + + Cancel + + + + + previewSelect + + + + Preview impossible + + + + + + Sorry, we can't preview this file + + + + + Name + + + + + Size + + + + + Progress + + + + + properties + + + Torrent Properties + + + + + OK + + + + + Files contained in current torrent: + + + + + Size + + + + + Trackers: + + + + + + None - Unreachable? + + + + + Progress + + + + + Current tracker: + + + + + Total uploaded: + + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + + + + + Total failed: + + + + + Torrent content + + + + + Download in correct order (slower but good for previewing) + + + + + Save path: + + + + + Creator: + + + + + Torrent hash: + + + + + Comment: + + + + + Current session + + + + + Share ratio: + + + + + Trackers + + + + + Priorities: + + + + + Normal: normal priority. Download order is dependent on availability + + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + + + + + File name + + + + + + Priority + + + + + + qBittorrent + + + + + Trackers list can't be empty. + + + + + Ignored: file is not downloaded at all + + + + + Ignored + + + + + Normal + + + + + Maximum + + + + + High + + + + + Unknown + + + + + Url seeds + + + + + New url seed: + + + + + This url seed is already in the list. + + + + + New url seed + New HTTP source + + + + + The following url seeds are available for this torrent: + + + + + Priorities error + + + + + Error, you can't filter all the files in a torrent. + + + + + Downloaded pieces + + + + + Collapse all + + + + + Expand all + + + + + ... + + + + + + Choose save path + + + + + Save path creation error + + + + + Could not create the save path + + + + + search_engine + + + + Search + + + + + Status: + + + + + Stopped + + + + + Download + + + + + Search engines... + + + + + seeding + + + Search + + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + + + + + Start + + + + + Pause + + + + + Delete + + + + + Delete Permanently + + + + + Torrent Properties + + + + + Preview file + + + + + Set upload limit + + + + + Open destination folder + + + + + Name + + + + + Size + + + + + Upload Speed + + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + + Ratio + + + + + Buy it + + + + + Force recheck + + + + + Total uploaded + + + + + subDownloadThread + + + Host is unreachable + + + + + File was not found (404) + + + + + Connection was denied + + + + + Url is invalid + + + + + Connection failure + + + + + Connection was timed out + + + + + Incorrect network interface + + + + + Unknown error + + + + + I/O Error + + + + + Could not resolve proxy + + + + + torrentAdditionDialog + + + + Unable to decode torrent file: + + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + + Choose save path + + + + + Empty save path + + + + + Please enter a save path + + + + + Save path creation error + + + + + Could not create the save path + + + + + Invalid file selection + + + + + You must select at least one file in the torrent + + + + + File name + + + + + Size + + + + + Progress + + + + + + Priority + + + + diff --git a/src/lang/qbittorrent_es.qm b/src/lang/qbittorrent_es.qm new file mode 100644 index 0000000000000000000000000000000000000000..f85243dfcbdd745334d8cfbd22015d4edc27948a GIT binary patch literal 50214 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 iXaTCnE=z)w + + + + AboutDlg + + + About qBittorrent + Acerca de qBittorrent + + + + About + Acerca de + + + + Author + Autor + + + qBitorrent Author + Autor de qBitorrent + + + + Name: + Nombre: + + + + Country: + País: + + + + E-mail: + E-Mail: + + + + Home page: + Página Web: + + + + Christophe Dumez + Christophe Dumez + + + + France + Francia + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Gracias a + + + + Translation + Traducción + + + + License + Licencia + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Un cliente de bittorrent usando Qt4 y libtorrent, programado en C++<br> +<br> +Copyright © 2006 por Christophe Dumez<br> +<br><u>Página web:</u><i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + Autor de qBittorrent + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + Cumpleaños: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Occupation: + Profesión: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Estudiante de informática + + + + Thanks to + Gracias a + + + + BandwidthAllocationDialog + + + Upload limit: + Límite de subida: + + + + Download limit: + Límite de descarga: + + + + + + + Unlimited + Unlimited (bandwidth) + Ilimitado + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + + + + + General + General + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opciones -- qBittorrent + + + Options + Opciones + + + Main + Principal + + + Save Path: + Ruta de Guardado: + + + Download Limit: + Límite de Descarga: + + + Upload Limit: + Límite de Subida: + + + Max Connects: + Conexiones Máximas: + + + Port range: + Rango de Puertos: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Deshabilitar + + + connections + conexiones + + + to + hasta + + + + Proxy + Proxy + + + Proxy Settings + Configuración del Proxy + + + Server IP: + IP del servidor: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Puerto: + + + Proxy server requires authentication + El servidor Proxy requiere autentificarse + + + + + + Authentication + Autenticación + + + User Name: + Nombre de Usuario: + + + + + + Password: + Contraseña: + + + Enable connection through a proxy server + Habilitar conexión a través de un Servidor Proxy + + + Language + Idioma + + + Please choose your preferred language in the following list: + Por favor selecciona tu idioma preferido de la siguiente lista: + + + Language settings will take effect after restart. + La configuración del lenguaje tendrá efecto después de reiniciar. + + + OK + OK + + + Cancel + Cancelar + + + Scanned Dir: + Directorio a Explorar: + + + Enable directory scan (auto add torrent files inside) + Habilitar exploración de directorio (auto agregar archivos torrent dentro) + + + Connection Settings + Preferencias de la Conexión + + + Share ratio: + Radio de Compartición: + + + 1 KB DL = + 1 KB de Descarga = + + + KB UP max. + KB de subida max. + + + + Activate IP Filtering + Activar Filtro de IP + + + + Filter Settings + Preferencias del Filtro + + + ipfilter.dat URL or PATH: + URL o Ruta de ipfilter.dat: + + + Start IP + IP de inicio + + + End IP + IP Final + + + Origin + Origen + + + Comment + Comentario + + + Apply + Aplicar + + + + IP Filter + Filtro de IP + + + Add Range + Agregar Rango + + + Remove Range + Eliminar Rango + + + Catalan + Catalán + + + ipfilter.dat Path: + Ruta de ipfilter.dat: + + + Clear finished downloads on exit + Borrar descargas terminadas al salir + + + GUI + Interfaz Gráfica + + + Ask for confirmation on exit + Pedir confirmación al salir + + + Go to systray when minimizing window + Mandar a la barra de tareas al minimizar ventana + + + Misc + Misceláneos + + + Localization + Ubicación + + + + Language: + Idioma: + + + Behaviour + Comportamiento + + + OSD + OSD + + + Always display OSD + Mostrar siempre OSD + + + Display OSD only if window is minimized or iconified + Muestra OSD solo si la ventana esta minimizada o iconificada + + + Never display OSD + No mostrar nunca OSD + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB Descarga = + + + KiB UP max. + KiB Subida máx. + + + DHT (Trackerless): + DHT (Trackerless): + + + Disable DHT (Trackerless) support + Desabilitar soporte DHT (Trackerless) + + + Automatically clear finished downloads + Limpiar automáticamente descargas finalizadas + + + Preview program + Previsualizar programa + + + Audio/Video player: + Reproductor de Audio/Video: + + + DHT configuration + Configuración DHT + + + + DHT port: + Puerto DHT: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Nota: </b> Los cambios se aplicarán después de reiniciar qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Nota de los traductores:</b> Si qBittorrent no está disponible en tu idioma,<br/>y si quisieras traducirlo a tu lengua natal,<br/>por favor contáctame (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Desplegar un diálogo de agregar torrent cada que agregue un torrent + + + Default save path + Ruta de guardado por defecto + + + Systray Messages + Mensajes de Systray + + + Always display systray messages + Siempre mostrar mensajes de bandeja de sistema + + + Display systray messages only when window is hidden + Desplegar mensajes de la bandeja del sistema sólo cuando la ventana está oculta + + + Never display systray messages + Nunca desplegar mensajes de la bandeja del sistema + + + Disable DHT (Trackerless) + Desactivar DHT (Sin Tracker) + + + Disable Peer eXchange (PeX) + Desactivar Peer eXchange (PeX) + + + Go to systray when closing main window + Enviar a la bandeja del sistema cuando se cierre la ventana principal + + + + Connection + Conexión + + + Peer eXchange (PeX) + Intercambio de peers (PeX) + + + DHT (trackerless) + DHT (sin tracker) + + + Torrent addition + Agregar torrent + + + Main window + Ventana principal + + + Systray messages + Mensajes de bandeja del sistema + + + Directory scan + Análisis de directorio + + + Style (Look 'n Feel) + Estilo (Apariencia) + + + + Plastique style (KDE like) + Estilo Plastique (como KDE) + + + Cleanlooks style (GNOME like) + Estilo Cleanlooks (como GNOME) + + + Motif style (default Qt style on Unix systems) + Estilo Motif (el estilo por defecto de Qt en sistemas Unix) + + + + CDE style (Common Desktop Environment like) + Estilo CDE (como el Common Desktop Enviroment) + + + MacOS style (MacOSX only) + Estilo MacOS (solo para MacOSX) + + + Exit confirmation when the download list is not empty + Confirmar salida cuando la lista de descargas no está vacía + + + Disable systray integration + Deshabilitar integración con la bandeja del sistema + + + WindowsXP style (Windows XP only) + Estilo WindowsXP (solo para WindowsXP) + + + Server IP or url: + IP o url del servidor: + + + Proxy type: + Tipo de proxy: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Conexiones afectadas + + + + Use proxy for connections to trackers + Usar proxy para las conexiones a trackers + + + + Use proxy for connections to regular peers + Usar proxy para las conexiones a peers regulares + + + + Use proxy for connections to web seeds + Usar proxy para las conexiones a semillas de web + + + + Use proxy for DHT messages + Usar proxy para mensajes DHT + + + Encryption + Encriptado + + + Encryption state: + Estado de encriptación: + + + + Enabled + Habilitado + + + + Forced + Forzado + + + + Disabled + Deshabilitado + + + + Preferences + Preferencias + + + General + General + + + + User interface settings + Preferencias de interfaz de usuario + + + + Visual style: + Estilo visual: + + + + Cleanlooks style (Gnome like) + Estilo Cleanlooks (como Gnome) + + + + Motif style (Unix like) + Estilo Motif (como Unix) + + + + Ask for confirmation on exit when download list is not empty + Pedir confirmación al salir cuando la lista de descargas no esté vacía + + + + Display current speed in title bar + Mostrar velocidad actual en la barra de título + + + + System tray icon + Ícono de la bandeja del sistema + + + + Disable system tray icon + Deshabilitar ícono de la bandeja del sistema + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Mandar a la bandeja del sistema al cerrar + + + + Minimize to tray + Minimizar a la bandeja del sistema + + + + Show notification balloons in tray + Mostrar globos de notificación en la bandeja + + + Media player: + Reproductor de medios: + + + + Downloads + Descargas + + + Put downloads in this folder: + Poner las descargas en esta carpeta: + + + + Pre-allocate all files + Pre-localizar todos los archivos + + + + When adding a torrent + Al agregar un torrent + + + + Display torrent content and some options + Mostrar el contenido del torrent y algunas opciones + + + + Do not start download automatically + The torrent will be added to download list in pause state + No comenzar a descargar automáticamente + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Observación de carpetas + + + + UI + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + Download list: + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + Automáticamente descargar los torrents presentes en esta carpeta: + + + + Listening port + Puerto de escucha + + + to + i.e: 1200 to 1300 + hasta + + + + Enable UPnP port mapping + Habilitar mapeo de puertos UPnP + + + + Enable NAT-PMP port mapping + Habilitar mapeo de puertos NAT-PMP + + + + Global bandwidth limiting + Limite global de ancho de banda + + + + Upload: + Subida: + + + + Download: + Descarga: + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + Tipo: + + + + + (None) + (Ninguno) + + + + + Proxy: + Proxy: + + + + + + Username: + Nombre de Usuario: + + + + Bittorrent + Bittorrent + + + + Connections limit + Límite de conexiones + + + + Global maximum number of connections: + Número global máximo de conexiones: + + + + Maximum number of connections per torrent: + Número máximo de conexinoes por torrent: + + + + Maximum number of upload slots per torrent: + Número máximo de slots de subida por torrent: + + + Additional Bittorrent features + Funcionalidades adicionales de bittorrent + + + + Enable DHT network (decentralized) + Habilitar red DHT (descentralizada) + + + Enable Peer eXchange (PeX) + Habilitar Peer eXchange (PeX) + + + + Enable Local Peer Discovery + Habilitar descubrimiento local de peers + + + + Encryption: + Encripción: + + + + Share ratio settings + Preferencias de radio de compartición + + + + Desired ratio: + Radio deseado: + + + + Filter file path: + Ruta de archivos de filtro: + + + + transfer lists refresh interval: + Intervalo de actualización de listas de transferencia: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + Intervalo de actualización de feeds de RSS: + + + + minutes + minutos + + + + Maximum number of articles per feed: + Número máximo de artículos por feed: + + + + File system + Sistema de archivos + + + + Remove finished torrents when their ratio reaches: + Eliminar torrents terminados cuando su radio llega a: + + + + System default + Por defecto del systema + + + + Start minimized + Iniciar minimizado + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Acción al hacer doble clic en listas de transferencia + + + In download list: + En lista de descarga: + + + Pause/Start torrent + Pausar/Iniciar torrent + + + Open destination folder + Abrir carpeta de destino + + + Display torrent properties + Mostrar propiedades del torrent + + + In seeding list: + En lista de seeding: + + + Folder scan interval: + Intervalo de comprobación de carpeta: + + + seconds + segundos + + + Spoof Azureus to avoid ban (requires restart) + Engañar a Azureus para evitar ban (requiere reiniciar) + + + + Web UI + IU Web + + + + Port used for incoming connections: + + + + + Random + + + + + Enable Web User Interface + Habilitar Interfaz de Usuario Web + + + + HTTP Server + Servidor HTTP + + + + Enable RSS support + + + + + RSS settings + + + + + Torrent queueing + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + Nombre + + + + Size + i.e: file size + Tamaño + + + + Progress + i.e: % downloaded + Progreso + + + + DL Speed + i.e: Download speed + Velocidad de Descarga + + + + UP Speed + i.e: Upload speed + Velocidad de Subida + + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + Semillas/Leechs + + + + Ratio + Radio + + + + ETA + i.e: Estimated Time of Arrival / Time left + Tiempo Restante Aproximado + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + Be careful, sharing copyrighted material without permission is against the law. + Ten cuidado, compartir material protegido sin permiso es ilegal. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>ha sido bloqueado</i> + + + Fast resume data was rejected for torrent %1, checking again... + Se negaron los datos para reinicio rápido del torrent: %1, verificando de nuevo... + + + Url seed lookup failed for url: %1, message: %2 + Falló la búsqueda de semilla por Url para la url: %1, mensaje: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' agregado a la lista de descargas. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' reiniciado. (reinicio rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' ya está en la lista de descargas. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Imposible decodificar el archivo torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Este archivo puede estar corrupto, o no ser un torrent. + + + Couldn't listen on any of the given ports. + No se pudo escuchar en ninguno de los puertos brindados. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Descargando '%1', por favor espera... + + + + Hide or Show Column + Ocultar o Mostrar Columna + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falló el mapeo del puerto, mensaje: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Mapeo del puerto exitoso, mensaje: %1 + + + Priority + Prioridad + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Error de E/S + + + + + + Couldn't open %1 in read mode. + No se pudo abrir %1 en modo lectura. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 no es un archivo PeerGuardian P2B válido. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Terminado + + + + Name + i.e: file name + Nombre + + + + Size + i.e: file size + Tamaño + + + + Seeds / Leechers + + + + + Connected peers + + + + Progress + i.e: % downloaded + Progreso + + + DL Speed + i.e: Download speed + Velocidad de Descarga + + + + UP Speed + i.e: Upload speed + Velocidad de Subida + + + Seeds/Leechs + i.e: full/partial sources + Semillas/Leechs + + + Status + Estado + + + ETA + i.e: Estimated Time of Arrival / Time left + Tiempo Restante Aproximado + + + Finished + i.e: Torrent has finished downloading + Terminado + + + None + i.e: No error message + Ninguno + + + + Ratio + Radio + + + Leechers + i.e: full/partial sources + Leechers + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Hide or Show Column + Ocultar o Mostrar Columna + + + Incomplete torrent in seeding list + Torrent incompleto en lista de seeding + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Parece que el estado del torrent '%1' ha cambiado de 'seeding' a 'descargando'. ¿Le gustaría moverlo nuevamente a la lista de descargas? (de otra manera el torrent simplemente será eliminado) + + + Priority + Prioridad + + + + GUI + + started. + iniciado. + + + DL Speed: + Velocidad de Descarga: + + + kb/s + kb/s + + + UP Speed: + Velocidad de Subida: + + + Couldn't create the directory: + No se pudo crear el directorio: + + + + Open Torrent Files + Abrir archivos Torrent + + + + Torrent Files + Archivos Torrent + + + already in download list. + <file> already in download list. + ya está en la lista de descargas. + + + MB + MB + + + kb/s + kb/s + + + Unknown + Desconocido + + + added to download list. + agregado a la lista de descargas. + + + resumed. (fast resume) + Reiniciado (reiniciado rápido) + + + Unable to decode torrent file: + Imposible decodificar el archivo torrent: + + + This file is either corrupted or this isn't a torrent. + Este archivo puede estar corrupto, o no ser un torrent. + + + Are you sure you want to delete all files in download list? + ¿Seguro que quieres eliminar todos los archivos de la lista de descargas? + + + + + + + + &Yes + &Sí + + + + + + + + &No + &No + + + Download list cleared. + Lista de descargas borrada. + + + + Are you sure you want to delete the selected item(s) in download list? + ¿Seguro que quieres borrar el o los elemento(s) seleccionados de la lista de descargas? + + + removed. + <file> removed. + eliminado. + + + paused + en pausa + + + All Downloads Paused. + Todas las Descargas en Pausa. + + + started + iniciado + + + All Downloads Resumed. + Todas las Descargas Continuadas. + + + paused. + <file> paused. + en pausa. + + + resumed. + <file> resumed. + continuada. + + + + Finished + Terminada + + + Checking... + Verificando... + + + Connecting... + Conectando... + + + Downloading... + Bajando... + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Listening on port: + Escuchando en el puerto: + + + Couldn't listen on any of the given ports + No se pudo escuchar en ninguno de los puertos brindados + + + qBittorrent + qBittorrent + + + + + qBittorrent + qBittorrent + + + + + + + Are you sure? -- qBittorrent + ¿Estás seguro? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Velocidad de Descarga: + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: Por Christophe Dumez :: Copyright (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Estado de la Conexión:</b><br>En línea + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Estado de la Conexión:</b><br>¿Con Firewall?<br><i>Sin conexiones entrantes...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Estado de la Conexión:</b><br>Desconectado<br><i>No se encontraron nodos...</i> + + + has finished downloading. + se ha terminado de descargar. + + + Couldn't listen on any of the given ports. + red + No se pudo escuchar en ninguno de los puertos brindados. + + + Couldn't listen on any of the given ports. + No se pudo escuchar en ninguno de los puertos brindados. + + + None + Ninguno + + + Empty search pattern + Patrón de búsqueda vacío + + + Please type a search pattern first + Por favor escriba un patrón de búsqueda primero + + + No seach engine selected + No seleccionaste motor de búsqueda + + + You must select at least one search engine. + Debes seleccionar al menos un motor de búsqueda. + + + Searching... + Buscando... + + + Could not create search plugin. + No se pudo crear el plugin de búsqueda. + + + Stopped + Detenido + + + I/O Error + Error de Entrada/Salida + + + Couldn't create temporary file on hard drive. + No se pudo crear archivo temporal en Disco Duro. + + + Torrent file URL + URL del archivo torrent + + + Downloading using HTTP: + Descargar usando HTTP: + + + Torrent file URL: + URL del archivo torrent: + + + Are you sure you want to quit? -- qBittorrent + ¿Seguro que quieres salir? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + ¿Seguro que quieres salir de qbittorrent? + + + Timed out + Fuera de tiempo + + + Error during search... + Error durante la búsqueda... + + + Failed to download: + No se pudo descargar: + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + A http download failed, reason: + Una descarga http falló, razón: + + + Stalled + Detenida + + + Search is finished + La busqueda ha finalizado + + + An error occured during search... + Ocurrió un error durante la búsqueda... + + + Search aborted + Búsqueda abortada + + + Search returned no results + La búsqueda no devolvió resultados + + + Search is Finished + La búsqueda ha finalizado + + + Search plugin update -- qBittorrent + Actualizador de plugin de búsqueda -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + El plugin de búsqueda puede ser actualizado, quieres actualizarlo? + +Log: + + + + Sorry, update server is temporarily unavailable. + Lo siento, el servidor de actualización esta temporalmente no disponible. + + + Your search plugin is already up to date. + Tu plugin de búsqueda vuelve a estar actualizado. + + + Results + Resultados + + + Name + Nombre + + + Size + Tamaño + + + Progress + Progreso + + + DL Speed + Velocidad de Descarga + + + UP Speed + Velocidad de Subida + + + Status + Estado + + + ETA + Tiempo Restante Aproximado + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Motor de búsqueda + + + Stalled + state of a torrent whose DL Speed is 0 + Detenida + + + Preview process already running + Previsualizar procesos activos + + + There is already another preview process running. +Please close the other one first. + Hay otro proceso de previsualización corriendo. +Por favor cierra el otro antes. + + + Couldn't download + Couldn't download <file> + No se pudo descargar + + + reason: + Reason why the download failed + Razón: + + + Downloading + Example: Downloading www.example.com/test.torrent + Descargando + + + Please wait... + Por favor espere... + + + Transfers + Transferidos + + + Are you sure you want to quit qBittorrent? + ¿Seguro que deseas salir de qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + ¿Seguro que deseas borrar el o los elementos seleccionados de la lista de descargas y del disco duro? + + + + Download finished + Descarga terminada + + + has finished downloading. + <filename> has finished downloading. + se ha terminado de descargar. + + + Search Engine + Motor de Búsqueda + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Estado de la conexión: + + + Offline + Offline + + + No peers found... + No se encontraron peers... + + + Name + i.e: file name + Nombre + + + Size + i.e: file size + Tamaño + + + Progress + i.e: % downloaded + Progreso + + + DL Speed + i.e: Download speed + Velocidad de Descarga + + + UP Speed + i.e: Upload speed + Velocidad de Subida + + + Seeds/Leechs + i.e: full/partial sources + Semillas/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + Tiempo Restante Aproximado + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Velocidad de Descarga: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Velocidad de subida: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Terminado + + + Checking... + i.e: Checking already downloaded parts... + Verificando... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Detenida + + + + Are you sure you want to quit? + ¿Estás seguro de que deseas salir? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' fue removido. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' agregado a la lista de descargas. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' reiniciado. (reinicio rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' ya está en la lista de descargas. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Imposible decodificar el archivo torrent: '%1' + + + None + i.e: No error message + Ninguno + + + Listening on port: %1 + e.g: Listening on port: 1666 + Escuchando en el puerto: %1 + + + All downloads were paused. + Todas las descargas en pausa. + + + '%1' paused. + xxx.avi paused. + '%1' en pausa. + + + Connecting... + i.e: Connecting to the tracker... + Conectando... + + + All downloads were resumed. + Todas las descargas reiniciadas. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' reiniciado. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 ha terminado de descargarse. + + + + I/O Error + i.e: Input/Output Error + Error de Entrada/Salida + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Un error ocurrió mientras se intentaba leer o escribir %1. El disco tal vez esté lleno, la descarga fue pausada + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Un error ocurrió (¿disco lleno?), '%1' pausado. + + + + Connection Status: + Estado de la conexión: + + + + Online + En línea + + + Firewalled? + i.e: Behind a firewall/router? + ¿Con firewall? + + + No incoming connections... + Sin conexiones entrantes... + + + No search engine selected + No se eligió ningún motor de búsqueda + + + Search plugin update + Actualización del plugin de búsqueda + + + Search has finished + Búsqueda terminada + + + Results + i.e: Search results + Resultados + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Descargando '%1', por favor espera... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Un error ocurrió (¿disco lleno?), '%1' pausado. + + + + Search + Buscar + + + + RSS + RSS + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent está asignado al puerto: %1 + + + DHT support [ON], port: %1 + Soporte para DHT [encendido], puerto: %1 + + + + + DHT support [OFF] + Soporte para DHT [apagado] + + + + PeX support [ON] + Soporte para PeX [encendido] + + + PeX support [OFF] + Soporte para PeX [apagado] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + La lista de descargas no está vacía. +¿En verdad deseas salir de qBittorrent? + + + + + Downloads + Descargas + + + + Are you sure you want to delete the selected item(s) in finished list? + ¿Estás seguro de que deseas borrar los íconos seleccionados en la lista de terminados? + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + UPnP support [ON] + Soporte para UPnP [encendido] + + + Be careful, sharing copyrighted material without permission is against the law. + Ten cuidado, compartir material protegido sin permiso es ilegal. + + + + Encryption support [ON] + Soporte para encriptado [encendido] + + + + Encryption support [FORCED] + Soporte para encriptado [forzado] + + + + Encryption support [OFF] + Sopote para encriptado [apagado] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>ha sido bloqueado</i> + + + Ratio + Radio + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Error de descarga de Url + + + + Couldn't download file at url: %1, reason: %2. + No se pudo descargar el archivo en la url: %1, razón: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Se negaron los datos para reinicio rápido del torrent: %1, verificando de nuevo... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + ¿Estás seguro de que deseas borrar los elementos seleccionados de la lista de descargas y el disco duro? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + ¿Estás seguro de que deseas borrar los elementos selccionados de la lista de terminados y el disco duro? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' fue borrado permanentemente. + + + Url seed lookup failed for url: %1, message: %2 + Falló la búsqueda de semilla por Url para la url: %1, mensaje: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl + F + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' fue eliminado porque su radio llegó al valor máximo que estableciste. + + + + UPnP support [OFF] + Soporte para UPnP [Apagado] + + + + NAT-PMP support [ON] + Soporte para NAT-PMP [Encendido] + + + + NAT-PMP support [OFF] + Soporte para NAT-PMP[Apagado] + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + Descubrimiento local de Peers [Encendido] + + + + Local Peer Discovery support [OFF] + Soporte para descubrimiento local de Peers [Apagado] + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + Options were saved successfully. + Opciones guardadas exitosamente. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Por Christophe Dumez + + + Log: + Registro: + + + Total DL Speed: + Velocidad Total de Descarga: + + + Kb/s + Kb/s + + + Total UP Speed: + Velocidad Total de Subida: + + + Name + Nombre + + + Size + Tamaño + + + % DL + % Descargado + + + DL Speed + Velocidad de Descarga + + + UP Speed + Velocidad de Subida + + + Status + Estado + + + ETA + Tiempo Restante Aproximado + + + &Options + &Opciones + + + + &Edit + &Editar + + + + &File + &Archivo + + + + &Help + &Ayuda + + + + Open + Abrir + + + + Exit + Salir + + + + Preferences + Preferencias + + + + About + Acerca de + + + + Start + Comenzar + + + + Pause + Pausa + + + + Delete + Borrar + + + + Pause All + Pausa a Todas + + + + Start All + Comenzar Todas + + + + Documentation + Documentación + + + Connexion Status + Estado de la Conexión + + + Delete All + Borrar Todas + + + + Torrent Properties + Propiedades del Torrent + + + Connection Status + Estado de la Conexión + + + Downloads + Descargas + + + Search + Búsquedas + + + Search Pattern: + Patrón de Búsqueda: + + + Status: + Estado: + + + Stopped + Detenido + + + Search Engines + Motores de Búsqueda + + + Results: + Resultados: + + + Stop + Detenido + + + Seeds + Semillas + + + Leechers + Sepas + + + Search Engine + Motor de Búsqueda + + + + Download from URL + Descargar de URL + + + Download + Descargar + + + Clear + Limpiar + + + KiB/s + KiB/s + + + + Create torrent + Crear torrent + + + Ratio: + Radio: + + + Update search plugin + Actualizar plugin de búsqueda + + + Session ratio: + Radio de sesión: + + + Transfers + Transferidos + + + + Preview file + Previsualizar archivo + + + + Clear log + Limpiar registro + + + + Delete Permanently + Borrar permanentemente + + + + Visit website + Visitar website + + + + Report a bug + Reportar un bug + + + + Set upload limit + Establece el límite de subida + + + + Set download limit + Establece el límite de descarga + + + Log + Registro + + + IP filter + Filtro de IP + + + + Set global download limit + Establece el límite de descarga global + + + + Set global upload limit + Establece el límite de subida global + + + + Options + Opciones + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + False + Falso + + + True + Verdadero + + + + + Ignored + Ignorado + + + + + + Normal + Normal (priority) + Normal + + + + + High + High (priority) + Alta + + + + + Maximum + Maximum (priority) + Máxima + + + + QTextEdit + + Clear + Limpiar + + + + RSS + + + Search + Buscar + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + Feed URL + + + + + + Update + + + + + New folder + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + + Update all feeds + + + + + + Delete + Borrar + + + + + Rename + Renombrar + + + Refresh + Actualizar + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + Create + Crear + + + Delete selected streams + Borrar los flujos seleccionados + + + + Refresh RSS streams + Actualizar los flujos de RSS + + + Add a new RSS stream + Agregar un nuevo flujo de RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Noticias: </b> <i>(da doble clic para abrir el vínculo en tu navegador)</i> + + + Add RSS stream + Agregar flujo RSS + + + Refresh all streams + Actualizar todos los flujos + + + RSS streams: + Flujos RSS: + + + 2 + 2 + + + Mark all as read + Marcar todos como leídos + + + + RSSImp + + + Please type a rss stream url + Por favor escribe una URL de flujo de RSS + + + + Stream URL: + URL del flujo: + + + Please choose a new name for this stream + Por favor selecciona un nuevo nombre para este flujo + + + New stream name: + Nuevo nombre del flujo: + + + + + Are you sure? -- qBittorrent + ¿Estás seguro? -- qBittorrent + + + + + &Yes + &Sí + + + + + &No + &No + + + Are you sure you want to delete this stream from the list? + ¿Estás seguro de que deseas borrar este flujo de la lista? + + + Description: + Descripción: + + + url: + url: + + + Last refresh: + Última actualización: + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Esta fuente de rss ya está en la lista. + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + Fecha: + + + + Author: + Autor: + + + + Unread + + + + + RssItem + + + No description available + Sin descripción disponible + + + + RssStream + + %1 ago + 10min ago + Hace %1 + + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + Never + Nunca + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Nombre + + + Size + i.e: file size + Tamaño + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Motor de búsqueda + + + + Empty search pattern + Patrón de búsqueda vacío + + + + Please type a search pattern first + Por favor escriba un patrón de búsqueda primero + + + No search engine selected + No se eligió ningún motor de búsqueda + + + You must select at least one search engine. + Debes seleccionar al menos un motor de búsqueda. + + + + + Results + Resultados + + + + Searching... + Buscando... + + + Search plugin update -- qBittorrent + Actualizador de plugin de búsqueda -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + El plugin de búsqueda puede ser actualizado, quieres actualizarlo? + +Log: + + + + &Yes + &Sí + + + &No + &No + + + Search plugin update + Actualización del plugin de búsqueda + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Lo siento, el servidor de actualización esta temporalmente no disponible. + + + Your search plugin is already up to date. + Tu plugin de búsqueda vuelve a estar actualizado. + + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Search Engine + Motor de Búsqueda + + + + + Search has finished + Búsqueda terminada + + + + An error occured during search... + Ocurrió un error durante la búsqueda... + + + + Search aborted + Búsqueda abortada + + + + Search returned no results + La búsqueda no devolvió resultados + + + + Results + i.e: Search results + Resultados + + + Search plugin download error + Error en la descarga del plugin de búsqueda + + + Couldn't download search plugin update at url: %1, reason: %2. + No se pudo descargar la actualización del plugin de búsqueda en la url: %1, razón: %2. + + + + + Unknown + Desconocido + + + + SearchTab + + + Name + i.e: file name + Nombre + + + + Size + i.e: file size + Tamaño + + + + Seeders + i.e: Number of full sources + Seeders + + + + Leechers + i.e: Number of partial sources + Leechers + + + + Search engine + Motor de búsqueda + + + + TrackersAdditionDlg + + + Trackers addition dialog + Diálogo de adición de trackers + + + + List of trackers to add (one per line): + Lista de trackers a añadir (uno por línea): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + Quiero agradecer a las siguientes personas que voluntariamente tradujeron qBittorrent: + + + Please contact me if you would like to translate qBittorrent to your own language. + Por favor contáctame si quisieras traducir qBittorrent a tu propio idioma. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Quiero agradecer a sourceforge.net por hospedar el proyecto qBittorrent. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Quiero agradecer a las siguientes personas que voluntariamente tradujeron qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Quiero agradecer a sourceforge.net por hospedar el proyecto qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Tambien quiero agradecer a Jeffery Fernandez (developer@jefferyfernandez.id.au), nuestro empaquetador de RPM, por su gran trabajo.</li></ul> + + + Preview impossible + Imposible previsualizar + + + Sorry, we can't preview this file + Lo siento, no podemos previsualizar este archivo + + + Name + Nombre + + + Size + Tamaño + + + Progress + Progreso + + + No URL entered + No se a entrado ninguna URL + + + Please type at least one URL. + Por favor entra al menos una URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contáctame si quieres traducir qBittorrent a tu propio idioma. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Quiero agradecer a las siguientes personas que voluntariamente tradujeron qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contáctame si quieres traducir qBittorrent a tu propio idioma. + + + + addTorrentDialog + + + Torrent addition dialog + Diálogo de adición de torrent + + + + Save path: + Ruta de guardado: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + Desconocido + + + + Free disk space: + + + + + Torrent content: + Contenido del torrent: + + + + Download in sequential order (slower but good for previewing) + + + + File name + Nombre del archivo + + + File size + Tamaño del archivo + + + Selected + Seleccionado + + + Download in correct order (slower but good for previewing) + Descargar por orden (mas lento pero mejor para previsualizar) + + + + Add to download list in paused state + Agregar a la lista de descargas en estado de pausa + + + + Add + Agregar + + + + Cancel + Cancelar + + + select + seleccionar + + + Unselect + Deseleccionar + + + Select + Seleccionar + + + + Ignored + Ignorado + + + + Normal + Normal + + + + High + Alta + + + + Maximum + Máxima + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + Autentificación del Tracker + + + + Tracker: + Tracker: + + + + Login + Autentificarse + + + + Username: + Usuario: + + + + Password: + Contraseña: + + + + Log in + Conectar + + + + Cancel + Cancelar + + + + bandwidth_dlg + + + Bandwidth allocation + Uso de ancho de banda + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' fue borrado permanentemente. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' fue removido. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' en pausa. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' reiniciado. + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' ya está en la lista de descargas. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' reiniciado. (reinicio rápido) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' agregado a la lista de descargas. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Imposible decodificar el archivo torrent: '%1' + + + + This file is either corrupted or this isn't a torrent. + Este archivo puede estar corrupto, o no ser un torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + No se pudo escuchar en ninguno de los puertos brindados. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falló el mapeo del puerto, mensaje: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Mapeo del puerto exitoso, mensaje: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Se negaron los datos para reinicio rápido del torrent: %1, verificando de nuevo... + + + + Url seed lookup failed for url: %1, message: %2 + Falló la búsqueda de semilla por Url para la url: %1, mensaje: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Descargando '%1', por favor espera... + + + + createTorrentDialog + + Create Torrent file + Crear archivo Torrent + + + Destination torrent file: + Archivo Torrent de destino: + + + Input file or directory: + Archivo o directorio de entrada: + + + Comment: + Comentario: + + + ... + ... + + + Create + Crear + + + + Cancel + Cancelar + + + Announce url (Tracker): + URL de anuncio (tracker): + + + Directory + Directorio + + + + Torrent Creation Tool + Herramienta de Creación de Torrent + + + <center>Destination torrent file:</center> + <center>Archivo Torrent Destino:</center> + + + <center>Input file or directory:</center> + <center>Archivo o Directorio de Entrada:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>URL Anunciada:<br>(Una por línia)</center> + + + <center>Comment:</center> + <center>Comentario:</center> + + + + Torrent file creation + Creación de archivo torrent + + + Input files or directories: + Archivos o directorios de entrada: + + + + Announce urls (trackers): + Url's de anuncio (trackers): + + + + Comment (optional): + Comentario (opcional): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privado (no se distribuirá en una red sin trackers / DHT si se habilita) + + + + Web seeds urls (optional): + Url's de semillas web (opcional): + + + + File or folder to add to the torrent: + Archivo o carpeta a agregar al torrent: + + + Add a file + Agregar un archivo + + + Add a folder + Agregar una carpeta + + + + Add file + + + + + Add folder + + + + + Piece size: + Tamaño de la pieza: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Privado (no se distribuirá por red DHT si se habilita) + + + + Start seeding after creation + Comenzar con las semillas después de la creación + + + + Create and save... + Crear y guardar... + + + + Progress: + Progreso: + + + + createtorrent + + + Select destination torrent file + Selecciona destino para el archivo torrent + + + + Torrent Files + Archivos Torrent + + + Select input directory or file + Selecciona directorio de entrara o archivo + + + No destination path set + No hay una ruta de destino establecida + + + Please type a destination path first + Por favor escribe una ruta de destino primero + + + + No input path set + Sin ruta de destino establecida + + + + Please type an input path first + Por favor escribe una ruta de entrara primero + + + Input path does not exist + La ruta de entrada no existe + + + Please type a correct input path first + Por favor escribe una ruta de entrada correcta primero + + + + + + Torrent creation + Crear Torrent + + + + Torrent was created successfully: + El Torrent se creó con éxito: + + + Please type a valid input path first + Por favor digita una ruta de entrada válida primero + + + + Select a folder to add to the torrent + Selecciona otra carpeta para agregar al torrent + + + Select files to add to the torrent + Selecciona los archivos para agregar al torrent + + + + Please type an announce URL + Por favor escribe una URL de anuncio + + + + Torrent creation was unsuccessful, reason: %1 + La creación del torrent no ha sido exitosa, razón: %1 + + + + Announce URL: + Tracker URL + URL de anuncio: + + + + Please type a web seed url + Por favor escribe una url de semilla web + + + + Web seed URL: + URL de semilla web: + + + + Select a file to add to the torrent + Selecciona otro archivo para agregar al torrent + + + No tracker path set + No se estableció la ruta del tracker + + + Please set at least one tracker + Por favor establece al menos un tracker + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + Descargar torrents de URLs + + + + Only one URL per line + Solo una URL por linea + + + + Download + Descargar + + + + Cancel + Cancelar + + + + Download from urls + Descargar de urls + + + + No URL entered + No se ha escrito ninguna URL + + + + Please type at least one URL. + Por favor escribe al menos una URL. + + + + downloading + + + Search + Buscar + + + Total DL Speed: + Velocidad Total de Descarga: + + + KiB/s + KiB/s + + + Session ratio: + Media en sesión: + + + Total UP Speed: + Velocidad Total de Subida: + + + Log + Registro + + + IP filter + Filtro de IP + + + + Start + Comenzar + + + + Pause + Pausa + + + + Delete + Borrar + + + Clear + Limpiar + + + + Preview file + Previsualizar archivo + + + + Set upload limit + Establece el límite de subida + + + + Set download limit + Establece el límite de descarga + + + + Delete Permanently + Borrar permanentemente + + + + Torrent Properties + Propiedades del Torrent + + + + Open destination folder + Abrir carpeta de destino + + + + Name + Nombre + + + + Size + Tamaño + + + + Progress + Progreso + + + + DLSpeed + Velocidad de Descarga + + + + UpSpeed + Velocidad de Subida + + + + Seeds/Leechs + Seeds/Leechs + + + + Ratio + Radio + + + + ETA + Tiempo estimado + + + + Buy it + Comprarlo + + + + Priority + Prioridad + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + Buscar plugins + + + + Installed search engines: + Motores de búsqueda instalados: + + + + Name + Nombre + + + + Url + Url + + + + Enabled + Habilitado + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Puedes obtener nuevos plugins de motores de búsqueda aquí <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Instalar uno nuevo + + + + Check for updates + Buscar actualizaciones + + + + Close + Cerrar + + + + Enable + Habilitar + + + + Disable + Deshabilitar + + + + Uninstall + Desinstalar + + + + engineSelectDlg + + True + Verdadero + + + False + Falso + + + + Uninstall warning + Alerta de desinstalación + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Algunos plugins no pudieron ser instalados porque están incluídos en qBittorrent. +Solamente los que has agregado por tí mismo pueden ser desinstalados. +De cualquier forma, esos plugins fueron deshabilitados. + + + + Uninstall success + Éxito de desinstalación + + + + Select search plugins + Selecciona los plugins de búsqueda + + + + + qBittorrent search plugins + Plugins de búsqueda de qBittorrent + + + + + + + + + + + Search plugin install + Instalar plugin de búsqueda + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Una versión más reciente del plugin de motor de búsqueda %1 ya está instalada. + + + + + + + + Search plugin update + Actualización del plugin de búsqueda + + + + + Sorry, update server is temporarily unavailable. + Lo siento, el servidor de actualización esta temporalmente no disponible. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Lo lamento, la actualización del plugin de búsqueda %1 ha fallado. + + + + All your plugins are already up to date. + Todos tus plugins ya están actualizados. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + El plugin de motor de búsqueda %1 no pudo ser actualizado, manteniendo la versión antigua. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + El plugin de motor de búsqueda %1 no pudo ser instalado. + + + + All selected plugins were uninstalled successfully + Todos los plugins seleccionados fueron instalados exitosamente + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + El plugin de motor de búsqueda %1 fue actualizado exitosamente. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + El plugin de motor de búsqueda %1 fue instalado exitosamente. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + El plugin de búsqueda %1 fué actualizado exitosamente. + + + + Search engine plugin archive could not be read. + El archivo de plugin de motor de búsqueda no pudo ser leído. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Lo lamento, la instalación del plugin de búsqueda %1 ha fallado. + + + + New search engine plugin URL + URL del nuevo plugin de motor de búsqueda + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Unknown + Desconocido + + + h + hours + h + + + d + days + d + + + + Unknown + Unknown (size) + Desconocido + + + + < 1m + < 1 minute + <1m + + + + %1m + e.g: 10minutes + %1m + + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + ¡Opciones guardadas exitosamente! + + + Choose Scan Directory + Selecciona el Directorio de Exploración + + + Choose save Directory + Selecciona el Directorio de Guardado + + + Choose ipfilter.dat file + Selecciona el archivo ipfilter.dat + + + I/O Error + Error de Entrada/Salida + + + Couldn't open: + No se pudo abrir: + + + in read mode. + en modo lectura. + + + Invalid Line + línea inválida + + + Line + Línea + + + is malformed. + está mal formado. + + + Range Start IP + IP de inicio de Rango + + + Start IP: + IP de inicio: + + + Incorrect IP + IP Incorrecta + + + This IP is incorrect. + Esta IP está incorrecta. + + + Range End IP + IP de fin de Rango + + + End IP: + IP Final: + + + IP Range Comment + Comentario del rango de IP + + + Comment: + Comentario: + + + to + <min port> to <max port> + hasta + + + Choose your favourite preview program + Escoge tu programa de previsualización favorito + + + Invalid IP + IP inválida + + + This IP is invalid. + Esta IP es inválida. + + + Options were saved successfully. + Opciones guardadas exitosamente. + + + + + Choose scan directory + Selecciona un directorio a inspeccionar + + + Choose an ipfilter.dat file + Selecciona un archivo ipfilter.dat + + + + + Choose a save directory + Selecciona un directorio para guardar + + + I/O Error + Input/Output Error + Error de Entrada/Salida + + + Couldn't open %1 in read mode. + No se pudo abrir %1 en modo lectura. + + + + + Choose an ip filter file + Selecciona un archivo de filtro de ip + + + + + Filters + Filtros + + + + pluginSourceDlg + + + Plugin source + Fuente del plugin + + + + Search plugin source: + Fuente del plugin de búsqueda: + + + + Local file + Archivo local + + + + Web link + Vínculo web + + + + preview + + + Preview selection + Previsualizar selección + + + + File preview + Archivo previsualizado + + + + The following files support previewing, <br>please select one of them: + Los siguientes archivos soportan previsualización, <br>por favor selecciona uno de ellos: + + + + Preview + Previsualización + + + + Cancel + Cancelar + + + + previewSelect + + + + Preview impossible + Imposible previsualizar + + + + + Sorry, we can't preview this file + Lo siento, no podemos previsualizar este archivo + + + + Name + Nombre + + + + Size + Tamaño + + + + Progress + Progreso + + + + properties + + + Torrent Properties + Propiedades del Torrent + + + Main Infos + Información Principal + + + File Name + Nombre del Archivo + + + Current Session + Sesión Actual + + + Total Uploaded: + Total Subido: + + + Total Downloaded: + Total Descargado: + + + upTotal + Total Subido + + + dlTotal + Total Descargado + + + Download state: + Estado de la Descarga: + + + Current Tracker: + Tracker Actual: + + + Number of Peers: + Número de Nodos: + + + dlState + Estado de la Descarga + + + tracker_URL + URL del tracker + + + nbPeers + Nodos + + + (Complete: 0.0%, Partial: 0.0%) + (Completo: 0.0%, Parcial: 0.0%) + + + Torrent Content + Contenido del Torrent + + + + OK + OK + + + Cancel + Cancelar + + + Total Failed: + Total Fallado: + + + failed + fallado + + + Finished + Terminado + + + Queued for checking + En cola para verificación + + + Checking files + Verificando archivos + + + Connecting to tracker + Conectando al tracker + + + Downloading Metadata + Descargando Metadatos + + + Downloading + Descargando + + + Seeding + Poniendo Semillas + + + Allocating + Localizando + + + Unreachable? + ¿Inaccesible? + + + MB + MB + + + + Unknown + Desconocido + + + Complete: + Completo: + + + Partial: + Parcial: + + + Tracker + Tracker + + + + Trackers: + Trackers: + + + + Files contained in current torrent: + Archivos que contiene el torrent actual: + + + Unselect + Deseleccionar + + + Select + Seleccionar + + + You can select here precisely which files you want to download in current torrent. + Puedes seleccionar aquí qué archivos deseas descargar específicamente en el torrent actual. + + + + Size + Tamaño + + + Selected + Seleccionado + + + + + None - Unreachable? + Nada - ¿Inaccesible? + + + False + Falso + + + True + Verdadero + + + Errors: + Errores: + + + + Progress + Progreso + + + Main infos + Información Principal + + + Number of peers: + Numero de amigos: + + + + Current tracker: + Pista actual: + + + + Total uploaded: + Subida Total: + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + Descarga Total: + + + + Total failed: + Fallos Totales: + + + + Torrent content + Contenido del torrent + + + Options + Opciones + + + + Download in correct order (slower but good for previewing) + Descargar por orden (mas lento pero mas bueno para previsualizar) + + + Share Ratio: + Grado de compartición: + + + Seeders: + Seeders: + + + Leechers: + Leechers: + + + + Save path: + Ruta de guardado: + + + Torrent infos + Informaciones de torrent + + + + Creator: + Creador: + + + + Torrent hash: + Dispersión del torrent: + + + + Comment: + Comentario: + + + + Current session + Sesión actual + + + + Share ratio: + Radio de Compartición: + + + + Trackers + Trackers + + + New tracker + Nuevo tracker + + + New tracker url: + URL del nuevo tracker: + + + + Priorities: + Prioridades: + + + + Normal: normal priority. Download order is dependent on availability + Normal: prioridad normal. El orden de descarga depende de la disponibilidad + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Alta: más alta que la prioridad normal. Piezas se prefieren sobre piezas con la misma disponibilidad, pero no sobre piezas con menor disponibilidad + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Máxima: prioridad máxima, la disponibilidad no importa, la pieza se prefiere sobre cualquier otra pieza con menor disponibilidad + + + + File name + Nombre del archivo + + + + + Priority + Prioridad + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + La lista de trackers no puede estar vacía. + + + + Ignored: file is not downloaded at all + Ignorado: el archivo no se ha descargado en lo absoluto + + + + Ignored + Ignorado + + + + Normal + Normal + + + + Maximum + Máxima + + + + High + Alta + + + + Url seeds + Semillas Url + + + + New url seed: + Nueva semilla url: + + + + This url seed is already in the list. + Esta semilla url ya está en la lista. + + + Hard-coded url seeds cannot be deleted. + Las semillas url por defecto no pueden ser borradas. + + + None + i.e: No error message + Ninguno + + + + New url seed + New HTTP source + Nueva semilla url + + + + The following url seeds are available for this torrent: + Las siguientes semillas url están disponibles para este torrent: + + + + Priorities error + Error de propiedades + + + + Error, you can't filter all the files in a torrent. + Error, no puedes filtrar todos los archivos en un torrent. + + + + Downloaded pieces + Piezas descargadas + + + + Collapse all + + + + + Expand all + + + + + ... + ... + + + + + Choose save path + Selecciona la ruta de guardado + + + + Save path creation error + Error en la creación de ruta de guardado + + + + Could not create the save path + No se pudo crear la ruta de guardado + + + + search_engine + + + + Search + Buscar + + + Search Engines + Motores de Búsqueda + + + Search Pattern: + Patrón de Búsqueda: + + + Stop + Detenido + + + + Status: + Estado: + + + + Stopped + Detenido + + + Results: + Resultados: + + + + Download + Descargar + + + Clear + Limpiar + + + Update search plugin + Actualizar plugin de búsqueda + + + + Search engines... + Motores de búsqueda... + + + + seeding + + + Search + Búsquedas + + + The following torrents are finished and shared: + Los siguientes torrents se han terminado de descargar y están compartidos: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Nota:</u> Es importante que sigas compartiendo torrents después de que los hayas descargado por el bienestar de la red. + + + + Start + Comenzar + + + + Pause + Pausa + + + + Delete + Borrar + + + + Delete Permanently + Borrar permanentemente + + + + Torrent Properties + Propiedades del Torrent + + + + Preview file + Previsualizar archivo + + + + Set upload limit + Establece el límite de subida + + + + Open destination folder + Abrir carpeta de destino + + + + Name + Nombre + + + + Size + Tamaño + + + + Upload Speed + Velocidad de Subida + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + Leechers + Leechers + + + + Ratio + Radio + + + + Buy it + Comprarlo + + + + Total uploaded + + + + Priority + Prioridad + + + + Force recheck + + + + + subDownloadThread + + + Host is unreachable + El host no se puede alcanzar + + + + File was not found (404) + El archivo no fue encontrado (404) + + + + Connection was denied + La conexión fue negada + + + + Url is invalid + La url es inválida + + + + I/O Error + + + + Connection forbidden (403) + Conexión prohibida (403) + + + Connection was not authorized (401) + Conexión no autorizada (401) + + + Content has moved (301) + El contenido ha sido cambiado de lugar (301) + + + + Connection failure + Falla de conexión + + + + Connection was timed out + El tiempo de espera para la conexión se ha agotado + + + + Incorrect network interface + Interfaz de red incorrecta + + + + Unknown error + Error desconocido + + + + Could not resolve proxy + No se pudo resolver el proxy + + + + torrentAdditionDialog + + True + Verdadero + + + + + Unable to decode torrent file: + Imposible decodificar el archivo torrent: + + + This file is either corrupted or this isn't a torrent. + Este archivo puede estar corrupto, o no ser un torrent. + + + + + Choose save path + Selecciona la ruta de guardado + + + False + Falso + + + Unknown + Desconocido + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + Ruta de guardado vacía + + + + Please enter a save path + Por favor ingresa una ruta de guardado + + + + Save path creation error + Error en la creación de ruta de guardado + + + + Could not create the save path + No se pudo crear la ruta de guardado + + + + Invalid file selection + Selección de archivo inválida + + + + You must select at least one file in the torrent + Debes seleccionar al menos un arcihvo en el torrent + + + + File name + Nombre del archivo + + + + Size + Tamaño + + + + Progress + Progreso + + + + + Priority + Prioridad + + + diff --git a/src/lang/qbittorrent_fi.qm b/src/lang/qbittorrent_fi.qm new file mode 100644 index 0000000000000000000000000000000000000000..0252a0b99cc771ff06394dc3e2cbb516a20c3159 GIT binary patch literal 66881 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 Sbobg^x(JMy0sPUUM*S}ooV&aL literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_fi.ts b/src/lang/qbittorrent_fi.ts new file mode 100644 index 000000000..2d2b6c132 --- /dev/null +++ b/src/lang/qbittorrent_fi.ts @@ -0,0 +1,5073 @@ + + + + + AboutDlg + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + qBittorent on C++:lla ohjelmoitu bittorrent-asiakasohjelma, joka käyttää Qt4:ää ja libtorrent-kirjastoa.<br> +<br> +Tekijänoikeus © 2006 Christophe Dumez<br> +<br> <u>Kotisivu:</u> <i>http://www.qbittorrent.org</i><br> + + + + About + Yleistä + + + + About qBittorrent + Tietoja qBittorrentista + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C++:lla, libtorrent-rasterbar- ja Qt4-kirjastoja käyttävä </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bittorrent-asiakas.<br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Kotisivu:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Kehittäjä + + + + Birthday: + Syntymäpäivä: + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + Christophe Dumez + Christophe Dumez + + + + Country: + Maa: + + + + E-mail: + Sähköposti: + + + + France + Ranska + + + + Home page: + Kotisivu: + + + + http://www.dchris.eu + http://www.dchris.eu + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + + License + Lisenssi + + + + Name: + Nimi: + + + + Occupation: + Ammatti: + + + + Student in computer science + Tietojenkäsittelytieteen opiskelija + + + Thanks To + Kiitokset + + + + Translation + Käännökset + + + + 03/05/1985 + 3. toukokuuta 1985 + + + + Thanks to + Kiitokset + + + + BandwidthAllocationDialog + + + Upload limit: + Suurin lähetysnopeus: + + + + Download limit: + Suurin latausnopeus: + + + + + + + Unlimited + Unlimited (bandwidth) + Rajoittamaton + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + qBittorrentin konsoli + + + + General + Yleistä tietoa + + + + Blocked IPs + Estetyt IP-osoitteet + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + ... + ... + + + + Activate IP Filtering + Käytä IP-suodatusta + + + Add Range + Lisää osoitealue + + + Always display systray messages + Näytä aina + + + Apply + Toteuta + + + Ask for confirmation on exit + Kysy vahvistusta poistuttaessa + + + Audio/Video player: + Multimediatoistin: + + + + + + Authentication + Sisäänkirjautuminen + + + Automatically clear finished downloads + Poista valmistuneet lataukset + + + Behaviour + Käyttäytyminen + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Huomaa:</b>Muutokset tulevat voimaan seuraavalla käynnistyskerralla. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + + + Cancel + Peruuta + + + Comment + Kommentti + + + connections + yhteyttä + + + Connection Settings + Yhteysasetukset + + + Default save path + Oletustallennuskansio + + + DHT configuration + DHT-asetukset + + + + DHT port: + DHT-portti: + + + DHT (Trackerless): + DHT: + + + Disable + Rajoittamaton + + + Disable DHT (Trackerless) support + Älä käytä DHT:tä (seurantapalvelinkorvike) + + + Display a torrent addition dialog everytime I add a torrent + Näytä torrentinlisäämisikkuna aina kun lisään torrentin + + + Display systray messages only when window is hidden + Näytä vain, kun ikkuna on pienennettynä + + + Download Limit: + Latausnopeus: + + + Enable connection through a proxy server + Käytä välityspalvelinta + + + Enable directory scan (auto add torrent files inside) + Lisää torrentit seuraavasta kansiosta automaattisesti + + + End IP + Loppu + + + + Filter Settings + Suotimen asetukset + + + Go to systray when minimizing window + Pienennä ilmoitusalueen kuvakkeeseen + + + + IP Filter + IP-suodatin + + + ipfilter.dat Path: + ipfilter.datin sijainti: + + + + + KiB/s + KiB/s + + + KiB UP max. + KiB UP enint. + + + Language + Kieli + + + + Language: + Kieli: + + + Localization + Kieliasetukset + + + Main + Perusasetukset + + + Max Connects: + Yhteyksiä enint: + + + Misc + Lisäasetukset + + + Never display systray messages + Älä näytä + + + OK + OK + + + Options + Asetukset + + + Options -- qBittorrent + Asetukset — qBittorrent + + + Origin + Lähde + + + + + + Password: + Salasana: + + + + + + Port: + Portti: + + + Port range: + Portit: + + + Preview program + Esikatseluohjelma + + + + Proxy + Välityspalvelin + + + Proxy server requires authentication + Välityspalvelin vaatii sisäänkirjautumisen + + + Proxy Settings + Välityspalvelinasetukset + + + Remove Range + Poista osoitealue + + + Save Path: + Tallennuskansio: + + + Scanned Dir: + Kansio: + + + Server IP: + Palvelimen osoite: + + + Share ratio: + Jakosuhde: + + + Start IP + Alku + + + Systray Messages + Ilmoitusalueen viestit + + + Upload Limit: + Lähetysnopeus: + + + User Name: + Tunnus: + + + 0.0.0.0 + 0.0.0.0 + + + 1 KiB DL = + 1 KiB DL = + + + + Connection + Yhteys + + + + Plastique style (KDE like) + Plastique-tyyli (KDE) + + + + CDE style (Common Desktop Environment like) + CDE-tyyli (Common Dekstop Environment) + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Toiminta tuplanapsautuksella + + + + + Start/Stop + Aloita/lopeta + + + + + Open folder + Avaa kansio + + + + + Show properties + Ominaisuudet + + + + Port used for incoming connections: + Portti sisääntuleville yhteyksille: + + + + Random + Satunnainen + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Käytä yhteyksille + + + + Use proxy for connections to trackers + Käytä välityspalvelinta seurantapalvelinyhteyksiin + + + + Use proxy for connections to regular peers + Käytä välityspalvelinta yhteyksiin muiden käyttäjien kanssa + + + + Use proxy for connections to web seeds + Käytä välityspalvelinta web-jakoihin + + + + Use proxy for DHT messages + Käytä välityspalvelinta DHT-viesteihin + + + + Enabled + Käytössä + + + + Forced + Pakotettu + + + + Disabled + Ei käytössä + + + + Preferences + Asetukset + + + General + Perusasetukset + + + + User interface settings + Käyttöliittymäasetukset + + + + Visual style: + Ulkoasu: + + + + Cleanlooks style (Gnome like) + Cleanlooks-tyyli (Gnome) + + + + Motif style (Unix like) + Motif-tyyli (Unix) + + + + Ask for confirmation on exit when download list is not empty + Kysy varmistusta, jos latauslista ei ole tyhjä poistuttaessa + + + + Display current speed in title bar + Näytä nopeus otsikkorivillä + + + + System tray icon + Ilmoitusalueen kuvake + + + + Disable system tray icon + Älä näytä kuvaketta ilmoitusalueella + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Sulje ilmoitusalueen kuvakkeeseen + + + + Minimize to tray + Pienennä ilmoitusalueen kuvakkeeseen + + + + Show notification balloons in tray + Näytä ilmoitukset ilmoitusalueen kuvakkeesta + + + + Downloads + Lataukset + + + Put downloads in this folder: + Latauskansio: + + + + Pre-allocate all files + Varaa tila kaikille tiedostoille + + + + When adding a torrent + Kun lisään torrent-tiedostoa + + + + Display torrent content and some options + Näytä sen sisältö ja joitakin asetuksia + + + + Do not start download automatically + The torrent will be added to download list in pause state + Älä aloita lataamista automaattisesti + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Kansioiden tarkkailu + + + + Automatically download torrents present in this folder: + Lataa torrentit tästä kansiosta automaattisesti: + + + + Listening port + Kuuntele porttia + + + to + i.e: 1200 to 1300 + + + + + Enable UPnP port mapping + Käytä UPnP-porttivarausta + + + + Enable NAT-PMP port mapping + Käytä NAT-PMP -porttivarausta + + + + Global bandwidth limiting + Kaistankäyttörajoitukset + + + + Upload: + Lähetys: + + + + Download: + Lataus: + + + + Use the same port for DHT and Bittorrent + I didn't find in 1.4.0beta3, but I take it as this text is not a question but a choice. + Käytä samaa porttia DHT:lle ja Bittorrentille + + + + Spoof µtorrent to avoid ban (requires restart) + Esitä µtorrent (vaatii uudelleenkäynnistyksen) + + + + + Type: + Tyyppi: + + + + + (None) + (ei mikään) + + + + + Proxy: + Välityspalvelin: + + + + + + Username: + Tunnus: + + + + Bittorrent + Bittorrent + + + + UI + Käyttöliittymä + + + + Connections limit + Yhteyksien enimmäismäärä + + + + Global maximum number of connections: + Kaikkien yhteyksien enimmäismäärä: + + + + Maximum number of connections per torrent: + Yhteyksien enimmäismäärä latausta kohden: + + + + Maximum number of upload slots per torrent: + Lähetyspaikkoja torrentia kohden: + + + Additional Bittorrent features + Muut Bittorrent-ominaisuudet + + + + Enable DHT network (decentralized) + Käytä hajautettua DHT-verkkoa + + + Enable Peer eXchange (PeX) + Vaihda tietoja muiden käyttäjien kanssa (Peer eXchange) + + + + Enable Local Peer Discovery + Käytä paikallista käyttäjien löytämistä + + + + Encryption: + Salaus: + + + + Share ratio settings + Jakosuhteen asetukset + + + + Desired ratio: + Tavoiteltu suhde: + + + + Filter file path: + Suodatustiedoston sijainti: + + + + transfer lists refresh interval: + siirtolistan päivitystiheys: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + RSS-syötteen päivitystiheys: + + + + minutes + minuuttia + + + + Maximum number of articles per feed: + Artikkeleiden enimmäismäärä syötettä kohden: + + + + File system + Tiedostojärjestelmä + + + + Remove finished torrents when their ratio reaches: + Poista valmistuneet torrentit, kun jakosuhde saa arvon: + + + + System default + Järjestelmän oletus + + + + Start minimized + Aloita minimoituna + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Siirtolistan kaksoisnapsautustoiminto + + + In download list: + Latauslistassa: + + + Pause/Start torrent + Pysäytä tai aloita lataus + + + Open destination folder + Avaa kohdekansio + + + Display torrent properties + Näytä torrentin ominaisuudet + + + In seeding list: + Lähetyslistassa: + + + Folder scan interval: + Hakemistojen päivitystiheys: + + + seconds + sekuntia + + + Spoof Azureus to avoid ban (requires restart) + Esitä Azureusta (vaatii uudelleenkäynnistyksen) + + + + Web UI + Verkkokäyttöliittymä + + + + Enable Web User Interface + Käytä verkkokäyttöliittymää + + + + HTTP Server + HTTP-palvelin + + + + Enable RSS support + RSS-tuki + + + + RSS settings + RSS:n asetukset + + + + Enable queueing system + Käytä jonotusjärjestelmää + + + + Maximum active downloads: + Aktiivisia latauksia enintään: + + + + Torrent queueing + Torrenttien jonotus + + + + Maximum active torrents: + Aktiivisia torrentteja enintään: + + + + Display top toolbar + Näytä ylätyökalupalkki + + + + Search engine proxy settings + Hakukoneen välityspalvelinasetukset + + + + Bittorrent proxy settings + Bittorrentin välityspalvelinasetukset + + + + Maximum active uploads: + Aktiivisia lähetettäviä torrentteja enintään: + + + Network + Verkko + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Kaksoisnapsautus siirtolistassa + + + + Download list: + Latauslista: + + + + Seeding list: + Lähetyslista: + + + + Download folder: + Latauskansio: + + + + Temp folder: + Väliaikaiskansio: + + + + Bittorrent features + Bittorrent-piirteet + + + + DownloadingTorrents + + + Name + i.e: file name + Nimi + + + + Size + i.e: file size + Koko + + + + Progress + i.e: % downloaded + Edistyminen + + + + DL Speed + i.e: Download speed + Latausnopeus + + + + UP Speed + i.e: Upload speed + Lähetysnopeus + + + + Seeds/Leechers + i.e: full/partial sources + Jakajat / Lataajat + + + Seeds/Leechs + i.e: full/partial sources + Jakajat / Lataajat + + + + Ratio + Jakosuhde + + + + ETA + i.e: Estimated Time of Arrival / Time left + Aikaa jäljellä + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 käynnistyi. + + + Be careful, sharing copyrighted material without permission is against the law. + Tekijänoikeuksien suojaaman materiaalinen jakaminen on laitonta. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>estettiin</i> + + + Fast resume data was rejected for torrent %1, checking again... + Nopean jatkamisen tiedot eivät kelpaa torrentille %1. Tarkistetaan uudestaan... + + + Url seed lookup failed for url: %1, message: %2 + Jakajien haku osoitteesta %1 epäonnistui: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + ”%1” lisättiin latauslistaan. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + Torrentin "%1” latausta jatkettiin. (nopea palautuminen) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + ”%1” on jo latauslistassa. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Viallinen torrent-tiedosto: ”%1” + + + This file is either corrupted or this isn't a torrent. + Tiedosto ei ole kelvollinen torrent-tiedosto. + + + Couldn't listen on any of the given ports. + Minkään annetun portin käyttäminen ei onnistunut. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Ladataa torrenttia ”%1”. Odota... + + + + Hide or Show Column + Näytä tai piilota sarake + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP tai NAT-PMP: portin varaaminen epäonnistui: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP tai NAT-PMP: portin varaaminen onnistui: %1 + + + Priority + Prioriteetti + + + + FeedDownloader + + + RSS Feed downloader + RSS-lataaja + + + + RSS feed: + RSS-syöte: + + + + Feed name + Syötteen nimi + + + + Automatically download torrents from this feed + Lataa tämän syötteen torrentit automaattisesti + + + + Download filters + Lataussuodattimet + + + + Filters: + Suodattimet: + + + + Filter settings + Suodatusasetukset + + + + Matches: + Sopii: + + + + Does not match: + Ei sovi: + + + + Destination folder: + Kohdekansio: + + + + ... + ... + + + + Filter testing + Suotimen testaus + + + + Torrent title: + Torrentin nimike: + + + + Result: + Tulos: + + + + Test + Testaa + + + + Import... + Tuo... + + + + Export... + Vie... + + + + + Rename filter + Nimeä suodatin + + + + + Remove filter + Poista suodatin + + + + Add filter + Lisää suodatin + + + + FeedDownloaderDlg + + + New filter + Uusi suodatin + + + + Please choose a name for this filter + Nimeä suodatin + + + + Filter name: + Suodattimen nimi: + + + + + + Invalid filter name + Virheellinen suodattimen nimi + + + + The filter name cannot be left empty. + Nimeä ei voi jättää tyhjäksi. + + + + + This filter name is already in use. + Suodatinnimi on jo käytössä. + + + + Filter testing error + Suodattimen testausvirhe + + + + Please specify a test torrent name. + Anna testitorrentin nimi. + + + + matches + sopii + + + + does not match + ei sovi + + + + Select file to import + Valitse tuotava tiedosto + + + + + Filters Files + Suodatintiedostot + + + + Import successful + Tuonti onnistui + + + + Filters import was successful. + Suodattimien tuonti onnistui. + + + + Import failure + Tuonti epäonnistui + + + + Filters could not be imported due to an I/O error. + Suodattimia ei voitu tuoda I/O-virheen vuoksi. + + + + Select destination file + Valitse kohdetiedosto + + + + Overwriting confirmation + Päällekirjoitusvahvistus + + + + Are you sure you want to overwrite existing file? + Kirjoitetaanko olemassaolevan tiedoston päälle? + + + + Export successful + Vienti onnistui + + + + Filters export was successful. + Suodattimien viesti onnistui. + + + + Export failure + Vientivirhe + + + + Filters could not be exported due to an I/O error. + Suodattimia ei voitu viedä I/O-virheen vuoksi. + + + + FeedList + + + Unread + Lukematon + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O-virhe + + + + + + Couldn't open %1 in read mode. + Tiedoston %1 avaaminen lukutilassa epäonnistui. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 ei ole kelvollinen PeerGuardian P2B -tiedosto. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Valmis + + + + Name + i.e: file name + Nimi + + + + Size + i.e: file size + Koko + + + + Seeds / Leechers + Jakajat / Lataajat + + + + Connected peers + Liittyneet vertaiset + + + Progress + i.e: % downloaded + Edistyminen + + + DL Speed + i.e: Download speed + Latausnopeus + + + + UP Speed + i.e: Upload speed + Lähetysnopeus + + + Status + Tila + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Valmis + + + None + i.e: No error message + Ei mikään + + + + Ratio + Jakosuhde + + + Leechers + i.e: full/partial sources + Lataajia + + + + Hide or Show Column + Näytä tai piilota sarake + + + Incomplete torrent in seeding list + Keskeneräinen torrent jakolistassa + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Torretin %1 tila muuttui jakamisesta lataukseen. Haluatko siirtää sen takaisin latauslistaan (muulloin se vain poistetaan)? + + + Priority + Prioriteetti + + + + Total uploaded + i.e: Total amount of uploaded data + Lähetetty yhteensä + + + + GUI + + added to download list. + lisättiin latauslistaan. + + + All Downloads Paused. + Kaikki lataukset pysäytettiin. + + + All Downloads Resumed. + Kaikki lataukset käynnistettiin. + + + already in download list. + <file> already in download list. + on jo latauslistassa. + + + An error occured during search... + Haun aika tapahtui virhe... + + + + + + + Are you sure? -- qBittorrent + Oletko varma? — qBittorrent + + + Are you sure you want to delete all files in download list? + Haluatko varmasti poistaa kaikki tiedostot latauslistasta? + + + + Are you sure you want to delete the selected item(s) in download list? + Haluatko varmasti poistaa valitut tiedostot latauslistasta? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Haluatko varmasti poistaa valitut kohteet latauslistasta ja tallennusmedialta? + + + Are you sure you want to quit qbittorrent? + Haluatko varmasti lopettaa qBittorrentin? + + + Are you sure you want to quit qBittorrent? + Haluatko varmasti lopettaa qBittorrentin? + + + Are you sure you want to quit? -- qBittorrent + Haluatko varmasti lopettaa? — qBittorrent + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Yhteyden tila:</b><br>Palomuurin takana?<br><i>Ei sisääntulevia yhteyksiä...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Yhteyden tila:</b><br>Ei yhteyttä<br><i>Ei lataajia...</i> + + + <b>Connection Status:</b><br>Online + <b>Yhteyden tila:</b><br>OK + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Latausnopeus: + + + Checking... + Tarkastetaan... + + + Connecting... + Yhdistetään... + + + Couldn't create the directory: + Seuraavan kansion luominen ei onnistunut: + + + Couldn't download + Couldn't download <file> + Tiedoston lataaminen ei onnistunut: + + + Couldn't listen on any of the given ports. + Minkään annetun portin käyttäminen ei onnistunut. + + + DL Speed + Latausnopeus + + + + Download finished + Lataus valmistui + + + Downloading + Example: Downloading www.example.com/test.torrent + Ladataan torrenttia + + + Downloading... + Ladataan... + + + Download list cleared. + Lataulista tyhjennettiin. + + + Empty search pattern + Tyhjä hakulauseke + + + ETA + ETA + + + + Finished + Valmis + + + has finished downloading. + valmistui. + + + has finished downloading. + <filename> has finished downloading. + valmistui. + + + KiB/s + KiB/s + + + Leechers + Lataajia + + + Listening on port: + Käytetään porttia: + + + Name + Nimi + + + + + + + + &No + &Ei + + + None + Ei mikään + + + No seach engine selected + Hakupalvelua ei ole valittu + + + + Open Torrent Files + Avaa torrent-tiedostoja + + + paused. + <file> paused. + pysäytettiin. + + + Paused + Pysäytetty + + + Please type a search pattern first + Kirjoita ensin hakulauseke + + + Please wait... + Odota... + + + Preview process already running + Esikatselu on jo käynnissä + + + Progress + Edistyminen + + + qBittorrent + qBittorrent + + + reason: + Reason why the download failed + Syy: + + + removed. + <file> removed. + poistettiin. + + + Results + Tulokset + + + resumed. + <file> resumed. + latautuu. + + + resumed. (fast resume) + latautuu. (pikajatkaminen) + + + Search aborted + Haku keskeytetty + + + Search engine + Hakupalvelu + + + Search Engine + Hakupalvelu + + + Searching... + Etsitään... + + + Search is finished + Haku päättyi + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Hakuliitännäiseen on saatavilla päivitys. Haluatko päivittää sen? + +Muutoshistoria: + + + + Search plugin update -- qBittorrent + Hakuliitännäisen päivitys — qBittorrent + + + Search returned no results + Haku ei palauttanut tuloksia + + + Seeders + Jakajia + + + Size + Koko + + + Sorry, update server is temporarily unavailable. + Päivityspalvelin ei ole saavutettavissa. + + + Stalled + state of a torrent whose DL Speed is 0 + Seisahtunut + + + started. + käynnistettiin. + + + Status + Tila + + + There is already another preview process running. +Please close the other one first. + Esikatselu on jo käynnissä. +Uutta esikatselua ei voi aloittaa. + + + This file is either corrupted or this isn't a torrent. + Tiedosto ei ole kelvollinen torrent-tiedosto. + + + + Torrent Files + Torrent-tiedostot + + + Transfers + Siirrot + + + Unable to decode torrent file: + Torrent-tiedoston purkaminen ei onnistunut: + + + UP Speed + Lähetysnopeus + + + UP Speed: + Lähetysnopeus: + + + + + + + + &Yes + &Kyllä + + + You must select at least one search engine. + Valitse ensin ainakin yksi hakupalvelu. + + + Your search plugin is already up to date. + Hakuliitännäinen on ajan tasalla. + + + I/O Error + I/O-virhe + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Yhteyden tila: + + + Offline + Ei verkkoyhteyttä + + + No peers found... + Muita käyttäjiä ei löytynyt... + + + Name + i.e: file name + Nimi + + + Size + i.e: file size + Koko + + + Progress + i.e: % downloaded + Edistyminen + + + DL Speed + i.e: Download speed + Latausnopeus + + + UP Speed + i.e: Upload speed + Lähetysnopeus + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Jakajia + + + Leechers + i.e: Number of partial sources + Lataajia + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Latausnopeus: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Lähetysnopeus: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Valmis + + + Checking... + i.e: Checking already downloaded parts... + Tarkastetaan... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Seisahtunut + + + + Are you sure you want to quit? + Haluatko varmasti poistua? + + + '%1' was removed. + 'xxx.avi' was removed. + ”%1” poistettiin. + + + None + i.e: No error message + Ei mikään + + + All downloads were paused. + Kaikki lataukset pysäytettiin. + + + '%1' paused. + xxx.avi paused. + ”%1” pysäytettiin. + + + Connecting... + i.e: Connecting to the tracker... + Yhdistetään... + + + All downloads were resumed. + Kaikkien latauksien lataamista jatkettiin. + + + '%1' resumed. + e.g: xxx.avi resumed. + Torrentin ”%1” lataamista jatkettiin. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + Lataus ”%1” tuli valmiiksi. + + + + I/O Error + i.e: Input/Output Error + I/O-virhe + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Tiedostoon %1 kirjoittaminen tai lukeminen epäonnistui. Levy saattaa olla täynnä. Lataus pysäytettiin. + + + + Connection Status: + Yhteyden tila: + + + + Online + Ei verkkoyhteyttä + + + Firewalled? + i.e: Behind a firewall/router? + Palomuuri? + + + No incoming connections... + Ei sisääntulevia yhteyksiä... + + + Results + i.e: Search results + Tulokset + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Tapahtui virhe (levy on täynnä?). Lataus ”%1” pysäytettiin. + + + + Search + Etsi + + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent kuuntelee porttia %1 + + + DHT support [ON], port: %1 + DHT-tuki [PÄÄLLÄ] portissa %1 + + + + + DHT support [OFF] + DHT-tuki [EI PÄÄLLÄ] + + + + PeX support [ON] + PeX-tuki [PÄÄLLÄ] + + + PeX support [OFF] + PeX-tuki [EI PÄÄLLÄ] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Latauslista ei ole tyhjä. +Haluatko varmasti lopettaa? + + + + + Downloads + Lataukset + + + + Are you sure you want to delete the selected item(s) in finished list? + Haluatko poistaa valitut kohteet listalta? + + + + UPnP support [ON] + UPnP-tuki [PÄÄLLÄ] + + + + Encryption support [ON] + Salaus [KÄYTÖSSÄ] + + + + Encryption support [FORCED] + Salaus [PAKOTETTU] + + + + Encryption support [OFF] + Salaus [EI KÄYTÖSSÄ] + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Torrentissa %1 tapahtui I/O-virhe. + Syy: %2 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Latausvirhe + + + + Couldn't download file at url: %1, reason: %2. + Tiedoston lataaminen osoitteesta %1 epäonnistui: %2. + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Haluatko varmasti poistaa valitut tiedostot listalta ja kovalevyltä? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Haluatko varmasti poistaa valitut tiedostot listalta ja kovalevyltä? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + ”%1” poistettiin pysyvästi. + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent käyttää porttia: TCP/%1 + + + + UPnP support [OFF] + UPnP-tuki [EI PÄÄLLÄ] + + + + NAT-PMP support [ON] + NAT-PMP-tuki [PÄÄLLÄ] + + + + NAT-PMP support [OFF] + NAT-PMP-tuki [EI PÄÄLLÄ] + + + + DHT support [ON], port: UDP/%1 + DHT-tuki [KÄYTÖSSÄ], portti: UDP/%1 + + + + Local Peer Discovery [ON] + Paikallinen käyttäjien löytäminen [PÄÄLLÄ] + + + + Local Peer Discovery support [OFF] + Paikallinen käyttäjien löytäminen [EI PÄÄLLÄ] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + ”%1% poistettiin, koska sen jakosuhde saavutti asettamasi enimmäisarvon. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (↓ %2 KiB/s | ↑ %3 KiB/s) + + + + + DL: %1 KiB/s + ↓%1 KiB/s + + + + + UP: %1 KiB/s + ↑%1 KiB/s + + + + + Ratio: %1 + Suhde: %1 + + + + + DHT: %1 nodes + DHT: %1 solmua + + + + + No direct connections. This may indicate network configuration problems. + Ei suoria yhteyksiä. Tämä voi olla merkki verkko-ongelmista. + + + + Uploads + Lähetykset + + + + Options were saved successfully. + Asetukset tallennettiin. + + + + MainWindow + + + About + Tietoja + + + Clear + Tyhjennä + + + + Clear log + Tyhjennä loki + + + Connection Status + Yhteyden tila + + + + Create torrent + Luo torrentti + + + + Delete + Poista + + + Delete All + Poista kaikki + + + + Delete Permanently + Poista pysyvästi + + + + Documentation + Dokumentaatio + + + Download + Lataa + + + + Download from URL + Lataa URL-osoitteesta + + + + &Edit + &Muokkaa + + + + Exit + Poistu + + + + &File + &Tiedosto + + + + &Help + &Ohje + + + KiB/s + KiB/s + + + Log: + Loki: + + + + Open + Avaa + + + &Options + &Asetukset + + + + Pause + Pysäytä + + + + Pause All + Pysäytä kaikki + + + + Preferences + Asetukset + + + + Preview file + Esikatsele + + + Results: + Tulokset: + + + Search + Etsi + + + Search Engines + Hakupalvelut + + + Search Pattern: + Hakulauseke: + + + Session ratio: + Jakosuhde: + + + + Start + Käynnistä + + + + Start All + Käynnistä kaikki + + + Status: + Tila: + + + Stop + Pysäytä + + + Stopped + Pysäytetty + + + + Torrent Properties + Torrentin tiedot + + + Total DL Speed: + Kokonaislatausnopeus: + + + Total UP Speed: + Kokonaislähetysnopeus: + + + Transfers + Siirrot + + + Update search plugin + Päivitä hakuliitännäinen + + + + Visit website + Vieraile verkkosivulla + + + + Report a bug + Ilmoita virheestä + + + + Set upload limit + Aseta lähetysnopeusrajoitus + + + + Set download limit + Aseta latausnopeusrajoitus + + + + Set global download limit + Aseta yleinen latausnopeusrajoitus + + + + Set global upload limit + Aseta yleinen lähetysnopeusrajoitus + + + + Options + Asetukset + + + + Decrease priority + Laske prioriteettia + + + + Increase priority + Nosta prioriteettia + + + + Console + Konsoli + + + + PropListDelegate + + False + Ei + + + True + Kyllä + + + + + Ignored + Ei ladata + + + + + + Normal + Normal (priority) + Normaali + + + + + High + High (priority) + Korkea + + + + + Maximum + Maximum (priority) + Korkein + + + + RSS + + + Search + Etsi + + + + + New subscription + Uusi tilaus + + + + + + Mark items read + Merkitse lukemattomaksi + + + + Update all + Päivitä kaikki + + + 1 + 1 + + + + Feed URL + Syötteen URL + + + + + Update + Päivitä + + + + New folder + Uusi kansio + + + + RSS feeds + RSS-syötteet + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrentit:</span> <span style=" font-style:italic;">(lataa tuplanapsauttamalla)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Päivitä syötteet + + + + + Delete + Poista + + + + + Rename + Nimeä uudelleen + + + Refresh + Päivitä + + + + Download torrent + Lataa torrentti + + + + Open news URL + Avaa uusi URL + + + + Copy feed URL + Kopioi syöte-URL + + + + RSS feed downloader + RSS-syötteen lataaja + + + Create + Luo + + + Delete selected streams + Poista valitut syötteet + + + + Refresh RSS streams + Päivitä syötteet + + + Add a new RSS stream + Lisää uusi syöte + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Uutiset:</b> <i>(avaa linkki selaimessa kaksoisnapsauttamalla)</i> + + + Add RSS stream + Lisää syöte + + + Refresh all streams + Päivitä kaikki syötteet + + + RSS streams: + RSS-syötteet: + + + 2 + 2 + + + Mark all as read + Merkitse kaikki luetuiksi + + + + RSSImp + + + Please type a rss stream url + Osoite + + + + Stream URL: + Syötteen osoite: + + + Please choose a new name for this stream + Valitse uusi nimi tälle syötteelle + + + New stream name: + Uusi nimi: + + + + + Are you sure? -- qBittorrent + Oletko varma? — qBittorrent + + + + + &Yes + &Kyllä + + + + + &No + &Ei + + + Are you sure you want to delete this stream from the list? + Haluatko poistaa tämän syötteen listasta? + + + Description: + Kuvaus: + + + url: + Osoite: + + + Last refresh: + Viimeisin päivitys: + + + + Please choose a folder name + Valitse kansion nimi + + + + Folder name: + Kansion nimi: + + + + New folder + Uusi kansio + + + + Overwrite attempt + Päällekirjoitusyritys + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Et voi kirjoittaa kohteen %1 päälle. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + RSS-syöte on jo listassa. + + + + Are you sure you want to delete these elements from the list? + Haluatko poistaa nämä listasta? + + + + Are you sure you want to delete this element from the list? + Haluatko poistaa tämän listasta? + + + + Please choose a new name for this RSS feed + Valitse uusi nimi tälle RSS-syötteelle + + + + New feed name: + Uusi syötteen nimi: + + + + Name already in use + Nimi on jo käytössä + + + + This name is already used by another item, please choose another one. + Tämä nimi on jo käytössä, valitse toinen. + + + + Date: + Päivä: + + + + Author: + Tekijä: + + + + Unread + Lukematon + + + + RssItem + + + No description available + Ei kuvausta + + + + RssStream + + %1 ago + 10min ago + %1 sitten + + + + Automatically downloading %1 torrent from %2 RSS feed... + Ladataan automaattisesti %1 torrentti RSS-syötteestä %2... + + + Never + Ei koskaan + + + + SearchCategories + + + All categories + Kaikki luokat + + + + Movies + Elokuvat + + + + TV shows + TV-ohjelmat + + + + Music + Musiikki + + + + Games + Pelit + + + + Anime + Anime + + + + Software + Ohjelmat + + + + Pictures + Kuvat + + + + Books + Kirjat + + + + SearchEngine + + Name + i.e: file name + Nimi + + + Size + i.e: file size + Koko + + + Seeders + i.e: Number of full sources + Jakajia + + + Leechers + i.e: Number of partial sources + Lataajia + + + Search engine + Hakupalvelu + + + + Empty search pattern + Tyhjä hakulauseke + + + + Please type a search pattern first + Kirjoita ensin hakulauseke + + + You must select at least one search engine. + Valitse ensin ainakin yksi hakupalvelu. + + + + + Results + Tulokset + + + + Searching... + Etsitään... + + + Search plugin update -- qBittorrent + Hakuliitännäisen päivitys — qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Hakuliitännäiseen on saatavilla päivitys. Haluatko päivittää sen? + +Muutoshistoria: + + + + &Yes + &Kyllä + + + &No + &Ei + + + Sorry, update server is temporarily unavailable. + Päivityspalvelin ei ole saavutettavissa. + + + Your search plugin is already up to date. + Hakuliitännäinen on ajan tasalla. + + + + Cut + Leikkaa + + + + Copy + Kopioi + + + + Paste + Liitä + + + + Clear field + Tyhjennä kenttä + + + + Clear completion history + Tyhjennä hakuhistoria + + + + Search Engine + Hakupalvelu + + + + + Search has finished + Haku on päättynyt + + + + An error occured during search... + Haun aikana tapahtui virhe... + + + + Search aborted + Haku keskeytetty + + + + Search returned no results + Haku ei palauttanut tuloksia + + + + Results + i.e: Search results + Tulokset + + + + + Unknown + Tuntematon + + + + SearchTab + + + Name + i.e: file name + Nimi + + + + Size + i.e: file size + Koko + + + + Seeders + i.e: Number of full sources + Jakajia + + + + Leechers + i.e: Number of partial sources + Lataajia + + + + Search engine + Hakupalvelu + + + + TrackersAdditionDlg + + + Trackers addition dialog + Seurantapalvelimien lisäys + + + + List of trackers to add (one per line): + Seurantapalvelimet jokainen omalla rivillään: + + + + Ui + + I would like to thank the following people who volunteered to translate qBittorrent: + Haluan kiittää seuraavia henkilöitä, jotka ovat vapaaehtoisesti kääntäneet qBittorrentin: + + + Name + Nimi + + + No URL entered + Et antanut URL-osoitetta + + + Please contact me if you would like to translate qBittorrent to your own language. + Ota yhteyttä kehittäjään, jos haluat kääntää qBittorrentin muille kielille. + + + Please type at least one URL. + Anna vähintään yksi URL-osoite. + + + Preview impossible + Esikatselu ei ole mahdollista + + + Progress + Edistyminen + + + qBittorrent + qBittorrent + + + Size + Koko + + + Sorry, we can't preview this file + Tätä tiedostoa ei voi esikatsella + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Haluan kiittää seuraavia henkilöitä, jotka ovat vapaaehtoisesti kääntäneet qBittorrentin: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Ota yhteyttä minuun, jos haluat kääntää qBittorentin omalle kielellesi. + + + + addTorrentDialog + + + ... + ... + + + + Torrent size: + Torrentin koko: + + + + + Unknown + Tuntematon + + + + Free disk space: + Vapaa levytila: + + + + Download in sequential order (slower but good for previewing) + Lataa järjestyksessä (hitaampi, mutta mahdollistaa aikaisemman esikatselun) + + + + Add + Lisää + + + + Add to download list in paused state + Lisää latauslistaan pysäytettynä + + + + Cancel + Peru + + + Download in correct order (slower but good for previewing) + Lataa järjestyksessä (hitaampi, mutta mahdollistaa aikaisemman esikatselun) + + + File name + Tiedostonimi + + + File size + Koko + + + + Save path: + Tallennuskansio: + + + select + valitse + + + Selected + Valittu + + + + Torrent addition dialog + Torrentinlisäämisikkuna + + + + Torrent content: + Torrentin sisältö: + + + Unselect + Poista valinta + + + + Ignored + Ei ladata + + + + Normal + Normaali + + + + High + Korkea + + + + Maximum + Korkein + + + + Collapse all + Pienennä kaikki + + + Expand All + Laajenna kaikki + + + + Expand all + Laajenna kaikki + + + + authentication + + + Cancel + Peru + + + + Login + Sisäänkirjautuminen + + + + Log in + Kirjaudu sisään + + + + Password: + Salasana: + + + + Tracker: + Seurantapalvelin: + + + + + Tracker authentication + Seurantapalvelimen todennus + + + + Username: + Tunnus: + + + + bandwidth_dlg + + + Bandwidth allocation + Kaistanvaraus + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 on saavuttanut asetetun jakosuhdeluvun. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + ”%1” poistettiin pysyvästi. + + + + '%1' was removed. + 'xxx.avi' was removed. + ”%1” poistettiin. + + + '%1' paused. + e.g: xxx.avi paused. + ”%1” pysäytettiin. + + + '%1' resumed. + e.g: xxx.avi resumed. + Torrentin ”%1” lataamista jatkettiin. + + + + '%1' is not a valid magnet URI. + ”%1” ei kelpaa magnet-URI:ksi. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + ”%1” on jo latauslistassa. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + Torrentin "%1” latausta jatkettiin. (nopea palautuminen) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + ”%1” lisättiin latauslistaan. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Viallinen torrent-tiedosto: ”%1” + + + + This file is either corrupted or this isn't a torrent. + Tiedosto ei ole kelvollinen torrent-tiedosto. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <i>IP-suodatin on estänyt osoitteen</i> <font color='red'>%1</font> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>on estetty korruptuneiden osien takia</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Rekursiivinen tiedoston %1 lataus torrentissa %2 + + + + Unable to decode %1 torrent file. + Torrent-tiedostoa %1 ei voitu tulkita. + + + + Couldn't listen on any of the given ports. + Minkään annetun portin käyttäminen ei onnistunut. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: portin varaaminen epäonnistui: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: portin varaaminen onnistui: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Nopean jatkamisen tiedot eivät kelpaa torrentille %1. Tarkistetaan uudestaan... + + + + Url seed lookup failed for url: %1, message: %2 + Jakajien haku osoitteesta %1 epäonnistui: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Ladataa torrenttia ”%1”. Odota... + + + + createTorrentDialog + + ... + ... + + + + Cancel + Peru + + + <center>Announce url:<br>(One per line)</center> + <center>Julkaisuosoite:<br>Yksi riville</center> + + + <center>Comment:</center> + <center>Kommentti:</center> + + + <center>Destination torrent file:</center> + <center>Kohdetiedosto:</center> + + + <center>Input file or directory:</center> + <center>Lähdetiedosto tai -kansio:</center> + + + Create + Luo + + + Create Torrent file + Luo torrent-tiedosto + + + Directory + Hakemisto + + + + Torrent Creation Tool + Torrentinluontityökalu + + + + Torrent file creation + Torrent-tiedoston luominen + + + + Add file + Lisää tiedosto + + + + Add folder + Lisää kansio + + + + Announce urls (trackers): + Julkaisuosoitteet (seurantapalvelimet): + + + + Comment (optional): + Kommentti (valinnainen): + + + + Web seeds urls (optional): + Verkkojako-osoitteet (valinnainen): + + + + File or folder to add to the torrent: + Torrentiin lisättävä tiedosto tai kansio: + + + Add a file + Lisää tiedosto + + + Add a folder + Lisää kansio + + + + Piece size: + Osakoko: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Yksityinen (ei jaeta DHT-verkossa) + + + + Start seeding after creation + Aloita jakaminen luomisen jälkeen + + + + Create and save... + Luo ja tallenna... + + + + Progress: + Edistyminen: + + + + createtorrent + + Input path does not exist + Lähdekansio ei ole olemassa + + + No destination path set + Kohdekansiota ei ole valittu + + + + No input path set + Lähdekansiota ei ole asetettu + + + Please type a correct input path first + Anna kelvollinen lähdekansio + + + Please type a destination path first + Anna ensin kohdekansio + + + + Please type an input path first + Anna ensin lähdekansio + + + Please type a valid input path first + Anna kelvollinen lähdekansio + + + + Select destination torrent file + Valitse kohde-torrent-tiedosto + + + Select input directory or file + Valitse lähdekansio tai -tiedosto + + + + + + Torrent creation + Torrentin luominen + + + + Torrent Files + Torrent-tiedostot + + + + Torrent was created successfully: + Torrent luotiin: + + + + Select a folder to add to the torrent + Valitse kohdekansio + + + + Please type an announce URL + Anna julkaisusoite + + + + Torrent creation was unsuccessful, reason: %1 + Torrentin luominen epäonnistui: %1 + + + + Announce URL: + Tracker URL + Julkaisuosoite: + + + + Please type a web seed url + Anna verkkojako-osoite + + + + Web seed URL: + Verkkojako-osoite: + + + + Select a file to add to the torrent + Valitse torrentiin lisättävä tiedosto + + + No tracker path set + Seurantapalvelimen polkua ei ole asetettu + + + Please set at least one tracker + Aseta ainakin yksi seurantapalvelin + + + + Created torrent file is invalid. It won't be added to download list. + Luotu torrentti ei kelpaa. Sitä ei lisätä latauslistaan. + + + + downloadFromURL + + + Cancel + Peru + + + + Download + Lataa + + + + Download from urls + Lataa URL-osoitteista + + + + Download Torrents from URLs + Lataa torrentteja URL-osoitteista + + + + Only one URL per line + Yksi URL riville + + + + No URL entered + Et antanut URL-osoitetta + + + + Please type at least one URL. + Anna vähintään yksi URL-osoite. + + + + downloading + + + Search + Etsi + + + Total DL Speed: + Kokonaislatausnopeus: + + + KiB/s + KiB/s + + + Session ratio: + Jakosuhde: + + + Total UP Speed: + Kokonaislähetysnopeus: + + + Log + Loki + + + IP filter + IP-suodatus + + + + Start + Käynnistä + + + + Pause + Pysäytä + + + + Delete + Poista + + + Clear + Tyhjennä + + + + Preview file + Esikatsele + + + + Set upload limit + Aseta lähetysnopeusrajoitus + + + + Set download limit + Aseta latausnopeusrajoitus + + + + Delete Permanently + Poista pysyvästi + + + + Torrent Properties + Torrentin tiedot + + + + Open destination folder + Avaa kohdekansio + + + + Name + Nimi + + + + Size + Koko + + + + Progress + Edistyminen + + + + DLSpeed + Latausnopeus + + + + UpSpeed + Lähetysnopeus + + + + Seeds/Leechs + Jakajat / Lataajat + + + + Ratio + Jakosuhde + + + + ETA + Aikaa jäljellä + + + + Buy it + Osta + + + + Priority + Prioriteetti + + + + Increase priority + Nosta prioriteettia + + + + Decrease priority + Laske prioriteettia + + + + Force recheck + Pakota tarkistamaan uudelleen + + + + Copy magnet link + Kopioi magnet-linkki + + + + engineSelect + + + Search plugins + Hakuliitännäiset + + + + Installed search engines: + Asennetut hakuliitännäiset: + + + + Name + Nimi + + + + Url + URL + + + + Enabled + Käytössä + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Saat uusia hakuliitännäisiä osoitteesta <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Asenna uusi + + + + Check for updates + Tarkista päivitykset + + + + Close + Sulje + + + + Enable + Käytä + + + + Disable + Älä käytä + + + + Uninstall + Poista + + + + engineSelectDlg + + True + Kyllä + + + False + Ei + + + + Uninstall warning + Poistovaroitus + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Joitakin liitännäisiä ei voitu poistaa, koska ne tulevat qBittorrentin mukana. + Vain asennettuja liitännäisiä voi poistaa. +Kyseiset liitänäiset poistettiin kuitenkin käytöstä. + + + + Uninstall success + Poisto onnistui + + + + Select search plugins + Valitse hakuliitännäiset + + + + + qBittorrent search plugins + qBittorrentin hakuliitännäiset + + + + + + + + + + + Search plugin install + Hakuliitännäisen asennus + + + + + + Yes + Kyllä + + + + + + + No + Ei + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Uudempi versio hakuliitännäisestä %1 on jo asennettu. + + + + + + + + Search plugin update + Hakuliitännäisen päivitys + + + + + Sorry, update server is temporarily unavailable. + Päivityspalvelin ei ole tällä hetkellä saavutettavissa. + + + + All your plugins are already up to date. + Kaikki liitännäiset ovat ajan tasalla. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Hakuliitännäisen %1 päivitys epäonnistui. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Hakuliitännäisen %1 asennus epäonnistui. + + + + All selected plugins were uninstalled successfully + Kaikki valitut liitännäiset poistettiin + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Hakuliitännäinen %1 päivitettiin. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Hakuliitännäinen %1 asennettiin. + + + + Search engine plugin archive could not be read. + Hakuliitännäisarkiston lukeminen epäonnistui. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Hakuliitännäisen %1 asennus epäonnistui. + + + + New search engine plugin URL + Uusi hakukoneliitännäisen osoite + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + d + days + d + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + h + hours + h + + + h + hours + h + + + + KiB + kibibytes (1024 bytes) + KiB + + + m + minutes + m + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + Unknown + tuntematon + + + + Unknown + Unknown (size) + Tuntematon + + + + < 1m + < 1 minute + alle minuutti + + + + %1m + e.g: 10minutes + %1 min + + + + %1h%2m + e.g: 3hours 5minutes + %1 h %2 min + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1 d %2 h %3 min + + + + options_imp + + Choose ipfilter.dat file + Valitse ipfilter.dat-tiedosto + + + Choose save Directory + Valitse tallennuskansio + + + Choose Scan Directory + Valitse hakukansio + + + Choose your favourite preview program + Valitse mieluinen esikatseluohjelma + + + Comment: + Kommentti: + + + Couldn't open: + Avaaminen epäonnistui: + + + End IP: + Loppu: + + + Incorrect IP + Virheellinen IP + + + in read mode. + lukutilassa. + + + Invalid IP + Virheellinen IP + + + I/O Error + I/O-virhe + + + IP Range Comment + IP-alueen kommentti + + + Options saved successfully! + Asetukset tallennettiin! + + + Range End IP + Alueen loppu + + + Range Start IP + Alueen alku + + + Start IP: + Alku: + + + This IP is incorrect. + Tämä IP on virheellinen. + + + This IP is invalid. + Tämä IP on virheellinen. + + + to + <min port> to <max port> + + + + Options were saved successfully. + Asetukset tallennettiin. + + + + + Choose scan directory + Valitse hakukansio + + + Choose an ipfilter.dat file + Valitse ipfilter.dat-tiedosto + + + + + Choose a save directory + Valitse tallennuskansio + + + I/O Error + Input/Output Error + I/O-virhe + + + Couldn't open %1 in read mode. + Tiedoston %1 avaaminen lukutilassa epäonnistui. + + + + + Choose an ip filter file + Valitse IP-suodatintiedosto + + + + + Filters + Suotimet + + + + pluginSourceDlg + + + Plugin source + Lähde + + + + Search plugin source: + Lähde: + + + + Local file + Paikallinen tiedosto + + + + Web link + Web-linkki + + + + preview + + + Cancel + Peru + + + + File preview + Tiedoston esikatselu + + + + Preview + Esikatsele + + + + Preview selection + Esikatsele valinta + + + + The following files support previewing, <br>please select one of them: + Seuraavia tiedostoja voi esiketsella, <br>valitse yksi seuraavista: + + + + previewSelect + + + + Preview impossible + Esikatselu ei ole mahdollista + + + + + Sorry, we can't preview this file + Tätä tiedostoa ei voi esikatsella + + + + Name + Nimi + + + + Size + Koko + + + + Progress + Edistyminen + + + + properties + + Allocating + Varataan tilaa + + + Checking files + Tarkastetaan tiedostoja + + + Connecting to tracker + Yhdistään seurantapalvelimeen + + + Current Session + Session tiedot + + + + Current tracker: + Nykyinen seurantapalvelin: + + + + Download in correct order (slower but good for previewing) + Lataa järjestyksessä (hitaampi, mutta mahdollistaa aikaisemman esikatselun) + + + Downloading + Ladataan + + + Downloading Metadata + Ladataan sisältökuvauksia + + + Download state: + Tila: + + + Errors: + Virheet: + + + File Name + Tiedostonimi + + + + Files contained in current torrent: + Torrentin tiedostot: + + + Finished + Valmis + + + Leechers: + Lataajia: + + + Main infos + Perustiedot + + + + + None - Unreachable? + Ei yhtään - tavoittamattomissa? + + + + OK + OK + + + Options + Asetukset + + + + Progress + Edistyminen + + + Queued for checking + Tarkastusjonossa + + + + Save path: + Tallennuskansio: + + + Seeders: + Jakajia: + + + Seeding + Jaetaan + + + Select + Lataa + + + Selected + Valittu + + + Share Ratio: + Jakosuhde: + + + + Size + Koko + + + + Torrent content + Torrentin sisältö + + + + Torrent Properties + Torrentin tiedot + + + + Main info + Yleiset tiedot + + + + Torrent information + Torrentin tiedot + + + + Total downloaded: + Ladattu yhteensä: + + + + Total failed: + Epäonnistumisia yhteensä: + + + + Total uploaded: + Lähetetty yhteensä: + + + Tracker + Seurantapalvelin + + + + Trackers: + Seurantapalvelimet: + + + + Unknown + Tuntematon + + + Unselect + Älä lataa + + + You can select here precisely which files you want to download in current torrent. + Voit valita tiedostot, jotka ladataan tästä torrentista. + + + Torrent infos + Torrentit tiedot + + + + Creator: + Luoja: + + + + Torrent hash: + Tarkistustiiviste: + + + + Comment: + Kommentti: + + + + Current session + Nykyinen istunto + + + + Share ratio: + Jakosuhde: + + + + Trackers + Seurantapalvelimet + + + New tracker + Uusi seurantapalvelin + + + New tracker url: + Uuden palvelimen osoite: + + + + Priorities: + Prioriteetit: + + + + Normal: normal priority. Download order is dependent on availability + Normaali: Latausjärjestys riippuu saatavuudesta + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Korkea: Valittuja osia ladataan aikaisemmin kuin muita osia, joilla on sama saatavuus + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Korkein: Osa ladataan ennen muita + + + + File name + Tiedostonimi + + + + + Priority + Prioriteetti + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + Seurantapalvelinlista ei voi olla tyhjä. + + + + Ignored: file is not downloaded at all + Ei ladata: tiedostoa ei ladata + + + + Ignored + Ei ladata + + + + Normal + Normaali + + + + Maximum + Korkein + + + + High + Korkea + + + + Url seeds + URL-jaot + + + + New url seed: + Uusi URL-jakaja: + + + + This url seed is already in the list. + Jakaja on jo listassa. + + + None + i.e: No error message + Ei mikään + + + + New url seed + New HTTP source + Uusi URL-lähde + + + + The following url seeds are available for this torrent: + Seuraavat URL-jaot ovat saatavilla: + + + + Priorities error + Prioriteettivirhe + + + + Error, you can't filter all the files in a torrent. + Et voi suodattaa torrentin kaikkia tiedostoja. + + + + Downloaded pieces + Ladatut osat + + + + Collapse all + Pienennä kaikki + + + + Expand all + Laajenna kaikki + + + + ... + ... + + + + + Choose save path + Valitse tallennuskansio + + + + Save path creation error + Tallennuskansion luominen ei onnistunut + + + + Could not create the save path + Tallennuskansion luominen ei onnistunut + + + + search_engine + + + + Search + Etsi + + + Search Engines + Hakupalvelut + + + Search Pattern: + Hakulauseke: + + + Stop + Pysäytä + + + + Status: + Tila: + + + + Stopped + Pysäytetty + + + Results: + Tulokset: + + + + Download + Lataa + + + Clear + Tyhjennä + + + Update search plugin + Päivitä hakuliitännäinen + + + + Search engines... + Hakukoneet... + + + Close tab + Sulje välilehti + + + + seeding + + + Search + Etsi + + + The following torrents are finished and shared: + Seuraavat torrentit ovat valmiita ja jaettuja: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Huomaa:</u> Verkon hyvinvoinnin kannalta on tärkeää, että jatkat torrenttien jakamista myös sen jälkeen kun ne ovat latautuneet. + + + + Start + Käynnistä + + + + Pause + Pysäytä + + + + Delete + Poista + + + + Delete Permanently + Poista pysyvästi + + + + Torrent Properties + Torrentin tiedot + + + + Preview file + Esikatsele + + + + Set upload limit + Aseta lähetysnopeusrajoitus + + + + Open destination folder + Avaa kohdekansio + + + + Name + Nimi + + + + Size + Koko + + + + Upload Speed + Lähetysnopeus + + + + + Connected peers + Liittyneet vertaiset + + + + + Seeds / Leechers + Jakajat / Lataajat + + + + Copy magnet link + Kopioi magnet-linkki + + + Leechers + Lataajia + + + + Ratio + Jakosuhde + + + + Buy it + Osta + + + Priority + Prioriteetti + + + Increase priority + Nosta prioriteettia + + + Decrease priority + Laske prioriteettia + + + + Force recheck + Pakota tarkistamaan uudelleen + + + + Total uploaded + Lähetetty yhteensä + + + + subDownloadThread + + + Host is unreachable + Kohdekone ei ole saavutettavissa + + + + File was not found (404) + Tiedostoa ei löytynyt (404) + + + + Connection was denied + Yhteys evättiin + + + + Url is invalid + URL ei ole kelvollinen + + + + Connection failure + Yhteysvirhe + + + + Connection was timed out + Yhteys aikakatkaistiin + + + + Incorrect network interface + Väärä verkkoliitäntä + + + + Unknown error + Tuntematon virhe + + + + I/O Error + I/O-virhe + + + + Could not resolve proxy + Välityspalvelimen osoitteen selvittäminen epäonnistui + + + + torrentAdditionDialog + + + + Choose save path + Valitse tallennuskansio + + + + Could not create the save path + Tallennuskansion luominen ei onnistunut + + + + Empty save path + Ei tallennuskansiota + + + False + Ei + + + + Invalid file selection + Virheellinen tiedostovalinta + + + + Please enter a save path + Anna tallennuskansio + + + Unknown + Tuntematon + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 torrentin lataamisen jälkeen) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (tarvitaan %1 lisää lataamiseen) + + + + Save path creation error + Tallennuskansion luominen ei onnistunut + + + This file is either corrupted or this isn't a torrent. + Tiedosto ei ole kelvollinen torrent-tiedosto. + + + True + Kyllä + + + + + Unable to decode torrent file: + Torrent-tiedoston purkaminen ei onnistunut: + + + + You must select at least one file in the torrent + Valitse ainakin yksi torrent-tiedosto + + + + File name + Tiedostonimi + + + + Size + Koko + + + + Progress + Edistyminen + + + + + Priority + Prioriteetti + + + diff --git a/src/lang/qbittorrent_fr.qm b/src/lang/qbittorrent_fr.qm new file mode 100644 index 0000000000000000000000000000000000000000..4ad01e5dcfd1f3d7e45c97cd22a2d43cc5c78e14 GIT binary patch literal 72295 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 p8eV)F0tUmQum{{6PQ(zrLQ_n>;n5?8zg@jiWG + + + + @default + + b + bytes + o + + + KB + Ko + + + MB + Mo + + + GB + Go + + + b + bytes + o + + + KB + Ko + + + MB + Mo + + + GB + Go + + + B + bytes + o + + + KB + kilobytes + Ko + + + MB + megabytes + Mo + + + GB + gigabytes + Go + + + TB + terabytes + To + + + KiB + kibibytes (1024 bytes) + Ko + + + MiB + mebibytes (1024 kibibytes) + Mo + + + GiB + gibibytes (1024 mibibytes) + Go + + + TiB + tebibytes (1024 gibibytes) + To + + + + AboutDlg + + + About qBittorrent + A Propos de qBittorrent + + + + About + A Propos + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page :</u> <i>http://qbittorrent.sourceforge.net</i><br> + Un Client bittorrent utilisant Qt4 et la libtorrent, programmé en C++.<br> +<br> +Copyright © 2006 par Christophe Dumez<br> +<br> <u>Site Internet :</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + + Author + Auteur + + + qBitorrent Author + Auteur de qBittorrent + + + + Name: + Nom : + + + + Country: + Nationalité : + + + + E-mail: + Courriel : + + + + Home page: + Site Personnel : + + + + Christophe Dumez + + + + + France + + + + Thanks To + Remerciements + + + + Translation + Traduction + + + + License + Licence + + + + <h3><b>qBittorrent</b></h3> + + + + qBittorrent Author + Auteur de qBittorrent + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + Date de naissance : + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un client Bittorrent programmé en C++, basé sur les bibliothèques Qt4 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">et libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Site Web officiel :</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Occupation: + Emploi : + + + + 03/05/1985 + + + + + Student in computer science + Elève-ingénieur en génie informatique + + + + Thanks to + Remerciements + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Un client Bittorrent basé sur Qt4 et la libtorrent, programmé en C++.<br> +<br> +Copyright © 2006 par Christophe DUMEZ<br> +<br><u>Site internet :</u> <i>http://www.qbittorrent.org</i><br> + + + + BandwidthAllocationDialog + + + Upload limit: + Limite upload : + + + + Download limit: + Limite download : + + + + + + + Unlimited + Unlimited (bandwidth) + Illimitée + + + + KiB/s + Ko/s + + + + ConsoleDlg + + + qBittorrent console + Console qBittorrent + + + + General + Général + + + + Blocked IPs + IPs bloquées + + + + DLListDelegate + + + KiB/s + Ko/s + + + + Dialog + + Options -- qBittorrent + Préférences -- qBittorrent + + + Options + Préférences + + + Main + Principal + + + Save Path: + Dossier de sauvegarde : + + + Download Limit: + Limite Download : + + + Upload Limit: + Limite Upload : + + + Max Connects: + Connects Max : + + + Port range: + Rangée Ports : + + + ... + ... + + + Kb/s + Ko/s + + + Disable + Désactiver + + + connections + connexions + + + to + à + + + Proxy Settings + Paramètres Proxy + + + Server IP: + IP du serveur : + + + + + + Port: + Port : + + + Proxy server requires authentication + Le serveur proxy nécessite une authentification + + + + + + Authentication + Authentification + + + User Name: + Nom d'utilisateur : + + + + + + Password: + Mot de passe : + + + Enable connection through a proxy server + Activer la connexion à travers un serveur proxy + + + Language + Langue + + + Please choose your preferred language in the following list: + Veuillez choisir votre langue dans la liste suivante : + + + Cancel + Annuler + + + Language settings will take effect after restart. + Les réglages linguistiques prennent effet au redémarrage. + + + Scanned Dir: + Dossier surveillé : + + + Enable directory scan (auto add torrent files inside) + Activer l'ajout auto des torrents dans un dossier + + + Connection Settings + Réglages Connexion + + + Share ratio: + Ratio Partage : + + + 1 KB DL = + 1 Ko DL = + + + KB UP max. + Ko UP max. + + + Ip filter + Filtre IP + + + + Activate IP Filtering + Activer le filtrage d'IP + + + + Filter Settings + Paramètres de filtrage + + + Add Range + Ajouter Rangée + + + Remove Range + Supprimer Rangée + + + ipfilter.dat URL or PATH: + Url ou chemin de ipfilter.dat : + + + Start IP + IP Début + + + End IP + IP Fin + + + Origin + Origine + + + Comment + Commentaire + + + Apply + Appliquer + + + + IP Filter + Filtrage IP + + + Add Range + Ajouter Rangée + + + Remove Range + Supprimer Rangée + + + ipfilter.dat Path: + Chemin ipfilter.dat : + + + Go to systray on minimizing window + Iconifier lors de la minimisation de la fenêtre + + + Clear finished downloads on exit + Enlever les téléchargements terminés à la fermeture + + + Ask for confirmation on exit + Demander confirmation avant la fermeture + + + Go to systray when minimizing window + Iconifier lors de la réduction de la fenêtre + + + Misc + Divers + + + Localization + Traduction + + + + Language: + Langue : + + + Behaviour + Comportement + + + Always display OSD + Toujours afficher les OSD + + + Display OSD only if window is minimized or iconified + Afficher les OSD uniquement lorsque la fenêtre n'est pas visible + + + Never display OSD + Ne jamais afficher d'OSD + + + + + KiB/s + Ko/s + + + 1 KiB DL = + 1 Ko DL = + + + KiB UP max. + Ko UP max. + + + DHT (Trackerless): + DHT (Trackerless) : + + + Disable DHT (Trackerless) support + Désactiver le support DHT (Trackerless) + + + Automatically clear finished downloads + Effacer automatiquement les téléchargements terminés + + + Preview program + Logiciel de prévisualisation + + + Audio/Video player: + Lecteur audio/video : + + + Systray Messages + Messages de notification + + + Always display systray messages + Toujours afficher les messages de notification + + + Display systray messages only when window is hidden + Afficher les messages de notification lorsque la fenêtre n'est pas visible + + + Never display systray messages + Ne jamais afficher les messages de notification + + + DHT configuration + Configuration DHT + + + + DHT port: + Port DHT : + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Remarque :</b> qBittorrent devra être relancé pour que les changements soient pris en compte. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b> Note pour les traducteurs :</b> Si qBittorrent n'est pas disponible dans votre langue, <br/> et si vous désirez participer à sa traduction, <br/> veuillez me contacter svp (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Afficher une fenêtre de paramétrage à chaque ajout de torrent + + + Default save path + Répertoire de destination par défaut + + + Disable DHT (Trackerless) + Désactiver le DHT (sans tracker) + + + Disable Peer eXchange (PeX) + Désactiver l'échange de sources (PeX) + + + Go to systray when closing main window + Iconifier lors de la fermeture de la fenêtre + + + + Connection + Connexion + + + Peer eXchange (PeX) + Echange de sources (PeX) + + + DHT (trackerless) + DHT (sans Tracker) + + + Torrent addition + Ajout de torrent + + + Main window + Fenêtre principale + + + Systray messages + Messages de notification + + + Directory scan + Surveillance de dossier + + + Style (Look 'n Feel) + Apparence (Look 'n Feel) + + + + Plastique style (KDE like) + Style Plastique (Type KDE) + + + Cleanlooks style (GNOME like) + Style Cleanlooks (Type Gnome) + + + Motif style (default Qt style on Unix systems) + Style Motif (Style Qt par défaut sur Unix) + + + + CDE style (Common Desktop Environment like) + Style CDE (Type Common Desktop Environment) + + + MacOS style (MacOSX only) + Style MacOS (Sur MacOSX uniquement) + + + Exit confirmation when the download list is not empty + Confirmation lors de la sortie si la liste de téléchargement n'est pas vide + + + Disable systray integration + Désactiver l'intégration dans la barre des tâches + + + WindowsXP style (Windows XP only) + Style WindowsXP (Sur Windows XP uniquement) + + + Server IP or url: + IP ou URL du serveur : + + + Proxy type: + Type du Proxy : + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + Connexions concernées + + + + Use proxy for connections to trackers + Utiliser le proxy pour les connexions aux trackers + + + + Use proxy for connections to regular peers + Utiliser le proxy pour les connexions aux autres clients + + + + Use proxy for connections to web seeds + Utiliser le proxy pour les connexions aux sources web + + + + Use proxy for DHT messages + Utiliser le proxy pour les connexions DHT (sans tracker) + + + Encryption + Cryptage + + + Encryption state: + Etat du cryptage : + + + + Enabled + Activé + + + + Forced + Forcé + + + + Disabled + Désactivé + + + + Preferences + Préférences + + + General + Général + + + Network + Réseau + + + + User interface settings + Paramètres de l'interface + + + + Visual style: + Style visuel : + + + + Cleanlooks style (Gnome like) + Style Cleanlooks (Type Gnome) + + + + Motif style (Unix like) + Style Motif (Type Unix) + + + + Ask for confirmation on exit when download list is not empty + Confirmation lors de la sortie si la liste de téléchargement n'est pas vide + + + + Display current speed in title bar + Afficher la vitesse de transfert actuelle dans la barre de titre + + + + System tray icon + Intégration dans la barre des tâches + + + + Disable system tray icon + Désactiver l'intégration dans la barre des tâches + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Iconifier lors de la fermeture + + + + Minimize to tray + Iconifier lors de la minimisation + + + + Show notification balloons in tray + Afficher les messages de notification dans la barre des tâches + + + Media player: + Lecteur média : + + + + Downloads + Téléchargements + + + Put downloads in this folder: + Mettre les fichiers téléchargés dans ce dossier : + + + + Pre-allocate all files + Pré-allouer l'espace disque pour tous les fichiers + + + + When adding a torrent + Lors de l'ajout d'un torrent + + + + Display torrent content and some options + Afficher le contenu du torrent et quelques paramètres + + + + Do not start download automatically + The torrent will be added to download list in pause state + Ne pas commencer le téléchargement automatiquement + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Surveillance de dossier + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Double-clic sur les listes de transfert + + + + Download list: + Liste de téléchargement : + + + + + Start/Stop + Démarrer/Stopper + + + + + Open folder + Ouvrir le dossier + + + + + Show properties + Afficher propriétés + + + + Seeding list: + Liste d'envoi : + + + + Download folder: + Répertoire de téléchargement : + + + + Temp folder: + Répertoire temporaire : + + + + Automatically download torrents present in this folder: + Télécharger automatiquement les torrents présents dans ce dossier : + + + + Listening port + Port d'écoute + + + to + i.e: 1200 to 1300 + à + + + + Enable UPnP port mapping + Activer l'UPnP + + + + Enable NAT-PMP port mapping + Activer le NAT-PMP + + + + Global bandwidth limiting + Limitation globale de bande passante + + + + Upload: + Envoi : + + + + Download: + Téléchargement : + + + + Bittorrent features + Fonctionnalités Bittorrent + + + + Use the same port for DHT and Bittorrent + Utiliser le même port pour le DHT et Bittorrent + + + + Spoof µtorrent to avoid ban (requires restart) + Se faire passer pour µtorrent pour éviter le blocage (redémarrage requis) + + + + + Type: + Type : + + + + + (None) + (Aucun) + + + + + Proxy: + Serveur mandataire (proxy) : + + + + + + Username: + Nom d'utilisateur : + + + + Bittorrent + + + + + UI + Interface + + + + Connections limit + Limite de connections + + + + Global maximum number of connections: + Nombre global maximum de connexions : + + + + Maximum number of connections per torrent: + Nombre maximum de connexions par torrent : + + + + Maximum number of upload slots per torrent: + Nombre maximum de slots d'envoi par torrent : + + + Additional Bittorrent features + Fonctionnalités Bittorrent additionnelles + + + + Enable DHT network (decentralized) + Activer le réseau DHT (décentralisé) + + + Enable Peer eXchange (PeX) + Activer l'échange de sources (PeX) + + + + Enable Local Peer Discovery + Activer la recherche locale de sources + + + + Encryption: + Chiffrement : + + + + Share ratio settings + Paramètres du ratio de partage + + + + Desired ratio: + Ratio désiré : + + + Remove torrents when their ratio reaches: + Supprimer les torrent + + + + Filter file path: + Chemin vers le fichier de filtrage : + + + + transfer lists refresh interval: + Intervalle de rafraîchissement des listes de transfert : + + + + ms + + + + + + RSS + + + + + RSS feeds refresh interval: + Intervalle de rafraîchissement des flux RSS : + + + + minutes + + + + + Maximum number of articles per feed: + Numbre maximum d'articles par flux : + + + + File system + Système de fichiers + + + + Remove finished torrents when their ratio reaches: + Supprimer les torrents terminés lorsque leur ratio atteint : + + + + System default + Par défaut + + + + Start minimized + Minimisation de la fenêtre au démarrage + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Action du double clic dans les listes de transfert + + + In download list: + Dans la liste de téléchargement : + + + Pause/Start torrent + Mettre en pause / Démarrer + + + Open destination folder + Ouvrir le répertoire de destination + + + Display torrent properties + Afficher les propriétés du torrent + + + In seeding list: + Dans la liste de partage : + + + Folder scan interval: + Intervalle de scan du dossier : + + + seconds + secondes + + + Spoof Azureus to avoid ban (requires restart) + Se faire passer pour Azureus pour éviter le bannissement (redémarrage requis) + + + + Web UI + Interface Web + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Action du double-clic + + + + Port used for incoming connections: + Port pour les connexions entrantes : + + + + Random + Aléatoire + + + + Enable Web User Interface + Activer l'interface Web + + + + HTTP Server + Serveur HTTP + + + + Enable RSS support + Activer le module RSS + + + + RSS settings + Paramètres du RSS + + + + Enable queueing system + Activer le système de file d'attente + + + + Maximum active downloads: + Nombre maximum de téléchargements actifs : + + + + Torrent queueing + Mise en attente de torrents + + + + Maximum active torrents: + Nombre maximum de torrents actifs : + + + + Display top toolbar + + + + + Proxy + Serveur mandataire + + + + Search engine proxy settings + Paramètres du proxy (moteur de recherche) + + + + Bittorrent proxy settings + Paramètres du proxy (Bittorrent) + + + + Maximum active uploads: + Nombre maximum d'uploads actifs : + + + + DownloadingTorrents + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Taille + + + + Progress + i.e: % downloaded + Progression + + + + DL Speed + i.e: Download speed + Vitesse DL + + + + UP Speed + i.e: Upload speed + Vitesse UP + + + + Seeds/Leechers + i.e: full/partial sources + Sources complètes / partielles + + + Seeds/Leechs + i.e: full/partial sources + Sources complètes / partielles + + + + Ratio + Ratio + + + + ETA + i.e: Estimated Time of Arrival / Time left + Restant + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 démarré. + + + Be careful, sharing copyrighted material without permission is against the law. + Attention, partager des oeuvres sous copyright sans en avoir la permission est illégal. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>a été bloqué</i> + + + Fast resume data was rejected for torrent %1, checking again... + Le relancement rapide a échoué pour le torrent %1, revérification... + + + Url seed lookup failed for url: %1, message: %2 + Le contact de la source HTTP a échoué à l'url : %1, message : %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' a été ajouté à la liste de téléchargement. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' a été relancé. (relancement rapide) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' est déjà présent dans la liste de téléchargement. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossible de décoder le torrent : '%1' + + + This file is either corrupted or this isn't a torrent. + Ce fichier est corrompu ou il ne s'agit pas d'un torrent. + + + Couldn't listen on any of the given ports. + Impossible d'écouter sur les ports donnés. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Téléchargement de '%1', veuillez patienter... + + + + Hide or Show Column + Afficher ou cacher colonne + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP : Echec de mapping du port, message : %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP : Réussite du mapping de port, message : %1 + + + Priority + Priorité + + + + FeedDownloader + + + RSS Feed downloader + Téléchargement du flux RSS + + + + RSS feed: + Flux RSS : + + + + Feed name + Nom du flux + + + + Automatically download torrents from this feed + Télécharger automatiquement les torrents depuis ce flux + + + + Download filters + Filtres pour le téléchargement + + + + Filters: + Filtres : + + + + Filter settings + Attributs du filtre + + + + Matches: + Contient : + + + + Does not match: + Ne contient pas : + + + + Destination folder: + Dossier de destination : + + + + ... + ... + + + + Filter testing + test du flitre + + + + Torrent title: + Titre du torrent : + + + + Result: + Résultat : + + + + Test + Test + + + + Import... + Importer... + + + + Export... + Exporter... + + + + + Rename filter + Renommer le filtre + + + + + Remove filter + Supprimer le filtre + + + + Add filter + Ajouter un filtre + + + + FeedDownloaderDlg + + + New filter + Nouveau filtre + + + + Please choose a name for this filter + Veuillez choisir un nom pour ce filtre + + + + Filter name: + Nom du filtre : + + + + + + Invalid filter name + Nom de filtre non valide + + + + The filter name cannot be left empty. + Le nom du filtre ne peut pas être vide. + + + + + This filter name is already in use. + Ce nom de filtre est déjà utilisé. + + + + Filter testing error + Essai du filtre impossible + + + + Please specify a test torrent name. + Veuillez spécifier un exemple de nom de torrent. + + + + matches + Reconnu + + + + does not match + Non reconnu + + + + Select file to import + Sélection du fichier à importer + + + + + Filters Files + Fichiers de filtrage + + + + Import successful + Importation réussie + + + + Filters import was successful. + L'importation s'est correctement déroulée. + + + + Import failure + Echec importation + + + + Filters could not be imported due to an I/O error. + Les filtres n'ont pas pu être importés suite à une erreur E/S. + + + + Select destination file + Sélectionner le fichier de destination + + + + Overwriting confirmation + Confirmation de l'écrasement + + + + Are you sure you want to overwrite existing file? + Etes-vous certain de vouloir écraser le fichier éxistant ? + + + + Export successful + Exportation réussie + + + + Filters export was successful. + L'exportation des filtres s'est correctement déroulée. + + + + Export failure + Echec de l'exportation + + + + Filters could not be exported due to an I/O error. + Les filtres n'ont pas pu être exportés suite à une erreur E/S. + + + + FeedList + + + Unread + Non lu + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Erreur E/S + + + + + + Couldn't open %1 in read mode. + Impossible d'ouvrir %1 en lecture. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 n'est pas un fichier PeerGuardian P2B valide. + + + + FinishedListDelegate + + + KiB/s + Ko/s + + + + FinishedTorrents + + Finished + Terminé + + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Taille + + + + Seeds / Leechers + Sources complètes / partielles + + + + Connected peers + Hôtes connectés + + + Progress + i.e: % downloaded + Progression + + + DL Speed + i.e: Download speed + Vitesse DL + + + + UP Speed + i.e: Upload speed + Vitesse UP + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Statut + + + ETA + i.e: Estimated Time of Arrival / Time left + Restant + + + Finished + i.e: Torrent has finished downloading + Terminé + + + None + i.e: No error message + Aucun + + + + Ratio + Ratio + + + Leechers + i.e: full/partial sources + Sources partielles + + + + Total uploaded + i.e: Total amount of uploaded data + Total envoyé + + + + Hide or Show Column + Afficher ou cacher colonne + + + Incomplete torrent in seeding list + Torrent incomplet en partage + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Il semble que l'état du torrent '%1' soit passé de 'en partage' à 'téléchargement'. Désirez-vous le déplacer dans la liste de téléchargement ? (sinon, le torrent sera simplement supprimé) + + + Priority + Priorité + + + + GUI + + Couldn't create the directory: ' + Impossible de trouver le dossier : ' + + + + Open Torrent Files + Ouvrir fichiers torrent + + + Torrent Files (*.torrent) + Fichiers Torrent (*.torrent) + + + MB + Mo + + + kb/s + ko/s + + + Unknown + Inconnu + + + Unable to decode torrent file: ' + Impossible de décoder le fichier torrent : ' + + + This file is either corrupted or this isn't a torrent. + Ce fichier est corrompu ou il ne s'agit pas d'un torrent. + + + + + + + Are you sure? -- qBittorrent + Etes vous sûr ? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Etes-vous sûr de vouloir enlever tous les fichiers de la liste de téléchargement ? + + + + + + + + &Yes + &Oui + + + + + + + + &No + &Non + + + + Are you sure you want to delete the selected item(s) in download list? + Etes-vous sûr de vouloir enlever tous les fichiers sélectionnés de la liste de téléchargement ? + + + paused + en pause + + + started + démarré + + + All Downloads Resumed! + Continuation de tous les téléchargements! + + + kb/s + ko/s + + + + Finished + Terminé + + + Checking... + Vérification... + + + Connecting... + Connexion... + + + Downloading... + Téléchargement... + + + Download list cleared. + Liste de téléchargement vidée. + + + All Downloads Paused. + Tous les téléchargements ont été mis en pause. + + + All Downloads Resumed. + Tous les téléchargements ont été relancés. + + + DL Speed: + Vitesse DL : + + + started. + démarré. + + + UP Speed: + Vitesse UP: + + + Couldn't create the directory: + Impossible de créer le dossier : + + + + Torrent Files + Fichiers Torrent + + + already in download list. + <file> already in download list. + déjà dans la liste de téléchargement. + + + added to download list. + ajouté à la liste de téléchargement. + + + resumed. (fast resume) + relancé. (relancement rapide) + + + Unable to decode torrent file: + Impossible de décoder le fichier torrent : + + + Are you sure? + Etes-vous sûr ? + + + removed. + <file> removed. + supprimé. + + + paused. + <file> paused. + mis en pause. + + + resumed. + <file> resumed. + relancé. + + + m + minutes + m + + + h + hours + h + + + d + days + j + + + Listening on port: + Ecoute sur le port: + + + Couldn't listen on any of the given ports + Impossible d'écouter sur les ports donnés + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Vitesse DL : + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: Par Christophe Dumez :: Copyright (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Statut Connexion :</b><br>En Ligne + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connexions...</i> + <b>Statut Connexion :</b><br>Derrière un pare-feu ?<br><i>Aucune connexion entrante...</i> + + + <b>Connection Status:</b><br>offline<br><i>No peers found...</i> + <b>Statut Connexion :</b><br>Déconnecté<br><i>Aucun peer trouvé...</i> + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Statut Connexion :</b><br>Derrière un pare-feu ?<br><i>Aucune connexion entrante...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Statut Connexion :</b><br>Déconnecté<br><i>Aucun peer trouvé...</i> + + + has finished downloading. + a fini de télécharger. + + + Couldn't listen on any of the given ports. + Impossible d'écouter sur les ports donnés. + + + None + Aucun + + + Empty search pattern + Motif de recherche vide + + + Please type a search pattern first + Veuillez entrer un motif de recherche d'abord + + + No seach engine selected + Aucun moteur de recherche sélectionné + + + You must select at least one search engine. + Vous devez sélectionner au moins un moteur de recherche. + + + Searching... + Recherche en cours... + + + Could not create search plugin. + Impossible de créer le greffon de recherche. + + + Error during search + Erreur durant la recherche + + + Stopped + Stoppé + + + I/O Error + Erreur E/S + + + Couldn't create temporary file on hard drive. + Impossible de créer le fichier temporaire sur le disque dur. + + + Torrent file URL + URL du fichier torrent + + + KB/s + Ko/s + + + KB/s + Ko/s + + + Downloading using HTTP: + Téléchargement via HTTP : + + + Torrent file URL: + URL du fichier torrent : + + + A http download failed... + Un téléchargement http a échoué... + + + A http download failed, reason: + Un téléchargement http a échoué, raison : + + + Are you sure you want to quit? -- qBittorrent + Etes-vous sûr ? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Etes-vous certain de vouloir quitter qBittorrent ? + + + Timed out + Délai écoulé + + + Error during search... + Erreur durant la recherche... + + + Failed to download: + Echec lors du téléchargement de : + + + KiB/s + Ko/s + + + KiB/s + Ko/s + + + A http download failed, reason: + Un téléchargement http a échoué, raison : + + + Stalled + En attente + + + Your search is finished + Votre recherche s'est terminée + + + Search is finished + La recherche est terminée + + + An error occured during search... + Une erreur s'est produite lors de la recherche... + + + Search aborted + La recherché a été interrompue + + + Search returned no results + La recherche n'a retourné aucun résultat + + + Search is Finished + La recherche est terminée + + + Search plugin update -- qBittorrent + Mise à jour du greffon de recherche -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Le greffon de recherche est ancien, voulez-vous procéder à la mise à jour ? + +Changemets: + + + + Sorry, update server is temporarily unavailable. + Désolé, le serveur de mise à jour est temporairement indisponible. + + + Your search plugin is already up to date. + Votre greffon de recherche est déjà à jour. + + + Results + Résultats + + + Name + Nom + + + Size + Taille + + + Progress + Progression + + + DL Speed + Vitesse DL + + + UP Speed + Vitesse UP + + + Status + Statut + + + ETA + Restant + + + Seeders + Sources complètes + + + Leechers + Sources partielles + + + Search engine + Moteur de recherche + + + Stalled + state of a torrent whose DL Speed is 0 + En attente + + + Paused + En pause + + + Preview process already running + Processus de prévisualisation inachevé + + + There is already another preview process running. +Please close the other one first. + Il y a déjà un processus de prévisualisation en cours d'exécution. +Veuillez d'abord le quitter. + + + Couldn't download + Couldn't download <file> + Impossible de télécharger + + + reason: + Reason why the download failed + Raison : + + + Downloading + Example: Downloading www.example.com/test.torrent + En téléchargement + + + Please wait... + Veuillez patienter... + + + Transfers + Transferts + + + + Download finished + Téléchargement terminé + + + has finished downloading. + <filename> has finished downloading. + est fini de télécharger. + + + Search Engine + Moteur de recherche + + + Are you sure you want to quit qBittorrent? + Etes-vous certain de vouloir quitter qBittorrent ? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Etes-vous certain de vouloir supprimer les fichiers sélectionnés depuis la liste de téléchargement ainsi que le disque dur ? + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Statut de la connexion : + + + Offline + Déconnecté + + + No peers found... + Aucune source trouvée... + + + Name + i.e: file name + Nom + + + Size + i.e: file size + Taille + + + Progress + i.e: % downloaded + Progression + + + DL Speed + i.e: Download speed + Vitesse DL + + + UP Speed + i.e: Upload speed + Vitesse UP + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + Restant + + + Seeders + i.e: Number of full sources + Sources complètes + + + Leechers + i.e: Number of partial sources + Sources partielles + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 démarré. + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Vitesse DL : %1 Ko/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Vitesse UP : %1 Ko/s + + + Finished + i.e: Torrent has finished downloading + Terminé + + + Checking... + i.e: Checking already downloaded parts... + Vérification... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + En attente + + + + Are you sure you want to quit? + Etes vous certain de vouloir quitter ? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' a été supprimé. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' a été ajouté à la liste de téléchargement. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' a été relancé. (relancement rapide) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' est déjà présent dans la liste de téléchargement. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossible de décoder le torrent : '%1' + + + None + i.e: No error message + Aucun + + + Listening on port: %1 + e.g: Listening on port: 1666 + En écoute sur le port: %1 + + + All downloads were paused. + Tous les téléchargements ont été mis en pause. + + + '%1' paused. + xxx.avi paused. + '%1' a été mis en pause. + + + Connecting... + i.e: Connecting to the tracker... + Connexion... + + + All downloads were resumed. + Tous les téléchargements ont été relancés. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' a été relancé. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + Le téléchargement de %1 est terminé. + + + + I/O Error + i.e: Input/Output Error + Erreur E/S + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Une erreur s'est produite lors de la lecture ou l'écriture de %1. Le disque dur est probablement plein, le téléchargement a été mis en pause + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Une erreur s'est produite (disque plein ?), '%1' a été mis en pause. + + + + Connection Status: + Etat de la connexion : + + + + Online + Connecté + + + Firewalled? + i.e: Behind a firewall/router? + Derrière un pare-feu ou un routeur ? + + + No incoming connections... + Aucune connexion entrante... + + + No search engine selected + Aucun moteur de recherche sélectionné + + + Search plugin update + Mise à jour du greffon de recherche + + + Search has finished + Fin de la recherche + + + Results + i.e: Search results + Résultats + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Téléchargement de '%1', veuillez patienter... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Une erreur s'est produite (disque plein ?), '%1' a été mis en pause. + + + + Search + Recherche + + + + RSS + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + En erreur E/S s'est produite pour le torrent %1 +Raison : %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent écoute sur le port : %1 + + + DHT support [ON], port: %1 + Support DHT [ON], port : %1 + + + + + DHT support [OFF] + Support DHT [OFF] + + + + PeX support [ON] + Support PeX [ON] + + + PeX support [OFF] + Support PeX [OFF] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + La liste de téléchargement n'est pas vide. +Etes-vous certain de vouloir quitter qBittorrent ? + + + + + Downloads + Téléchargements + + + Are you sure you want to delete the selected item(s) in finished list and in hard drive? + Etes-vous certain de vouloir supprimer les torrents sélectionnés dans la liste de partage et sur le disque dur ? + + + + Are you sure you want to delete the selected item(s) in finished list? + Etes-vous certain de vouloir supprimer les torrents sélectionnés de la liste de partage ? + + + + UPnP support [ON] + Support UPnP [ON] + + + Be careful, sharing copyrighted material without permission is against the law. + Attention, partager des oeuvres sous copyright sans en avoir la permission est illégal. + + + + Encryption support [ON] + Support cryptage [ON] + + + + Encryption support [FORCED] + Support cryptage [Forcé] + + + + Encryption support [OFF] + Support cryptage [OFF] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>a été bloqué</i> + + + Ratio + Ratio + + + + Alt+1 + shortcut to switch to first tab + Alt+& + + + + Alt+2 + shortcut to switch to second tab + Alt+é + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Qt::CTRL+Qt::Key_F, Qt::Alt+Qt::Key_QuoteDbl + + + + Alt+4 + shortcut to switch to fourth tab + Alt+' + + + + Url download error + Erreur téléchargement url + + + + Couldn't download file at url: %1, reason: %2. + Impossible de télécharger le fichier à l'url : %1, raison : %2. + + + Fast resume data was rejected for torrent %1, checking again... + Le relancement rapide a échoué pour le torrent %1, revérification... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Etes-vous certain de vouloir supprimer les fichiers sélectionnés depuis la liste de téléchargement ainsi que le disque dur ? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Etes-vous certain de vouloir supprimer les torrents sélectionnés dans la liste de partage et sur le disque dur ? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' a été supprimé de manière permanente. + + + Url seed lookup failed for url: %1, message: %2 + Le contact de la source HTTP a échoué à l'url : %1, message : %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+" + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent écoute sur le port : TCP/%1 + + + + UPnP support [OFF] + Support UPNP [OFF] + + + + NAT-PMP support [ON] + Support NAT-PMP [ON] + + + + NAT-PMP support [OFF] + Support NAT-PMP [OFF] + + + + DHT support [ON], port: UDP/%1 + Support DHT [ON], port : UDP/%1 + + + + Local Peer Discovery [ON] + Découverte locale de sources [ON] + + + + Local Peer Discovery support [OFF] + Découverte locale de sources [OFF] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' a été supprimé car son ratio a atteint la limite que vous avez fixée. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2Ko/s, UP: %3Ko/s) + + + + + DL: %1 KiB/s + R : %1 Ko/s + + + + + UP: %1 KiB/s + E : %1 Ko/s + + + + + Ratio: %1 + Ratio : %1 + + + + + DHT: %1 nodes + DHT : %1 noeuds + + + + + No direct connections. This may indicate network configuration problems. + Aucune connexion directe. Ceci peut être signe d'une mauvaise configuration réseau. + + + + Uploads + Partages + + + + Options were saved successfully. + Préférences sauvegardées avec succès. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Par Christophe Dumez + + + Log: + Journal : + + + Total DL Speed: + Vitesse DL totale : + + + Kb/s + ko/s + + + Total UP Speed: + Vitesse UP totale : + + + Name + Nom + + + Size + Taille + + + DL Speed + Vitesse DL + + + UP Speed + Vitesse UP + + + Status + Statut + + + ETA + Restant + + + &Options + Pré&férences + + + + &Edit + &Edition + + + + &File + &Fichier + + + + &Help + &Aide + + + + Open + Ouvrir + + + + Exit + Quitter + + + + Preferences + Préférences + + + + About + A Propos + + + + Start + Démarrer + + + + Pause + Pause + + + + Delete + Supprimer + + + + Pause All + Tous en Pause + + + + Start All + Démarrer tous + + + Connexion Status + Statut Connexion + + + Delete All + Supprimer tous + + + + Torrent Properties + Propriétés du Torrent + + + Connection Status + Statut Connexion + + + Downloads + Téléchargements + + + Search + Recherche + + + Search Pattern: + Motif de recherche : + + + Status: + Statut : + + + Stopped + Stoppé + + + Search Engines + Moteur de recherche + + + Results: + Résultats : + + + Stop + Stopper + + + Seeds + Sources entières + + + Leechers + Sources partielles + + + Search Engine + Moteur de recherche + + + + Download from URL + Téléchargement depuis une URL + + + Download + Télécharger + + + Clear + Vider + + + KiB/s + Ko/s + + + + Create torrent + Créer torrent + + + Ratio: + Ratio : + + + Update search plugin + Mettre à jour le greffon de recherche + + + Session ratio: + Ratio session : + + + Transfers + Transferts + + + + Preview file + Prévisualiser fichier + + + + Clear log + Effacer journal + + + + Delete Permanently + Supprimer depuis le disque + + + + Visit website + Visiter le site internet + + + + Report a bug + Signaler un bogue + + + + Set upload limit + Définir limite d'upload + + + + Set download limit + Définir limite téléchargement + + + + Documentation + Documentation + + + Log + Journal + + + IP filter + Filtre IP + + + + Set global download limit + Définir limite de téléchargement + + + + Set global upload limit + Définir limite d'envoi + + + + Options + Préférences + + + + Decrease priority + Diminuer la priorité + + + + Increase priority + Augmenter la priorité + + + + Console + Console + + + + PropListDelegate + + False + Non + + + True + Oui + + + + + Ignored + Ignoré + + + + + + Normal + Normal (priority) + Normale + + + + + High + High (priority) + Haute + + + + + Maximum + Maximum (priority) + Maximale + + + + QTextEdit + + Clear + Vider + + + + RSS + + + Search + Recherche + + + + + New subscription + Nouveau flux + + + + + + Mark items read + Marquer comme lu + + + + Update all + Tout mettre à jour + + + + Feed URL + URL du flux + + + + + Update + Mettre à jour + + + + New folder + Nouveau dossier + + + + RSS feeds + Flux RSS + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents :</span> <span style=" font-style:italic;">(double-clic pour télécharger)</span></p></body></html> + + + + Bullet + Puce + + + Attachment + Pièce jointe + + + + Article title + Titre de l'article + + + + + Update all feeds + Tout mettre à jour + + + + + Delete + Supprimer + + + + + Rename + Renommer + + + Refresh + Rafraîchir + + + + Download torrent + Télécharger le torrent + + + + Open news URL + Ouvrir l'URL de l'article + + + + Copy feed URL + Copier l'URL du flux + + + + RSS feed downloader + Téléchargement du flux RSS + + + Create + Créer + + + RSS streams : + Flux RSS : + + + Delete selected streams + Supprimer les flux sélectionnés + + + + Refresh RSS streams + Rafraîchir les flux RSS + + + Add a new RSS stream + Ajouter un flux RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Articles :</b> <i>(double-clic pour ouvrir le lien dans votre navigateur)</i> + + + Add RSS stream + Ajouter un flux RSS + + + Refresh all streams + Rafraîchir tous les flux + + + RSS streams: + Flux RSS : + + + Mark all as read + Tout marquer comme lu + + + + RSSImp + + + Please type a rss stream url + Veuillez entrer l'url du flux RSS + + + + Stream URL: + URL du flux : + + + Please choose a new name for this stream + Veuillez choisir un nouveau nom pour ce flux + + + New stream name: + Nouveau nom de flux : + + + no description avalaible + Aucune description disponible + + + + + Are you sure? -- qBittorrent + Etes vous sûr ? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Etes-vous certain de vouloir supprimer ce flux de la liste ? + + + + + &Yes + &Oui + + + + + &No + &Non + + + no refresh + Aucun rafraîchissement + + + no description available + Aucune description disponible + + + Are you sure you want to delete this stream from the list? + Etes-vous certain de vouloir supprimer ce flux de la liste ? + + + Description: + Description : + + + url: + url : + + + Last refresh: + Dernier rafraîchissement : + + + + Please choose a folder name + Veuillez indiquer un nom de dossier + + + + Folder name: + Nom du dossier : + + + + New folder + Nouveau dossier + + + + Overwrite attempt + Tentative d'écrasement + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Vous ne pouvez pas écraser l'élément %1. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Cette source RSS est déjà dans votre liste. + + + + Are you sure you want to delete these elements from the list? + Etes-vous certain de vouloir supprimer ces éléments de la liste ? + + + + Are you sure you want to delete this element from the list? + Etes-vous certain de vouloir supprimer cet élément de la liste ? + + + + Please choose a new name for this RSS feed + Veuillez choisir un nouveau nom pour ce flux RSS + + + + New feed name: + Nouveau nom du flux : + + + + Name already in use + Nom déjà utilisé + + + + This name is already used by another item, please choose another one. + Ce nom est déjà utilisé par un autre élément, veuillez en choisir un autre. + + + + Date: + Date : + + + + Author: + Auteur : + + + + Unread + Non lu + + + + RssItem + + + No description available + Aucune description disponible + + + + RssStream + + %1 ago + 10min ago + il y a %1 + + + + Automatically downloading %1 torrent from %2 RSS feed... + Téléchargement automatique du torrent %1 depuis le flux RSS %2... + + + Never + Jamais + + + + SearchCategories + + + All categories + Toutes catégories + + + + Movies + Films + + + + TV shows + Séries TV + + + + Music + Musique + + + + Games + Jeux + + + + Anime + Animé + + + + Software + Logiciels + + + + Pictures + Photos + + + + Books + Livres + + + + SearchEngine + + Name + i.e: file name + Nom + + + Size + i.e: file size + Taille + + + Seeders + i.e: Number of full sources + Sources complètes + + + Leechers + i.e: Number of partial sources + Sources partielles + + + Search engine + Moteur de recherche + + + + Empty search pattern + Motif de recherche vide + + + + Please type a search pattern first + Veuillez entrer un motif de recherche d'abord + + + No search engine selected + Aucun moteur de recherche sélectionné + + + You must select at least one search engine. + Vous devez sélectionner au moins un moteur de recherche. + + + + + Results + Résultats + + + + Searching... + Recherche en cours... + + + Search plugin update -- qBittorrent + Mise à jour du greffon de recherche -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Le greffon de recherche est ancien, voulez-vous procéder à la mise à jour ? + +Changements: + + + + &Yes + &Oui + + + &No + &Non + + + Search plugin update + Mise à jour du greffon de recherche + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Désolé, le serveur de mise à jour est temporairement indisponible. + + + Your search plugin is already up to date. + Votre greffon de recherche est déjà à jour. + + + + Cut + Couper + + + + Copy + Copier + + + + Paste + Coller + + + + Clear field + Vider le champ + + + + Clear completion history + Vider l'historique d'autocomplétion + + + + Search Engine + Moteur de recherche + + + + + Search has finished + Fin de la recherche + + + + An error occured during search... + Une erreur s'est produite lors de la recherche... + + + + Search aborted + La recherche a été interrompue + + + + Search returned no results + La recherche n'a retourné aucun résultat + + + + Results + i.e: Search results + Résultats + + + Search plugin download error + Erreur téléchargement du greffon de recherche + + + Couldn't download search plugin update at url: %1, reason: %2. + Impossible de télécharger la mise à jour du greffon de recherche à l'url : %1, raison : %2. + + + + + Unknown + Inconnu + + + + SearchTab + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Taille + + + + Seeders + i.e: Number of full sources + Sources complètes + + + + Leechers + i.e: Number of partial sources + Sources partielles + + + + Search engine + Moteur de recherche + + + + TrackersAdditionDlg + + + Trackers addition dialog + Fenêtre d'ajout de trackers + + + + List of trackers to add (one per line): + Liste des trackers à ajouter (un par ligne) : + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + Je tiens à remercier les personnes suivantes pour avoir traduit qBittorrent : + + + Please contact me if you would like to translate qBittorrent to your own language. + Veuillez me contacter si vous désirez traduire qBittorrent dans votre langue natale. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Un grand merci à sourceforge.net qui héberge le projet qBittorrent. + + + I would like to thank the following people who volunteered to translate qBittorrent: + Je tiens à remercier les personnes suivantes pour avoir traduit qBittorrent : + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>J'aimerai remercier sourceforge.net qui héberge le projet de qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Je tiens églement à remercier Jeffery Fernandez (developer@jefferyfernandez.id.au), notre packager RPM, pour son travail.</li></ul> + + + Preview impossible + Prévisualisation impossible + + + Sorry, we can't preview this file + Désolé, il est impossible de prévisualiser ce fichier + + + Name + Nom + + + Size + Taille + + + Progress + Progression + + + No URL entered + Aucune URL entrée + + + Please type at least one URL. + Veuillez entrer au moins une URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Veuillez me contacter si vous désirez traduire qBittorrent dans votre langue natale. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Je tiens à remercier les personnes suivantes pour avoir traduit qBittorrent : + + + + Please contact me if you would like to translate qBittorrent into your own language. + Veuillez me contacter si vous désirez traduire qBittorrent dans votre langue natale. + + + + addTorrentDialog + + + Torrent addition dialog + Dialogue d'ajout de torrent + + + + Save path: + Répertoire de destination : + + + + ... + ... + + + + Torrent size: + Taille du torrent : + + + + + Unknown + Inconnue + + + + Free disk space: + Espace disponible : + + + + Torrent content: + Contenu du torrent : + + + + Download in sequential order (slower but good for previewing) + Téléchargement séquentiel (plus lent mais facilite la prévisualisation) + + + File name + Nom + + + File size + Taille + + + Selected + Sélectionné + + + Download in correct order (slower but good for previewing) + Télécharger dans l'ordre (plus lent mais idéal pour la prévisualisation) + + + + Add to download list in paused state + Ajouter à la liste de téléchargement en état de pause + + + + Add + Ajouter + + + + Cancel + Annuler + + + select + Select + + + Unselect + Désélectionner + + + Select + Sélectionner + + + + Ignored + Ignoré + + + + Normal + Normale + + + + High + Haute + + + + Maximum + Maximale + + + + Collapse all + Tout réduire + + + Expand All + Tout développer + + + + Expand all + Tout développer + + + + authentication + + + + Tracker authentication + Authentification Tracker + + + + Tracker: + Tracker : + + + + Login + Autentification + + + + Username: + Nom d'utilisateur : + + + + Password: + Mot de passe : + + + + Log in + S'authentifier + + + + Cancel + Annuler + + + + bandwidth_dlg + + + Bandwidth allocation + Attribution de bande passante + + + + KiB/s + Ko/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 a atteint le ratio maximum défini. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' a été supprimé de manière permanente. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' a été supprimé. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' a été mis en pause. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' a été relancé. + + + + '%1' is not a valid magnet URI. + '%1' n'est pas un lien magnet valide. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' est déjà présent dans la liste de téléchargement. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' a été relancé. (relancement rapide) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' a été ajouté à la liste de téléchargement. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossible de décoder le torrent : '%1' + + + + This file is either corrupted or this isn't a torrent. + Ce fichier est corrompu ou il ne s'agit pas d'un torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>a été bloqué par votre filtrage IP</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>a été banni suite à l'envoi de données corrompues</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Téléchargement récursif du fichier %1 au sein du torrent %2 + + + + Unable to decode %1 torrent file. + Impossible de décoder le torrent %1. + + + + Couldn't listen on any of the given ports. + Impossible d'écouter sur les ports donnés. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP : Echec de mapping du port, message : %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP : Réussite du mapping de port, message : %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Le relancement rapide a échoué pour le torrent %1, revérification... + + + + Url seed lookup failed for url: %1, message: %2 + Le contact de la source HTTP a échoué à l'url : %1, message : %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Téléchargement de '%1', veuillez patienter... + + + + createTorrentDialog + + Create Torrent file + Créer un ficher torrent + + + Destination torrent file: + Fichier torrent créé : + + + Input file or directory: + Fichier ou dossier à inclure : + + + Comment: + Commentaire : + + + ... + ... + + + Create + Créer + + + + Cancel + Annuler + + + Announce url (Tracker): + URL du tracker : + + + Directory + Dossier + + + + Torrent Creation Tool + Utilitaire de création de torrent + + + <center>Destination torrent file:</center> + <center>Fichier torrent de destination :</center> + + + <center>Input file or directory:</center> + <center>Fichier ou dossier à intégrer :</center> + + + <center>Announce url:<br>(One per line)</center> + <center>urls des trackers :<br>(Une par ligne)</center> + + + <center>Comment:</center> + <center>Commentaire :</center> + + + + Torrent file creation + Création d'un fichier torrent + + + Input files or directories: + Fichiers ou dossiers à insérer : + + + + Announce urls (trackers): + Urls des trackers : + + + URL seeds (optional): + Sources web + + + + Comment (optional): + Commentaire (facultatif) : + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privé (ne sera pas partagé sur le réseau DHT si activé) + + + + Web seeds urls (optional): + Urls sources web (facultatif) : + + + + File or folder to add to the torrent: + Fichier ou dossier à ajouter au torrent : + + + Add a file + Ajouter un fichier + + + Add a folder + Ajouter un dossier + + + + Add file + Ajout fichier + + + + Add folder + Ajout dossier + + + + Piece size: + taille des morceaux : + + + + 32 KiB + 32 Ko + + + + 64 KiB + 64 Ko + + + + 128 KiB + 128 Ko + + + + 256 KiB + 256 Ko + + + + 512 KiB + 512 Ko + + + + 1 MiB + 1 Mo + + + + 2 MiB + 2 Mo + + + + 4 MiB + 4 Mo + + + + Private (won't be distributed on DHT network if enabled) + Privé (ne sera pas distribué sur le réseau DHT si activé) + + + + Start seeding after creation + Commencer le partage directement + + + + Create and save... + Créer et sauvegarder... + + + + Progress: + Progression : + + + + createtorrent + + + Select destination torrent file + Sélectionner le torrent à créer + + + + Torrent Files + Fichiers Torrent + + + Select input directory or file + Sélectionner le dossier ou le fichier à inclure + + + No destination path set + Aucun chemin de destination défini + + + Please type a destination path first + Veuillez entrer un chemin de destination d'abord + + + + No input path set + Aucun fichier inclu + + + + Please type an input path first + Veuillez sélectionner un fichier ou un dossier à inclure d'abord + + + Input path does not exist + Le fichier ou le dossier à inclure est introuvable + + + Please type a correct input path first + Veuillez vérifier la chemin du fichier/dossier à inclure + + + + + + Torrent creation + Création d'un torrent + + + + Torrent was created successfully: + Le torrent a été créé avec succès : + + + Please type a valid input path first + Veuillez entrer répertoire correct en entrée + + + Torrent creation was successfully, reason: %1 + La création du torrent a réussi, + + + + Select a folder to add to the torrent + Sélectionner un dossier à ajouter au torrent + + + Select files to add to the torrent + Sélectionner des fichiers à ajouter au torrent + + + + Please type an announce URL + Veuillez entrer l'url du tracker + + + Announce URL: + URL du tracker : + + + + Torrent creation was unsuccessful, reason: %1 + La création du torrent a échoué, raison : %1 + + + + Announce URL: + Tracker URL + URL du tracker : + + + + Please type a web seed url + Veuillez entrer l'url de la source web + + + + Web seed URL: + URL de la source web : + + + + Select a file to add to the torrent + Sélectionner un fichier à ajouter au torrent + + + No tracker path set + Aucun tracker spécifié + + + Please set at least one tracker + Veuillez définir au moins un tracker + + + + Created torrent file is invalid. It won't be added to download list. + Le torrent créé est invalide. Il ne sera pas ajouté à la liste de téléchargement. + + + + downloadFromURL + + Download from url + Téléchargement depuis une url + + + + Download Torrents from URLs + Téléchargement de torrents depuis des urls + + + + Only one URL per line + Une seule URL par ligne + + + + Download + Télécharger + + + + Cancel + Annuler + + + + Download from urls + Téléchargement depuis des urls + + + + No URL entered + Aucune URL entrée + + + + Please type at least one URL. + Veuillez entrer au moins une URL. + + + + downloading + + + Search + Recherche + + + Total DL Speed: + Vitesse DL totale : + + + KiB/s + Ko/s + + + Session ratio: + Ratio session : + + + Total UP Speed: + Vitesse UP totale : + + + Log + Journal + + + IP filter + Filtre IP + + + + Start + Démarrer + + + + Pause + Pause + + + + Delete + Supprimer + + + Clear + Vider + + + + Preview file + Prévisualiser fichier + + + + Set upload limit + Définir limite d'upload + + + + Set download limit + Définir limite téléchargement + + + + Delete Permanently + Supprimer depuis le disque + + + + Torrent Properties + Propriétés du Torrent + + + + Open destination folder + Ouvrir le répertoire de destination + + + + Name + Nom + + + + Size + Taille + + + + Progress + Progression + + + + DLSpeed + Vitesse DL + + + + UpSpeed + Vitesse UP + + + + Seeds/Leechs + Seeds/Leechs + + + + Ratio + Ratio + + + + ETA + Restant + + + + Buy it + Acheter + + + + Priority + Priorité + + + + Increase priority + Augmenter la priorité + + + + Decrease priority + Diminuer la priorité + + + + Force recheck + Forcer revérification + + + + Copy magnet link + Copier le lien magnet + + + + engineSelect + + + Search plugins + Greffons de recherche + + + + Installed search engines: + Moteurs de recherche installés : + + + + Name + Nom + + + + Url + Adresse + + + + Enabled + Activé + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + D'autres greffons de recherche sont disponibles à cette adresse: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Installer un nouveau + + + + Check for updates + Mettre à jour + + + + Close + Fermer + + + + Enable + Activer + + + + Disable + Désactiver + + + + Uninstall + Désinstaller + + + + engineSelectDlg + + True + Oui + + + False + Non + + + + Uninstall warning + Désinstallation + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Quelques greffons de recherche n'ont pas pu être désinstallés car ils sont inclus dans qBittorrent. + Seuls ceux que vous avez installés vous-même sont désinstallables. +Cependant, les greffons en question ont été désactivés. + + + + Uninstall success + Désinstallation réussie + + + All selected plugins were uninstalled successfuly + Tous les greffons sélectionnés ont été désinstallés avec succès + + + + Select search plugins + Sélectionnez les greffons + + + + + qBittorrent search plugins + Greffons de recherche de qBittorrent + + + + + + + + + + + Search plugin install + Installation d'un greffon de recherche + + + + + + Yes + Oui + + + + + + + No + Non + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Une version plus récente du greffon %1 est déjà installée. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Le greffon %1 a été mis à jour avec succès. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Le greffon %1 a été installé avec succès. + + + + + + + + Search plugin update + Mise à jour du greffon de recherche + + + + + Sorry, update server is temporarily unavailable. + Désolé, le serveur de mise à jour est temporairement indisponible. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Le greffon %1 a été mis à jour avec succès. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Désolé, la mise à jour du greffon %1 a échoué. + + + + All your plugins are already up to date. + Tous vos greffons de recherche sont déjà à jour. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Le greffon de recherche %1 n'a pas pu être mis à jour, l'ancienne version est conservée. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Le greffon de recherche %1 n'a pas pu être installé. + + + + All selected plugins were uninstalled successfully + Tous les greffons sélectionnés ont été désinstallés avec succès + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Le greffon %1 a été mis à jour avec succès. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Le greffon %1 a été installé avec succès. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + Le greffon %1 a été mis à jour avec succès. + + + + Search engine plugin archive could not be read. + L'archive contenant le greffon de recherche n'a pas pu être lue. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Désolé, l'installation du greffon de recherche %1 a échouée. + + + + New search engine plugin URL + Adresse du nouveau greffon de recherche + + + + URL: + Adresse : + + + + misc + + + B + bytes + o + + + + KiB + kibibytes (1024 bytes) + Ko + + + + MiB + mebibytes (1024 kibibytes) + Mo + + + + GiB + gibibytes (1024 mibibytes) + Go + + + + TiB + tebibytes (1024 gibibytes) + To + + + m + minutes + m + + + h + hours + h + + + d + days + j + + + Unknown + Inconnu + + + h + hours + h + + + d + days + j + + + + Unknown + Unknown (size) + Inconnue + + + + < 1m + < 1 minute + < 1min + + + + %1m + e.g: 10minutes + %1min + + + + %1h%2m + e.g: 3hours 5minutes + %1h%2min + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1j%2h%3min + + + + options_imp + + Options saved successfully! + Options sauvegardées avec succès ! + + + Choose Scan Directory + Choisir le dossier surveillé + + + Choose save Directory + Choisir le dossier de sauvegarde + + + Choose ipfilter.dat file + Choix du fichier ipfilter.dat + + + I/O Error + Erreur E/S + + + Couldn't open: + Impossible d'ouvrir : + + + in read mode. + en mode lecture. + + + Invalid Line + Ligne invalide + + + Line + La ligne + + + is malformed. + est mal formée. + + + Range Start IP + IP de début dans la rangée + + + Start IP: + IP de début : + + + Incorrect IP + IP incorrecte + + + This IP is incorrect. + Cette IP est incorrecte. + + + Range End IP + IP de fin dans la rangée + + + End IP: + IP de fin : + + + IP Range Comment + Commentaire de la rangée + + + Comment: + Commentaire : + + + to + <min port> to <max port> + à + + + Choose your favourite preview program + Sélectionner votre logiciel de prévisualisation préféré + + + Invalid IP + IP Incorrecte + + + This IP is invalid. + Cette adresse IP est incorrecte. + + + Options were saved successfully. + Préférences sauvegardées avec succès. + + + + + Choose scan directory + Choisir le dossier à surveiller + + + Choose an ipfilter.dat file + Choisir un fichier ipfilter.dat + + + + + Choose a save directory + Choisir un répertoire de sauvegarde + + + I/O Error + Input/Output Error + Erreur E/S + + + Couldn't open %1 in read mode. + Impossible d'ouvrir %1 en lecture. + + + + + Choose an ip filter file + Choisir un fichier de filtrage IP + + + Filters (*.dat *.p2p *.p2b) + Filtres (*.dat *.p2p *.p2b) + + + + + Filters + Filtres + + + + pluginSourceDlg + + + Plugin source + Source du greffon + + + + Search plugin source: + Source du greffon de recherche : + + + + Local file + Fichier local + + + + Web link + Lien internet + + + + preview + + + Preview selection + Selection du fichier à prévisualiser + + + + File preview + Prévisualisation + + + + The following files support previewing, <br>please select one of them: + Les fichiers suivants peuvent être prévisualisés, <br>Veuillez en sélectionner un : + + + + Preview + Prévisualiser + + + + Cancel + Annuler + + + + previewSelect + + + + Preview impossible + Prévisualisation impossible + + + + + Sorry, we can't preview this file + Désolé, il est impossible de prévisualiser ce fichier + + + + Name + Nom + + + + Size + Taille + + + + Progress + Progression + + + + properties + + + Torrent Properties + Propriétés du Torrent + + + Main Infos + Infos Principales + + + File Name + Nom du fichier + + + Current Session + Session Actuelle + + + Total Uploaded: + Total Uploadé : + + + Total Downloaded: + Total Downloadé : + + + Download state: + Etat du téléchargement : + + + Current Tracker: + Tracker Actuel : + + + Number of Peers: + Nombre de peers : + + + Torrent Content + Contenu du Torrent + + + + OK + + + + Cancel + Annuler + + + Total Failed: + Total échoué : + + + Finished + Terminé + + + Queued for checking + Mis en file d'attente pour vérification + + + Checking files + Vérification des fichiers + + + Connecting to tracker + Connexion au tracker + + + Downloading Metadata + Téléchargement des méta données + + + Downloading + En cours de téléchargement + + + Seeding + En cours de partage + + + Allocating + Allocation + + + Unreachable? + Injoignable ? + + + MB + Mo + + + + Unknown + Inconnu + + + Complete: + Complet : + + + Partial: + Partiel : + + + + Files contained in current torrent: + Fichiers contenus dans le torrent actuel : + + + + Size + Taille + + + Selected + Sélectionné + + + Unselect + Désélectionner + + + Select + Selectionner + + + You can select here precisely which files you want to download in current torrent. + Vous pouvez sélectionner ici quels fichiers vous désirez télécharger dans le torrent actuel. + + + False + Non + + + True + Oui + + + + Trackers: + Trackers : + + + + + None - Unreachable? + Aucun - indisponible ? + + + Errors: + Erreurs : + + + + Progress + Progression + + + Main infos + Infos principales + + + Number of peers: + Nombre de sources : + + + + Current tracker: + Tracker actuel : + + + + Total uploaded: + Total uploadé : + + + + Main info + Infos + + + + Torrent information + Informations sur le torrent + + + + Total downloaded: + Total téléchargé : + + + + Total failed: + Total échoué : + + + + Torrent content + Contenu du torrent + + + Options + Options + + + + Download in correct order (slower but good for previewing) + Télécharger dans le bon ordre (plus lent mais bon pour la prévisualisation) + + + Share Ratio: + Ratio de partage : + + + Seeders: + Sources complètes : + + + Leechers: + Sources partielles : + + + + Save path: + Répertoire de destination : + + + Torrent infos + Infos sur le torrent + + + + Creator: + Auteur : + + + + Torrent hash: + Hash du torrent : + + + + Comment: + Commentaire : + + + + Current session + Session courante + + + + Share ratio: + Ratio partage : + + + + Trackers + + + + New tracker + Nouveau tracker + + + New tracker url: + Nouvelle url de tracker : + + + + Priorities: + Priorités : + + + Ignored: File is not downloaded at all + Ignoré : Le fichier n'est pas téléchargé du tout + + + + Normal: normal priority. Download order is dependent on availability + Normale : priorité normale. L'ordre de téléchargement dépend de la disponibilité + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Haute : Priorité supérieure à la normale. Les morceaux sont préférés aux autres possédant la même disponibilité, mais pas par rapport à ceux qui ont une disponibilité plus faible + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximale : Priorité maximale. La disponibilité n'est pas prise en compte, le morceau est préféré à tous ceux qui ont une priorité inférieure + + + + File name + Nom + + + + + Priority + Priorité + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + La liste des trackers ne peut pas être vide. + + + + Ignored: file is not downloaded at all + Ignoré : le fichier n'est pas téléchargé du tout + + + + Ignored + Ignoré + + + + Normal + Normale + + + + Maximum + Maximale + + + + High + Haute + + + + Url seeds + Sources HTTP + + + The following web seeds are available for this torrent: + La source + + + + New url seed: + Nouvelle source HTTP : + + + + This url seed is already in the list. + Cette source HTTP est déjà dans la liste. + + + Hard-coded url seeds cannot be deleted. + Les sources HTTP codées en dur ne peuvent pas être supprimées. + + + None + i.e: No error message + Aucun + + + + New url seed + New HTTP source + Nouvelle source HTTP + + + + The following url seeds are available for this torrent: + Les sources HTTP suivantes sont disponibles pour ce torrent : + + + + Priorities error + Erreur de priorité + + + + Error, you can't filter all the files in a torrent. + Erreur, vous ne pouvez pas filtrer tous les fichiers du torrent. + + + + Downloaded pieces + Parties téléchargées + + + + Collapse all + Tout réduire + + + + Expand all + Tout développer + + + + ... + ... + + + + + Choose save path + Choix du répertoire de destination + + + + Save path creation error + Erreur lors de la création du répertoire de destination + + + + Could not create the save path + Impossible de créer le répertoire de destination + + + + search_engine + + + + Search + Recherche + + + Search Engines + Moteur de recherche + + + Search Pattern: + Motif de recherche : + + + Stop + Stopper + + + + Status: + Statut : + + + + Stopped + Stoppé + + + Results: + Résultats : + + + + Download + Télécharger + + + Clear + Vider + + + Update search plugin + Mettre à jour le greffon de recherche + + + + Search engines... + Moteurs de recherche... + + + Close tab + Fermer onglet + + + + seeding + + + Search + Recherche + + + The following torrents are finished and shared: + Les torrents suivant sont terminés et partagés : + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Remarque :</u> il est important de continuer à partager vos torrents après que leur téléchargement soit terminé, pour le bien-être du réseau. + + + + Start + Démarrer + + + + Pause + Pause + + + + Delete + Supprimer + + + + Delete Permanently + Supprimer depuis le disque + + + + Torrent Properties + Propriétés du Torrent + + + + Preview file + Prévisualiser fichier + + + + Set upload limit + Définir limite d'upload + + + + Open destination folder + Ouvrir le répertoire de destination + + + + Name + Nom + + + + Size + Taille + + + + Upload Speed + Vitesse d'envoi + + + + + Connected peers + Hôtes connectés + + + + + Seeds / Leechers + Sources complètes / partielles + + + + Copy magnet link + Copier le lien magnet + + + Leechers + Sources partielles + + + + Ratio + Ratio + + + + Buy it + Acheter + + + + Total uploaded + Total envoyé + + + Priority + Priorité + + + Increase priority + Augmenter la priorité + + + Decrease priority + Diminuer la priorité + + + + Force recheck + Forcer revérification + + + + subDownloadThread + + + Host is unreachable + L'hôte distant est injoignable + + + + File was not found (404) + Fichier non trouvé (404) + + + + Connection was denied + Connexion refusée + + + + Url is invalid + Url invalide + + + + I/O Error + Erreur E/S + + + Connection forbidden (403) + Connexion interdite (403) + + + Connection was not authorized (401) + La connexion n'a pas été autorisée (401) + + + Content has moved (301) + Le contenu a été déplacé (301) + + + + Connection failure + Echec de la connexion + + + + Connection was timed out + Délai de connexion dépassé + + + + Incorrect network interface + Interface réseau incorrecte + + + + Unknown error + Erreur inconnue + + + + Could not resolve proxy + Impossible de résoudre le nom du serveur mandataire + + + + torrentAdditionDialog + + True + Oui + + + + + Unable to decode torrent file: + Impossible de décoder le fichier torrent : + + + This file is either corrupted or this isn't a torrent. + Ce fichier est corrompu ou il ne s'agit pas d'un torrent. + + + + + Choose save path + Choix du répertoire de destination + + + False + Non + + + Unknown + Inconnu + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 disponible after téléchargement) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 de plus sont nécessaires) + + + + Empty save path + Chemin de destination vide + + + + Please enter a save path + Veuillez entrer un répertoire de destination + + + + Save path creation error + Erreur lors de la création du répertoire de destination + + + + Could not create the save path + Impossible de créer le répertoire de destination + + + + Invalid file selection + Sélection de fichiers invalide + + + + You must select at least one file in the torrent + Veuillez sélectionner au moins un fichier dans le torrent + + + + File name + Nom + + + + Size + Taille + + + + Progress + Progression + + + + + Priority + Priorité + + + diff --git a/src/lang/qbittorrent_hu.qm b/src/lang/qbittorrent_hu.qm new file mode 100644 index 0000000000000000000000000000000000000000..6dbd7ba97601cec264d95efcb4c92778f95e625c GIT binary patch literal 66147 zcmeIb34C2u)i=D`%yTD7DYYCzTS94*&XkZA+N7nWQ)pA>=_a{JF1@)oy+hNMQ2`l6 zMFmAfMO07(6ake7MFs`L0Ra^ir3`8jczi_h6$ifmf3I`)8ShQ1Jm2$v-~0ahYff_S z*?X_O_S$RSYqx!^cgo}cdBaD(fAF+#o%QMapIfQa#IGr(@OX~2Qxk;(} zzKiF_lxq3AQWfn=ExKB%rt|RL5lS77@7FJrXAbS=*DH0z>+-zp%kq4@S*c@hR_d}} zD|Otvm0FyV=a)W&=fg@}_&udI{22XxPO0Phd{n6|e7>U8i5Dq#*f-^Q+IpoUVoN6b9bte7YXN?s`PWaFwRF+=?_bl z>Yb`epZ$PRjpwM+|NNO!1HYH&mA&%(;civ7W-br&h1g^{&i~heV9k=U267^X5x9Wn*HiLJTFxXiMNjrsYUwv zl3K#&4cDk8Kl+AJ)>w7ql#7*m`Fhp*ef)jYB(>^=i-5l-wfbVL*%K4hvDZGVRLwQ= zjNPr)EZGBmz8B9I@ca^YZtx8x&AedQUo;i89> zI)9<+yuMedla5lIpQ}>pcb`RRo6wJ zsk#?c*JE#>zZ=yFSA15fcW+iFT!nGsDWt@ z`t9ZFr1gJNYUpKk(iLxGT`!jBahJ;Tjz7rrgZ3;iztif}O_%*p zsob;b)^nySwf%SMuFnCUflsQh{}gaOai+Sz=@F&A)1n?s9H-Rq0`>68cpkk-J$B10 zN?p0X+H-CR_Q-wmeBo)e=iAr=%b!)ReB*4T<{Y42{Q~fL(Z|$V-)dFr2me(6*pBa4 z{$fl+!&6F4svcvlxES9bImUYYEv0Vy^_YWOzOK~%uZ&rfIR$ie-k9}ehhV+(W7a>@ zsMOjC@;qs~Jb!!KnD?KLb@VWqD6(3pGH zO#@_eyr%)Jd8mHOhwF<<`~_Qff!V}9_|3hdc$jCu0aSFs*LW1iXe9^mWw zF+W*_@4x@dm=_NFm{J$~Wz62scPaJk17qGk2lE&|ZEWTC{eYkB*xH5XE7knQ*vUZK>g4%aLO-o7Kx-_IEPp4ib!Z5$qZ=`HUA-xxdgvKxM@)O#n7z3wlV z|CY7#+z}gl`!f%L=iM^)-sgUx)aoye{l=PlrS7?5>_gwid{Isq2@H{p%xG_qw}EN>6wR`yp3SefvzT>p3MgX?)*uUdiF5 z?^kNm-6iu+xJ{|czbDVfKT)zIjrs34rDWM@?O3lXAI<)xARL*%K|^Me_V3f@9tIVyX_^t`|}V}B`Ca>b2zfp?!y6GmRexgdt9!L8{y`{6BycztwtF&e2 zZl!L#y!40_Zz%PJmeOVS0?tEHr6;UyR_beamY%!{&#!MNJ>~cpz!yJXnmrfqegBfu z3o5>;)Hl9c`tHyC67+Ir>7`qN=O>qyUUf&eQnk}cKf3lmfcIVcDz&ww z^tL&lRjQ|4o|(56-Llf(w^Rck%S-?8?PjHR|D$Zb zRjpX>m&+Dk`%m!Ky0R7PZ^C|DT-H$qyfi&rw)%&l>+}1|)_wV5rTSLN^Ulwdo$w*> zzr;u7dDVD%KK=Ew_`Fq0ojR>7`RYQYGEd<7mQroA%TnI}KL6vYvhCO0s??zsWxLXk zgCBpe?1B%1et!0B*+mz|v474fyJX5=u?{oKE?ajx=<%~y;6c`}<@x0&Q^{Rdc=Q&*QC z`@g0Fe=n48xEtdvd$j!I%eR6reyaSm|GXG{WmS3h$j2aWzEeJY@E1Tg&z0|f2=iQ6 zQhrW(3HZX(<>&5%96#%W<(FNEef!`8QF2eCe9mVaf_H@g^*_p%Af4R=iBd;=g#W#Cw~q2 zZfz+4aVOsU#MR|b{d$g4Hz&%UoAZoPt2USa`a;a7zOMY``Jk&?ua@U?N0t9qb{O*W zuJS+b|DsZ799;fZ|9ik6zgjVNA@<*=Z>^|%6zhNQQ56&ZbdFNDO_b;JXID(#dK~cd z$BL;hW8EJ6bjAD{jQ`0$S1i5lOwh>_6^Uj4RO-k-S0q-T{ZZ>GGFN^B`(bxQcEWDR ztK;PP)6**Qlh0S`{Wn+S7xY69y0l`)Ex`XT?yner>T0EqdA4HsMLrL%xabRSVVw@E zxN`D*r9RqTan%p6!#+Bv;=?7N-$&L~d}R4v$kj~6C-?phdh}TppT6c5rGB}g;xm6q zV1NC+;*RNnclVfzJI8)VsXMn++;#dHN!-)j{w zodS4kFRA$5a0m3Y#TEa!<@?azmRDBa@iOGgd6nb;bUfs8N#(ny0KRYCQ90+0v{Ida zu3R}Y1v&j+l`C&uk9GW+Jb&=M%JvI5|C-7Uy}ur-Tz41RU3XLErqo36=buz=u7iGA ze{1FDZ@qziP*%BX9_VV-{gu1k$b!y0Dt8}n2=H<-o|xDB52`#jcaTz>pRK$qhk0~- zukzaISApKkD{s09&+O}!x9&X!c)z^zj(hHc4Y0NHYhMBWzV}4seedal9=M_Mz8A3H zPky2D@rP!Ep2y*d`M>AD%Ky3#^tXR`RmnjmX!qNy@++~PPp_>i{|M;&j`QXDlMl-C z)%L3K3y)OlH~Ffm+x`Ul*j9DeRc8avMO7_-t_Od6plZ=g*e9QRyQ-}N__+DcRmV)k zIOpZ6jyVJ4pK)f@%BfhNhli@xKC(af<|nJVz5x21zPRe-Js(E9Ox5YhYRH{URcBoO z6!gXpdEW6gc|LZ8Jb&`IJYT)EYWtYyp`V;wmEXGx{O{$eotNAWIrWdK^V)Vpp8c%q z!nZNr%YUf4^eEu%+KE-S?|B^SysqlL+a6Ntl4(^B-UWQmKC9}XucH0V>#Ba7oCrF; zx#}kuVqYBfXw^?Xg=Z#T_4D3eDRp;K)$66$U-1XzdB<{jzObz7kG(S?zs6Vn^QrTp zf1FsYE`&aFa#?lRZ~lULPOGkeW2aKTf24Zyf|mgA_0>(^ZHB$Exq9Kjpo?>Et6nt) z^PRl9`lMf!L9V`BecC56-i?2(j(;u=`8>C}?+M`b6US8d|MLLov3FKyn}F~7-&bdo zKUeC&|EM1R?qcwbCDj-G6aAigWA&x6SCpDHx%%?cAxARJ)gL$m-%tNX^);XFfgT&L z{?Nt1b5mpWC#GTikBqPW^ww7JuTNCp@*j9U_s8nnm%jx*b*ntDesA@i-~9sUqOAI! z9f1E=hgaWw&yAQ*y!x4!(9etyRKIjJ^oqw%kmuezs(=5JM}Yqes{b$qeXjMf8ub~_ z_ZP0L8GHR0@QcBkvESbf`TS5#$(Ozfz4pj08y##PBtQq9Elj~~IU%di!a7N9} zJm`JWsWs*M zXWRyU-BR=Qy>}^f@i{f$oVE<~aB0oMA1#4C@_Nm8PWmJC=`r$r^|6{KP9IR}m4|Ac ze|S08fPH#X?UQeT zA8egl`*h<*r9QKy_USV*ufEULKKEb=hZsyew zDRuhw^8EZMbxWT4C)TsHZcWQu(2w3#ck1mkV23|gcSh^uus?R!^>SXPKUo+5Oe^}o zsV;dfzCYpKy7NAqg*@L_cTv^N;BS-au3Ga9_~DCnH@pCRte#r;#oC-wPd!j~*KbaS zy}G^b;YZt`Hw@H0mD&${@43349&|q7RCPa_0R8HF`^oc_F?Daf7wvyFP+xn(3()71 z^|fE;^MU&Dmtj7i_)Y!vgKk&qnh)16X#(6ATvC7R$FGK8=aceW`@8z%-Ua+$azXv3 z^Bw~~SXsYi8vdSk5}v@*w5#QLVrl)>Z%>DQx1|1*G}du(bNyNE--MlVTm7!zE`+kyF8NlC+`umOoKJR+9{)xB$fqg!y{^cJ}1U;Qz|Js|-U#@+v{*Ot#*Yn=` zx8wN!#Mc`d-uDvh#@{#WUz^3gI=5l}dOTb64SM}9ezsxOk9uK$jB7ab7Qp?1BN~qU z=$~Ns)--gShIKh|a>KD-#=d=YZ^KEy09^Z>*l@u~Z^Nhc+lDWG|1;35f7EdMkE(#T zX$_CHY=^(#jfN*)nWNOMiyMA;T@3WMv*D?WUP1qNG`u{3eiPH>dF6HTe6ph9cURx4 z)Q^`o{Na}?A$Qvw-dqj3J@LkbQm=myl&U7F`RYiuR4rC5YM%XbVI{s$<@jGcZ(+;4 z#VzxXT)Made^##OPUmwS$^J2DTCqg6se@IA+N9c5mpWN>s#VHTYw-I9wI089s;zJi zu2*aEy`>t}Tny2oPE-r=H-GEEn;pIui&Qg!;CHLkMzmn70hPnQA=RosA6ER=jQcGqwv{zdQL5P z(;1UFW|5|ZxLoo_1W{7i{Cis1mM_(u@1!=#nsvP>;#p^dt2~Z3at;- zW4f)fXt7&Ew-oT?0^bhfn*`R1xNFrbGcWLl3w0~{=gJOZq$J*QR%<8%YQ94nNTAJJ z^qt1otyuRVtPgSG|DLlaHKp-+;kUS2eHzX}{g9rVxw!Al1%>1QMK_>MW2Ls?cf!?+ z{zw}fkuW)HAO2RL=6qM8r9hg|E6w&6dL(VIx2&d=c6B)ZkxF;r)1=y=zvEhR#W;^F z)+DDtCuJRvow5i|`FxvtQ-8Y$Ban(LO)W$A-uOQW+k1g0*>~N*7HN;Wi#VUFF+Ozqg~mA*_!}GnTqlEdVXdQ%lgl{B|T-wqtkj zEsn-E+_x5XUmnyN$4Ys7_5UusA%(ZyT_n5Or8QC^c@?40VH9#La*{lr{4RrekXqyR zjyn;*ala(-E$7;*slyp*Ia;>ib4$a_{lf9MyTiPCJNgMzv%|ef?QMXY-0hv4f$(MS z!weulL}PogIs#)j^ZQp|B{y{-72X;PtTx}^4&u|{welCoqf}b%2-lKp+Yav7)ZTS+ z=PGMW*M{|0=hl_$*S1@Yb6Z+YT-e^y($Uo+Uo2{#*V3|TW24nLkjo9VwzLcn4>u1l zY))tTTe>#4Y+ltqcOW;ITr{sGo6976a?QQD-p1wCZTxU~+dw?lyS!~Mo{L$j*kF8F z<956=kc;okHCjFCR4$&%Eo+?LXtgYF%jR|^<5q6h5Z>YoEj`&RIvSc|B@@;;*6=_g z7oVFQiuJ@>t)WbO?rl2 z@v~zm|AZ`h+7@`!T4@(i#E_f%B+OOS8u#0or&cV=~Szg2P!kkL@Ex{tw|5Yt$Z?b-fQ*yrOzR=@<}E%V#sNLsB+#o3KwC@9 zo;a7Lt%U?j>g9$BDY{_OR23K6TYWjie3W>WE$?i0yzOjsbzs}TLJYTjyGubBlH)Cm z7_AagM zhgf=33osXq%Jy_VmCHmyQ4jlJuGSc-`?^gkR?QuZC6WN>KWUB4eGA6 zr&83G48#X+$>qs!$vb<}gF|^RCM(+m&KiZTX=&1*A?rLQz(!$)$MfNi8$l%8f~5Z(cmT~aqK!+F)Jx)$LqkV;IF(Gt zC@2OKIZYS`tc2hgPW0vmRwN-CHEKE%v1D4?{;)LHp~IEbhYVz8>k=zlvIJ#>#uL!k zg@eSFGM!XyO=%$Fy`$)823C}I&*-LEw{>XWCfSGyQia^6@y1~+5O^nk_JD+_ly5U| z*Q}%l0nxvi4~8&AbEu_R|4Y&WAIXXjd` zutA}s8z?4v_&Jq3LJ-w!@#U-USic@}zayTE_s4Q^I(t;TY62Uffk21FVP?egrj6-T z{4fqu?xBw_KxB49U~T}C`W;aQU`dE#N$^`si>@6&2$Ab>8zS7on<7WL(F1L>z0j-K zdM|bitszUjg?_~r+lEh)_-APVWq*^~(AQysyb6g&Zjfd(l@5sLjp-bkiLFwzYVtr&&UOXqVRwka!#WJ~gZ*ve4joN@40&oOl8-7wOiV4o) z_j+i5{}nw{o}d~p zcL!Dy#A&TgBr$x=hbz9g~~egoK= z?7cM5XRkgK2!NQ?T$d|IH0;Gt{GDqnh@s4N)|l^eHDh=)hju&gyHJD6&an9~Sx|`q zs%=Gfo5mer>Px^}(8vTn<2#{)4-dpsz^Y+%S;(ENl}hKV_~1}(R}dSMZPwz)>lx?Nd)@mMYo_=0^dEzl=jpAMChIgs9yj!5@W=>eWmV5;qeO&ZVT zK>DGvW`R5B&`S)=3Y-~`589B&@EP|N)fbo44sY*RCAN>%)Sez31d(;bv)f=QS*ubz z5}9;rkmyb(wuM>aF}7q**!|LhM2$~?XjALQO@YSj%Nn@-Q~USYEQ;v z5Zq}fJYu>x9h;)96*=w_>~AtfjzY2|&*1NL9SUQ%Kv?{pBnI^e8w@0DmcOn&na;vH zkhXG}Sj2u=hu#Zw49Yc|Q3Myd8R|epQvj#|0El~l5Jx(=Y;C;TWmYtoV9yi4d>N0R zznr_#XODEO>9U5>8Buq==_wtFY>Zq#y9-A8pvJS605=QHs}gh49T-?D?WS65@=j(Yj54wl zx_l`-`+*Enln7-qpOj(D4l@?*CaX~f9m5RLh(U&uv0YYAUfdwrp*W@w^*xu!0c>~` zf{-=?m)t($YnCpH0APli=nTazMK?-B-;5vmd928k-9Rn35F-vGcWM&_r))-Sa!0g% zJmMR(=s?MGSEYv{#avrR(-y0n1{4hzvi@G9h|tMOC+!~WK9IB-{*aEe7Dif+a5;F) z%h-d+ofR5cbbJ~`uCQncqYlO7t~MAPKxixPyX%Yey(q%aaBrhLvn~z zJU5)qY_po++yYC7mJWAiZ%E%=0y<}`kg*?bqxD$a9{kPa@5Co`qR^Mm#itjZk(!Lh zxpSaBlim@}gjnr*DB>$X`*YFr2K;xqn}x}9(hje(?OePu@}wOI zHm>NJ+qt1rvqm^nhlV0m#m!(VTSnFI1bb$iw`{Sp`5|)LARVtpptuw0d#9!{#U65N zXR7!-me?*BGRLq09vNo`*aMvy@3yvPv1V)GPS5ngKOUUoBA?0Y$TG2XMjmIfJ2C0nZpV)!DpCYsOAG2>v{iOu z!h?W8qyQs~R1o=%i^`eySc9>hiNXA!mC6rxV>hJxyyjsDy_H%w>r$Nt38ibgx;leY zGR1ifYXExDj8n5u)2xQgKp7cu%V6tqw#Now3#FM>RmK<&wkhr%@h(p-Sg{j&chOO` z9aLwQ|DsmzfDQJN z#poi48^t3VTCGI^ZOhTC+);{A$dtf1j%6A#4EJ1+=)8^qv6H+mKNs`+2ZqUOk6(B) zYd}-4K}?Qj67=?E0TWG-4E8V006H*qN{6AQ8P3Qq?ZY9I=t;tbG=#m-2TeIN*{*+a z=h2())qE*I!XV8Kg9KZ`@z!Xl>}3c6w!VO4RY-_-GL>qVphgGK;bDMefvjvYofAA2 zf@l$T&PdiPbw7I7Xu46FxR%Sf4T%(7+q(;zud|?nq`>KR`b=%^BH9pC*R?`vmV5sV z>0F}EvAVaW5<8=f?ipBNzdG&+5()xlMfl~IQB zhNYa)7QGuTx1HRHTn2c~80LVZ7ye%A1R*11G8|IH+)Xv;rZ0~CfSzz$PR4dynKdZu zq)#fi&b98F9t4)_cSAETN75q{anof9wCrGqYvdiQT#%1(4^y9E(9(6!x>!pnIzPm8 zN7|to=twnnS>b8I!xT7PT0aT>v za-xAj)N=dLGc(onb`yxS&3I%;D((urPL09I2b zzC90Tr3qDqJQ%Y;V9YAu%1}1Z5Tu&zjj4HMRl^oWyezPBEm%WlZde zd~n0+n63d}Dx4`cd!o8PKiptEn}tOc63U%mprW0NR_eG`$P;L%i?u+W;Dn9c_>m-% z*j!aJCSbwM^)k0%EbHg$yf$jbUYIRYI8xLhy$KSU?xAK)|q_4wexK~0)Ago`=)-FPx8OZTXMO=cAxcNiY9EH#24;hY5plp^cKfRMXZ7RgQGzI2F(E_^o@7zA;ae;WYAu&Uw}qx)kZ>aez} zuV7Gdy4|mTnr{FJOv!V1PZj%PYHn!%jMF@s?+c4_+ti(q$mZeQ(P6((yQzi!nuff~ zwbL@R(PxBMlEyLs*n>6f)uP+gocBACQT14_7X2|t2MQv%68wmy-eU%@fY?B~SBP3l z!Oz`)}hz2;E2_5XW1bO)3R(c(>IC^%S2D%R4sa0c)nr4bWl%?G~2R1 z9*6QR46z6R8?;IRHNvzn-2!(((eWpQWuj?axfKq{5y@eJDwMW66Q{_;EO9kJuC$x2 zw7)k6Y36)z0yhDv;6%%DR0aPGm?h24I%BDRHIU^HZ9JoCReM{FcfJ@Gs9wc>n#KR`vfhaZ z`y+`&vWq-{)Tn;w^G{%l?!~qwyP_WA_Jq7kDCA5*LheqF#2=!1nI7ain(cut1U%ZF z_^w_Iz3ZYnoB*M`6B83xw4WrZR_&zAxd>q}HA=jXV!u!ghNWQEpo+w#&zcmXhJPjS z<23}M<}?-DzzzLS$$JBGoWUtqT-DnlA4ndi0TlvI=e^sM@2*y*G!{EP3W5n>?t_J} zx^{2`tTK2ffh9@C@smpB22zOaM2H%EPKZV<M+i-Sd=C9l$r^!CacfYJ_F^gb zqAzd4PsQeV7WQPp`Bj6-F+c|whnYob7ig^z@bo8m{rGNTv5VGv$KumDHU-B%O=ru| zxk4ukJtN+LHjOWOYH0#6C6=)dy1T_FV|b7035;lxPvNwOZY`1BoI2XfX8sB|W_G3X zh~(S949Ae?278E^3d0$k4`a5a-d);>dNij#-Y;F8l<3($F2qon@Dq9<#5Qu6rt8SB z7w%;B;XnpJDAN0k5qrl{nTd_J`_1Ni;JwZE<#jT40l>)sb@~->MZ5(S`dXXK7@fXA zKYrTfWHs%eM;`meVN(O%BtPS_;+c$`z$wu46yHvB;^1CKLY>Xcm=7#^c!93Yf^w!q zJvKw64~koCP=D&I6kQ1XhUelPxxy6{B3p}d0-NxyJuUpkxC*scZ~pZH2c({KJ_!K= zxrn^$xE4ncD7}bP(5IEM*0yXC3~1fu9f6xM?spdMgl72r4)+4z(gpDu+#w_xSDl;g zU{H{TR0Jf38j3E4E&r%NY>aYLnesl2I@>2PN67(1l8%Z4c;#_a?>-J-_v_-T2y>aO z9>dP3UPlRG*p%K9t`eg8g4x3p*QO94fj_oSD`!SQDnP&E)X$;2cy^xYsCr|3*dxUX zw4Y;JC)}B2_p*kP2MM+X7Vp}~uI@Hvlg-EN=$y%;FM^EaP;%*z74?=DDRCV`|72&v zE$B%mf1t&RPiny_ zxx45P8xCZ*_9Xgt0TAkoj&nmpRctFY`!=w{dzs8kOTa;m69#d4{Qg^T-livK^?J<< zFy|teZ^RmlkRG}F{p{{ReVUKTW-ZeB>Hy<+ zjzs2sHeL*bspyObIm09rb{>V@Y|r{$pH)``!}SGvsLu$@|5*HxXUP0SJw$Nbe}^RY~C0@Av3!Ah+PYP?Pm3Dp_Pz~|Y8GvKja4cKZMFyT+0+z5bS zL1}g7N-id6z9O_l&pJ=XG2diw>d+jrw&9^9h$#kQd#%BAuPkvPP?#|$>dG3--m8UG zQSn&is9uHI7tbDpCMN-7u8Hr2-Ry{_6~#qxRuqdTug z$eKbe(j^$(#M0(p5>lIt&oRF|iE0K8*mOBK?Krs)3ML( z7~SO*d#7>BJKa(`yBm5McFO=XN0Zv%_y(X8=uKR5?AEn<*H)@oSZ3G)27r=T8@1Ec zyi$!<)@oVcvZvBnCku1)ytM*bJcnXN^G#P}E0Vdx=aYv;ytcsq+JXYFE%d*(u)u4J z{I4zYy>^D-2d?=-#4%fh`k$CRDf~u{p{O{1^}_jvytf%|YyznweHOpXRPIFPt?*bj zRvPE*dA5iltehS5ojJd`+S&{qi3K)h`sbWPU{!M~^csY&3C0a&mFTIC8ph8^-#Y*` z%{j)=k5-52te8VJksOM?q$RZ$$(->!p$`Yl+7>nNHo7hDM>Q|0{QwG|!jXpA=({|ZzhF!E=bcf_NuxpTdh27F>^wzh`6>9@22$lrun zGjK)q(R)r~f~_vH$N&>zN2Y|`d)*Vlwmjjc- zlY`{JdC7O>0IKj;5tH*Z_ZKeAN{U)^dUTd%qwkwdpbgy^vW_!JNXz+isQ%lM)33$U zLh)u!P7>*^TO6+`*V=j_+$7B>yM+o(?0lXl#aob*<->V%RDO~MQ`-9OOA)91*sW@~FlXUj~# z0yWhh)j_J{1hX9G8>YWH^hboj0Si}z59k@8Ad}k>1D*bQFcXjxp-%|w-b`^ALv2%Z zZ^e43?O0!+Z5R@Xmh%(@_pqiiGo|qzPTdEGVfd!CFQ-lo^b4TvGYiFkY>t$$4tm2z z)WhAPP61EYtiF#oPrz?3ZQ!h>bEM8Ck=2_vx3B8(QwdFq=s|+yhBJ@hE<;o|y-0tc zH-oVKBYWHE2hJ&x;aCwm+~)D;Az&(|t`FIxHLpF09_3+L><@e2n0Xu!b)FWxF)))g zpu|y~*ToQpwyS^lH%1Ozm>o2OV*F=%M>o!X8|~w|g}a_J>aM*MFe%(|0BP?*zm6}A z3|tKGus}l8Nn1Uuuq~zf0S$8sD*svSsI)r@1=s3wgGNm0@&-QEY)r%E$k2W2$gE*g>Njta9IdA;>ZcG;tEtc8^nZSM4cj%HmTpFw>C-b z0&5uOQ;;CJ0|tm2=t%DJ&wCtXOkACWQG)wvTxa|wmtzIDQK8c)22B${DBN23gv_VO?g8lb%jYL%4Jkc#!f({ zS}`fj8iypTVtv$Z?JOXtn>zv@*9q>w$ADO)(4gANnYY!AEC7 zpyZ$jgAw$|IBKyZm3xonlTy2&(+3sh8D4;}MRAt_^1_i)z|5>xtE)YvE>D5;atp*3 z84$fk)GT#=ty!J2S*v;zI=`oSLoAUx5ppIytbL<&eA>}D&)a12T*aujx1ge3zef=- zo3$pM)W>3iZ;xCeHrQf1gf%TYmPV0S;omVQp79~oy27oBC8dxKoz}^5!Cq>y(8RaD z=wJn`N>gYsfCa9EUobivx;?hRO?^A;Gdjt{*%^f-CJf;K?3m-h#k&DE`L|dwZ(@14 zK$Lv`361ZF_t5a;d6GmL2}=6FWq4v;+M}y$Iv9}38K22TuGe&E^cw%!b{%d3{uWl)R2x#5<+ZRVb$y)qojS;pL$Krj5h{1l~ip2rPALmg-o73x4z`~J1W`YAjz8#h0E41h97*1hkaUsAiLkhagbf(A z;xz0nYx}ATyT_mfl;Epn4XE5age%U#<43J6dYxdtxtJ3Y5;zqk7_&}Lcs$! zh+x8_<*8#Eg|2!;tUO0A4VY#6uw_(>=>d8sMY+dL-5ixF-9sT-ZVWMdAu2A{pw23F z>-kJ@G+3Mv@tl+mk~a(PIu?V-eL1B@rC#4lVJ62DQBbFG5Dkw=TBpj-vobLce=c2v zdjN=$afBljlOLzq4`N@CIlF07nc*td_Tx$dJ9Zn{maHpK$;54KSHdVfa=pJIrD<8d zQD1~muwm&bsJ#1sZ)N)b|E)}0KwQP|VVaLyPyX*sO#kjpOvUb|p>9KY$$Pk1ZPK|D zYKgvYMsBY1>%UI*Yxfoz-lOCEMYoP~cUSOMF87;Oj6`uy$5fAfTTc_XVP5O^w2kP5 zlQPr%D=01HFzsO&muK=>+$?3^STo9-YsSv~Kk(+7(3Lgw=lySgXN~^`6@3wpeZ9^S zT(8r(+?K&v_g)s?l`Fb|oG?xxUn$XpCQVY9e6B7`PUG3ps}3_)t3+L>!ooD#ET;R0 zHi>xVSRh*>UOa;$K}Wy#T*sSfbg>!7PBC4v)B)3Q3L0(Z&9Gt;+!L-~cMs8dEK$?b zq$u!>aMsC|AvkBj9C7j&C83X%LYb{5>Je+2dkw6H4KWlPWqt@xBug5n0bsJ77S5_X zG>Yt!;06Rq4%d|ksUw(n)9rSm)Fyy7vIt|CnfBwDT%OH$XL~XU?KAfE(rEYMtf8o> z9^=e&W~EO1wo~!pYzQO&#$mNSo-K4}PL73{IZgp(Nm)|wi8q*^W_IR`n)ve^qFi7a zGV)Et&}YF?Z(Jo>9;BBPlt5gC6L2t0+-#RX;_)}!zZH+ksdWPtZ+-}zN;B}3%b7GE zjz{D1b^zxQO`b`VQKy;p6h|MyQtdtcT_6V_v{k@Zy@gIslJHXCCMF zDCMJk{T5CpEXQ
  1. Wft)#_6ff{ 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 + + + + AboutDlg + + + About qBittorrent + A qBittorrent névjegye + + + + About + Névjegy + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bittorrent kliens, C++ nyelven fejlesztve, QT4 eszköztárra </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">és libtorrent-rasterbarra alapul. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Weboldal:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Szerző + + + + Name: + Név: + + + + Country: + Szülőföld: + + + + E-mail: + E-mail: + + + + Home page: + Weboldal: + + + + Christophe Dumez + Christophe Dumez + + + + France + Franciaország + + + Thanks To + Külön köszönet + + + + Translation + Fordítás + + + + License + Licenc + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Qt4-re és libtorrentre épülő bittorrent kliens, C++ nyelven fejlesztve.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + Született: + + + + Occupation: + Foglalkozás: + + + + 03/05/1985 + 1985/05/03 + + + + Student in computer science + Informatikát tanul + + + + Thanks to + Külön köszönet + + + + BandwidthAllocationDialog + + + Upload limit: + Feltöltési korlát: + + + + Download limit: + Letöltési korlát: + + + + + + + Unlimited + Unlimited (bandwidth) + Korlátlan + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + qBittorrent konzol + + + + General + Általános + + + + Blocked IPs + Blokkolt IP címek + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opciók -- qBittorrent + + + Options + Opciók + + + Main + + + + Save Path: + Mentés helye: + + + Download Limit: + Letöltési korlát: + + + Upload Limit: + Feltöltési korlát: + + + Max Connects: + Maximális kapcsolat: + + + Port range: + Port tartomány: + + + ... + ... + + + Disable + Letiltva + + + connections + kapcsolat + + + + Proxy + Proxy + + + Proxy Settings + Proxy beállítások + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Port: + + + Proxy server requires authentication + A proxy kiszolgáló megköveteli a hitelesítést + + + + + + Authentication + Felhasználó + + + User Name: + Név: + + + + + + Password: + Jelszó: + + + Enable connection through a proxy server + Kapcsolódás proxy kiszolgálón keresztül + + + Scanned Dir: + Megfigyelt mappa: + + + Enable directory scan (auto add torrent files inside) + Mappa megfigyelése (torrentek hozzáadása automatikusan) + + + Share ratio: + Megosztási arány: + + + + Activate IP Filtering + IP-szűrő használata + + + + Filter Settings + Szűrő beállításai + + + Start IP + Kezdő IP + + + End IP + Végső IP + + + Origin + Forrás + + + Comment + Megjegyzés + + + + IP Filter + IP szűrő + + + Add Range + Tartomány hozzáadása + + + Remove Range + Tartomány eltávolítása + + + ipfilter.dat Path: + ipfilter.dat helye: + + + Go to systray when minimizing window + Panelre helyezés minimalizáláskor + + + Misc + Vegyes + + + Localization + Honosítás + + + + Language: + Nyelv: + + + Behaviour + Ablakok + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KByte DL = + + + KiB UP max. + KByte UP max. + + + Preview program + Bemutató program + + + Audio/Video player: + Audio/Video lejátszó: + + + Always display systray messages + Panel üzenetek megjelenítése + + + Display systray messages only when window is hidden + Panel üzenetek megjelenítése csak rejtett módban + + + Never display systray messages + Panel üzenetek tiltása + + + DHT configuration + DHT beállítása + + + + DHT port: + DHT port: + + + Language + Nyelv + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Megjegyzés:</b> A változások életbe lépéséhez újra kell indítanod a qBittorrentet. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Fordítási megjegyzés:</b> Ha a qBittorrent nem elérhető a nyelveden, <br/>és szeretnéd lefordítani, <br/>kérlek értesíts: (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + "Torrent hozzáadása" ablak megnyitása minden új torrentnél + + + Default save path + Alapértelmezett letöltési könyvtár + + + Disable DHT (Trackerless) + DHT letiltva + + + Disable Peer eXchange (PeX) + PeX letiltva + + + Go to systray when closing main window + Panelre helyezés a főablak bezárásakor + + + + Connection + Kapcsolatok + + + Peer eXchange (PeX) + Ügyfél csere (PeX) + + + DHT (trackerless) + DHT (tracker nélküli üzemmód) + + + Torrent addition + Torrent hozzáadása + + + Main window + Főablak + + + Systray messages + Panel üzenetek + + + Directory scan + Mappa megfigyelése + + + Style (Look 'n Feel) + Kinézet + + + + Plastique style (KDE like) + KDE-szerű + + + Cleanlooks style (GNOME like) + Gnome + + + Motif style (default Qt style on Unix systems) + Qt-szerű + + + + CDE style (Common Desktop Environment like) + Átlagos munkaasztal + + + MacOS style (MacOSX only) + MacOS stílus (csak MacOSX-en) + + + Exit confirmation when the download list is not empty + Megerősítés kérése a kilépésről, ha vannak letöltések + + + Disable systray integration + Panel integráció letiltása + + + WindowsXP style (Windows XP only) + Windwos XP (Csak XP-re) + + + Server IP or url: + Kiszolgáló címe: + + + Proxy type: + Proxy típusa: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Proxy kapcsolatok + + + + Use proxy for connections to trackers + Csatlakozás a trackerhez proxyn keresztül + + + + Use proxy for connections to regular peers + Csatlakozás ügyfelekhez proxyn keresztül + + + + Use proxy for connections to web seeds + Proxy használata web seedhez + + + + Use proxy for DHT messages + Proxy a DHT üzenetekhez + + + Encryption + Titkosítás + + + Encryption state: + Titkosítás állapota: + + + + Enabled + Engedélyez + + + + Forced + Kényszerít + + + + Disabled + Tilt + + + + Preferences + Beállítások + + + General + Általános + + + Network + Hálózat + + + + User interface settings + Felület beállításai + + + + Visual style: + Kinézet: + + + + Cleanlooks style (Gnome like) + Letisztult felület (Gnome-szerű) + + + + Motif style (Unix like) + Unix-szerű mintázat + + + + Ask for confirmation on exit when download list is not empty + Megerősítés kérése a kilépésről aktív letöltéseknél + + + + Display current speed in title bar + Sebesség megjelenítése a címsoron + + + + System tray icon + Panel ikon + + + + Disable system tray icon + Panel ikon letiltása + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Panelre helyezés bezáráskor + + + + Minimize to tray + Panelre helyezés háttérben + + + + Show notification balloons in tray + Panel üzenetek megjelenítése + + + Media player: + Media player: + + + + Downloads + Letöltések + + + Put downloads in this folder: + Letöltések mappája: + + + + Pre-allocate all files + Fájlok helyének lefoglalása + + + + When adding a torrent + Torrent hozzáadása + + + + Display torrent content and some options + Torrent részleteinek megjelenítése + + + + Do not start download automatically + The torrent will be added to download list in pause state + Letöltés nélkül add a listához + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Mappa megfigyelése + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Dupla klikk esetén + + + + Download list: + Letöltési listán: + + + + + Start/Stop + Indítás/szünet + + + + + Open folder + Könyvtár megnyitás + + + + + Show properties + Tulajdonságok + + + + Seeding list: + Feltöltési listán: + + + + Download folder: + Letöltési könyvtár: + + + + Temp folder: + Átmeneti könyvtár: + + + + Automatically download torrents present in this folder: + Torrent automatikus letöltése ebből a könyvtárból: + + + + Listening port + Port beállítása + + + to + i.e: 1200 to 1300 + - + + + + Enable UPnP port mapping + UPnP port átirányítás engedélyezése + + + + Enable NAT-PMP port mapping + NAT-PMP port átirányítás engedélyezése + + + + Global bandwidth limiting + Sávszélesség korlátozása + + + + Upload: + Feltöltés: + + + + Download: + Letöltés: + + + + Bittorrent features + Bittorrent funkciók + + + + Use the same port for DHT and Bittorrent + Egyazon port használata Bittorrenthez és DHT-hoz + + + + Spoof µtorrent to avoid ban (requires restart) + Álcázás µtorrent (újraindítást igényel) + + + + + Type: + Típus: + + + + + (None) + (Nincs) + + + + + Proxy: + Proxy: + + + + + + Username: + Felhasználónév: + + + + Bittorrent + Bittorrent + + + + UI + Felület + + + + Connections limit + Kapcsolatok korlátozása + + + + Global maximum number of connections: + Kapcsolatok maximális száma: + + + + Maximum number of connections per torrent: + Kapcsolatok maximális száma torrentenként: + + + + Maximum number of upload slots per torrent: + Feltöltési szálak száma torrentenként: + + + Additional Bittorrent features + További Bittorrent jellemzők + + + + Enable DHT network (decentralized) + DHT hálózati működés engedélyezése + + + Enable Peer eXchange (PeX) + Ügyfél csere engedélyezése (PeX) + + + + Enable Local Peer Discovery + Enable Local Peer Discovery + + + + Encryption: + Titkosítás: + + + + Share ratio settings + Megosztási arányok + + + + Desired ratio: + Elérendő arány: + + + + Filter file path: + Ip szűrő fájl helye: + + + + transfer lists refresh interval: + Átviteli lista frissítési időköze: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + RSS csatornák firssítésének időköze: + + + + minutes + perc + + + + Maximum number of articles per feed: + Hírek maximális száma csatornánként: + + + + File system + Fájlrendszer + + + + Remove finished torrents when their ratio reaches: + Torrent eltávolítása, ha elérte ezt az arányt: + + + + System default + Rendszer alapértelmezett + + + + Start minimized + Kicsinyítve indítás + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Az átviteli listán dupla kattintáskor + + + In download list: + Letöltési listán: + + + Pause/Start torrent + Torrent leállítása/folytatása + + + Open destination folder + Célmappa megnyitása + + + Display torrent properties + Torrent jellemzőinek mutatása + + + In seeding list: + Feltöltési listán: + + + Folder scan interval: + Könyvtár ellenőrzének időköze: + + + seconds + másodperc + + + Spoof Azureus to avoid ban (requires restart) + Álcázás Azureusnak (újraindítást igényel) + + + + Web UI + Webes felület + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Dupla katt esetén + + + + Port used for incoming connections: + Port a bejövő kapcsoaltokhoz: + + + + Random + Random + + + + Enable Web User Interface + Webes felület engedélyezése + + + + HTTP Server + HTTP Szerver + + + + Enable RSS support + RSS engedélyezése + + + + RSS settings + RSS beállítások + + + + Enable queueing system + Korlátozások engedélyezése + + + + Maximum active downloads: + Aktív letöltések maximási száma: + + + + Torrent queueing + Torrent korlátozások + + + + Maximum active torrents: + Torrentek maximális száma: + + + + Display top toolbar + Eszközsor megjelenítése + + + + Search engine proxy settings + Keresőmotor proxy beállításai + + + + Bittorrent proxy settings + Bittorrent proxy beállítások + + + + Maximum active uploads: + Maximális aktív feltöltés: + + + + DownloadingTorrents + + + Name + i.e: file name + Név + + + + Size + i.e: file size + Méret + + + + Progress + i.e: % downloaded + Folyamat + + + + DL Speed + i.e: Download speed + Letöltés + + + + UP Speed + i.e: Upload speed + Feltöltés + + + + Seeds/Leechers + i.e: full/partial sources + Seed/Leech + + + Seeds/Leechs + i.e: full/partial sources + Feltöltő/Letöltő + + + + Ratio + Arány + + + + ETA + i.e: Estimated Time of Arrival / Time left + Idő + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 elindítva. + + + Be careful, sharing copyrighted material without permission is against the law. + Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>blokkolva</i> + + + Fast resume data was rejected for torrent %1, checking again... + Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... + + + Url seed lookup failed for url: %1, message: %2 + Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' felvéve a letöltési listára. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' visszaállítva. (folytatás) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' már letöltés alatt. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Megfejthetetlen torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Ez a fájl sérült, vagy nem is torrent. + + + Couldn't listen on any of the given ports. + A megadott porok zártak. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Letöltés alatt: '%1', kis türelmet... + + + + Hide or Show Column + Oszlop mutatása vagy rejtése + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port felderítése sikertelen, hibaüzenet: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port felderítése sikeres, hibaüzenet: %1 + + + Priority + Elsőbbség + + + + FeedDownloader + + + RSS Feed downloader + Letöltés RSS forrásból + + + + RSS feed: + RSS forrás: + + + + Feed name + Forrás neve + + + + Automatically download torrents from this feed + Torrent automatikus letöltése ebből a forrásból + + + + Download filters + Letöltési szűrő + + + + Filters: + Szűrő: + + + + Filter settings + Szűrő beállításai + + + + Matches: + Egyezések: + + + + Does not match: + Kivételek: + + + + Destination folder: + Célmappa: + + + + ... + ... + + + + Filter testing + Szűrő próbája + + + + Torrent title: + Torrent címe: + + + + Result: + Eredmény: + + + + Test + Teszt + + + + Import... + Import... + + + + Export... + Export... + + + + + Rename filter + Szűrő átnevezése + + + + + Remove filter + Szűrő eltávolítása + + + + Add filter + Szűrő hozzáadása + + + + FeedDownloaderDlg + + + New filter + Új szűrő + + + + Please choose a name for this filter + Kérlek válassz nevet a szűrőnek + + + + Filter name: + Filter név: + + + + + + Invalid filter name + Érvénytelen szűrő név + + + + The filter name cannot be left empty. + A szűrő név mindenképpen szükséges. + + + + + This filter name is already in use. + A szűrő név már használatban. + + + + Filter testing error + Szűrő teszt hiba + + + + Please specify a test torrent name. + Kérlek válassz teszt torrentet. + + + + matches + egyezés + + + + does not match + nincs egyezés + + + + Select file to import + Fájl kiválasztása + + + + + Filters Files + Szűrő fájlok + + + + Import successful + Importálás sikeres + + + + Filters import was successful. + Szűrő importálás sikeres. + + + + Import failure + Importálás sikertelen + + + + Filters could not be imported due to an I/O error. + A szűrőt nem sikerült importálni I/O hiba miatt. + + + + Select destination file + Szűrő fájl kiválasztása + + + + Overwriting confirmation + Felülírás megerősítése + + + + Are you sure you want to overwrite existing file? + Biztosan felül akarod írni a már létező fájlt? + + + + Export successful + Exportálás sikeres + + + + Filters export was successful. + Szűrő exportálás sikeres. + + + + Export failure + Exportálás sikertelen + + + + Filters could not be exported due to an I/O error. + A szűrőt nem sikerült exportálni I/O hiba miatt. + + + + FeedList + + + Unread + Olvasatlan + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O Hiba + + + + + + Couldn't open %1 in read mode. + %1 megnyitása olvasásra sikertelen. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 nem hiteles PeerGuardian P2B fájl. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Feltöltés + + + + Name + i.e: file name + Név + + + + Size + i.e: file size + Méret + + + + Seeds / Leechers + Seederek / Leecherek + + + + Connected peers + Csatlakozott ügyfelek + + + Progress + i.e: % downloaded + Folyamat + + + DL Speed + i.e: Download speed + Bejövő sebesség + + + + UP Speed + i.e: Upload speed + Feltöltési sebesség + + + Seeds/Leechs + i.e: full/partial sources + Seeder/Leecher + + + Status + Állapot + + + ETA + i.e: Estimated Time of Arrival / Time left + Idő + + + Finished + i.e: Torrent has finished downloading + Letöltve + + + None + i.e: No error message + Nincs + + + + Ratio + Arány + + + Leechers + i.e: full/partial sources + Letöltők + + + + Total uploaded + i.e: Total amount of uploaded data + Teljes feltöltés + + + + Hide or Show Column + Oszlop mutatása vagy rejtése + + + Incomplete torrent in seeding list + Félkész torrent a megosztások között + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Úgy tűnik, hogy '%1' torrent átkerült a feltöltésekből a letöltések közé. Szeretnéd visszatenni? (máskülönben simán törölve lesz!) + + + Priority + Esőbbség + + + + GUI + + + Open Torrent Files + Torrent fájl megnyitása + + + This file is either corrupted or this isn't a torrent. + Ez a fájl sérült, vagy nem is torrent. + + + + + + + + &Yes + &Igen + + + + + + + + &No + &Nem + + + + Are you sure you want to delete the selected item(s) in download list? + Biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról? + + + Connecting... + Csatlakozás... + + + Downloading... + Letöltés... + + + + Torrent Files + Torrentek + + + + + + + Are you sure? -- qBittorrent + Egészen biztos? -- qBittorrent + + + Couldn't listen on any of the given ports. + A megadott porok zártak. + + + Status + Állapot + + + Paused + Leállítva + + + Preview process already running + Már van egy előzetes + + + There is already another preview process running. +Please close the other one first. + Már folyamatban van egy előzetes. +Kérlek előbb azt zárd be. + + + + Download finished + Letöltés elkészült + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról ÉS a merevlemezről? + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Kapcsolat állapota: + + + Offline + Offline + + + No peers found... + Nem találtam ügyfélt... + + + Name + i.e: file name + Név + + + Size + i.e: file size + Méret + + + Progress + i.e: % downloaded + Folyamat + + + DL Speed + i.e: Download speed + DL Speed + + + UP Speed + i.e: Upload speed + UP Speed + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + Idő + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 elindítva. + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Letöltés: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Feltöltés: %1 KiB/s + + + Checking... + i.e: Checking already downloaded parts... + Ellenőrzés... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Elakadt + + + + Are you sure you want to quit? + Egészen biztos, hogy kilépsz? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' eltávolítva. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' felvéve a letöltési listára. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' visszaállítva. (folytatás) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' már letöltés alatt. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Megfejthetetlen torrent: '%1' + + + None + i.e: No error message + Nincs + + + All downloads were paused. + Minden letöltés megállítva. + + + '%1' paused. + xxx.avi paused. + '%1' megállítva. + + + Connecting... + i.e: Connecting to the tracker... + Csatlakozás... + + + All downloads were resumed. + Mindegyik letöltés elindítva. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' elindítva. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 letöltve. + + + + I/O Error + i.e: Input/Output Error + I/O Hiba + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Hiba történ a(z) %1 írása/olvasása közben. Valószínűleg tele a lemez, így a letöltés megszakítva + + + + Connection Status: + A kapcsolat állapota: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Tűzfal probléma? + + + No incoming connections... + Nincs kapcsolat... + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Letöltés alatt: '%1', kis türelmet... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Hiba történt (megtelt a merevlemez?), '%1' megállítva. + + + + Search + Keresés + + + + RSS + RSS + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + I/O hiba történt ennél a torrentnél %1. Oka: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent ezen a porton figyel: %1 + + + DHT support [ON], port: %1 + DHT funkció [ON], port: %1 + + + + + DHT support [OFF] + DHT funkció [OFF] + + + + PeX support [ON] + PeX [ON] + + + PeX support [OFF] + PeX [OFF] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Letöltés folyamatban. +Mégis leállítod a qBittorrentet? + + + + + Downloads + Letöltések + + + + Finished + Feltöltések + + + Are you sure you want to delete the selected item(s) in finished list and in hard drive? + Egészen biztos vagy benne, hogy törlöd a felsorolt elemeket a feltöltési listáról ÉS a merevlemezről? + + + + Are you sure you want to delete the selected item(s) in finished list? + Biztos vagy benne, hogy törlöd a felsorolt elemeket a feltöltési listáról? + + + + UPnP support [ON] + UPnP támogatás [ON] + + + Be careful, sharing copyrighted material without permission is against the law. + Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!. + + + + Encryption support [ON] + Titkosítás [ON] + + + + Encryption support [FORCED] + Titkosítás [KÉNYSZERÍTVE] + + + + Encryption support [OFF] + Titkosítás [OFF] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>blokkolva</i> + + + Ratio + Arány + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Url letöltés hiba + + + + Couldn't download file at url: %1, reason: %2. + Nem sikerült letölteni url címről: %1, mert: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról ÉS a merevlemezről? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a feltöltési listáról ÉS a merevlemezről? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' véglegesen törölve. + + + Url seed lookup failed for url: %1, message: %2 + Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent ezen a porton figyel: TCP/%1 + + + + UPnP support [OFF] + UPnP támogatás [OFF] + + + + NAT-PMP support [ON] + NAT-PMP támogatás [ON] + + + + NAT-PMP support [OFF] + NAT-PMP támogatás [OFF] + + + + DHT support [ON], port: UDP/%1 + DHT támogatás [ON], port: UDP/%1 + + + + Local Peer Discovery [ON] + Local Peer Discovery [ON] + + + + Local Peer Discovery support [OFF] + Local Peer Discovery támogatás [OFF] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' eltávolítva, mivel elérte a kítűzött megosztási arányt. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Le: %2KiB/s, Fel: %3KiB/s) + + + + + DL: %1 KiB/s + Le: %1 KiB/s + + + + + UP: %1 KiB/s + Fel: %1 KiB/s + + + + + Ratio: %1 + Arány: %1 + + + + + DHT: %1 nodes + DHT: %1 csomó + + + + + No direct connections. This may indicate network configuration problems. + Nincsenek kapcsolatok. Ez lehet hálózat beállítási hiba miatt is. + + + + Uploads + Feltöltések + + + + Options were saved successfully. + Beállítások sikeresen elmentve. + + + + MainWindow + + Log: + Napló: + + + Total DL Speed: + Letöltési sebesség: + + + Total UP Speed: + Feltöltési sebesség: + + + &Options + &Tulajdonságok + + + + &Edit + &Szerkesztés + + + + &File + &Fájl + + + + &Help + &Súgó + + + + Open + Megnyitás + + + + Exit + Kilépés + + + + Preferences + Beállítások + + + + About + Névjegy + + + + Start + Indítás + + + + Pause + Szünet + + + + Delete + Törlés + + + + Pause All + Összes leállítása + + + + Start All + Összes indítása + + + + Torrent Properties + Torrent jellemzői + + + + Download from URL + Letöltés URL-ről + + + KiB/s + KByte/s + + + + Create torrent + Torrent készítés + + + Session ratio: + Megosztási arány: + + + + Preview file + Minta fájl + + + + Clear log + Napló kiürítése + + + + Delete Permanently + Végleges törlés + + + + Visit website + Irány a weboldal + + + + Report a bug + Hibajelentés + + + Downloads + Letöltések + + + + Set upload limit + Feltöltési korlát megadása + + + + Set download limit + Letöltési korlát megadása + + + Log + Napló + + + IP filter + IP szűrő + + + + Documentation + Dokumentáció + + + + Set global download limit + Teljes letöltési korlát + + + + Set global upload limit + Teljes feltöltési korlát + + + + Options + Opciók + + + + Decrease priority + Elsőbbség csökkentése + + + + Increase priority + Elsőbbség fokozása + + + + Console + Konzol + + + + PropListDelegate + + + + Ignored + Mellőzve + + + + + + Normal + Normal (priority) + Átlagos + + + + + High + High (priority) + Magas + + + + + Maximum + Maximum (priority) + Maximális + + + + RSS + + + Search + Keresés + + + + + New subscription + Új feliratkozás + + + + + + Mark items read + Olvasottnak jelölés + + + + Update all + Összes frissítése + + + 1 + 1 + + + + Feed URL + URL forrás + + + + + Update + Frissítés + + + + New folder + Új könyvtár + + + + RSS feeds + RSS források + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(dupla katt a letöltéshez)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Összes forrás frissítése + + + + + Delete + Törlés + + + + + Rename + Átnevezés + + + Refresh + Frissítés + + + + Download torrent + Torrent letöltése + + + + Open news URL + Új URL megnyitása + + + + Copy feed URL + URL forrás másolása + + + + RSS feed downloader + Letöltés RSS forrásból + + + Delete selected streams + Kijelölt csatornák törlése + + + + Refresh RSS streams + RSS csatornák ellenőrzése + + + Add a new RSS stream + RSS hírcsatorna hozzáadása + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Hírek:</b> <i>(dupla kattintás a böngészőben való megtekintéshez)</i> + + + Add RSS stream + RSS csatorna hozzádása + + + Refresh all streams + Összes csatorna ellenőrzése + + + RSS streams: + Hírcsatornák: + + + 2 + 2 + + + Mark all as read + Mind megjelölése olvasottnak + + + + RSSImp + + + Please type a rss stream url + Kérlek add meg a csatorna url címét + + + + Stream URL: + Csatorna címe: + + + Please choose a new name for this stream + Kérlek válassz új nevet a csatornának + + + New stream name: + Az új név: + + + + + Are you sure? -- qBittorrent + Egészen biztos? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Egészen biztos, hogy törlöd ezt a hírcsatornát a listáról? + + + + + &Yes + &Igen + + + + + &No + &Nem + + + no refresh + Nincs újdonság + + + no description available + Nincs leírás + + + Are you sure you want to delete this stream from the list? + Egészen biztos, hogy törlöd ezt a hírcsatornát a listáról? + + + Description: + Leírás: + + + url: + url: + + + Last refresh: + Utolsó frissítés: + + + + Please choose a folder name + Válassz könyvtár nevet + + + + Folder name: + Könyvtár név: + + + + New folder + Új könyvtár + + + + Overwrite attempt + Felülírási kísérlet + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Nem lehet felülírni: %1. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Ez a hírcsatorna már felvéve. + + + + Are you sure you want to delete these elements from the list? + Egészen biztos, hogy törlöd ezeket az elemet a listáról? + + + + Are you sure you want to delete this element from the list? + Egészen biztos, hogy törlöd ezt az elemet a listáról? + + + + Please choose a new name for this RSS feed + Válassz új nevet az RSS csatornának + + + + New feed name: + Új forrás neve: + + + + Name already in use + A név már foglalt + + + + This name is already used by another item, please choose another one. + Ez a név már foglalt, kérlek válassz másikat. + + + + Date: + Dátum: + + + + Author: + Szerző: + + + + Unread + Olvasatlan + + + + RssItem + + + No description available + Nem található leírás + + + + RssStream + + %1 ago + 10min ago + %1 előtt + + + + Automatically downloading %1 torrent from %2 RSS feed... + Automatikus letöltése %1 torrentnek a %2 RSS forrásból... + + + Never + Soha + + + + SearchCategories + + + All categories + Összes kategória + + + + Movies + Filmek + + + + TV shows + TV műsorok + + + + Music + Zene + + + + Games + Játék + + + + Anime + Anime + + + + Software + Szoftver + + + + Pictures + Képek + + + + Books + Könyvek + + + + SearchEngine + + Name + i.e: file name + Név + + + Size + i.e: file size + Méret + + + Seeders + i.e: Number of full sources + Feltöltők + + + Leechers + i.e: Number of partial sources + Letöltők + + + Search engine + Kereső oldal + + + + Empty search pattern + Hiányzó kulcsszó + + + + Please type a search pattern first + Kérlek adj meg kulcsszót a kereséshez + + + No search engine selected + Nincs kereső kiválasztva + + + You must select at least one search engine. + Válassz legalább egy keresőt. + + + + + Results + Eredmény + + + + Searching... + Keresés... + + + Search plugin update -- qBittorrent + Keresőmodul frissítés -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Elérhető egy frissebb keresőmodul. Szeretnéd most frissíteni? + +Újdonságok: + + + + &Yes + &Igen + + + &No + &Nem + + + Search plugin update + Kereső modul frissítése + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + A kiszolgálő jelenleg nem elérhető. Bocs. + + + Your search plugin is already up to date. + A legújabb keresőt használod. + + + + Cut + Kivágás + + + + Copy + Másolás + + + + Paste + Beillesztés + + + + Clear field + Mező törlése + + + + Clear completion history + Előzmények törlése + + + + Search Engine + Keresőmotor + + + + + Search has finished + A keresés befejeződött + + + + An error occured during search... + Hiba a keresés közben... + + + + Search aborted + Keresés félbeszakítva + + + + Search returned no results + Eredménytelen keresés + + + + Results + i.e: Search results + Találat + + + Search plugin download error + Hiba a kereső modul letöltésekor + + + Couldn't download search plugin update at url: %1, reason: %2. + Nem sikerült kereső modult letölteni innen: %1, mert: %2. + + + + + Unknown + Ismeretlen + + + + SearchTab + + + Name + i.e: file name + Név + + + + Size + i.e: file size + Méret + + + + Seeders + i.e: Number of full sources + Feltöltők + + + + Leechers + i.e: Number of partial sources + Letöltők + + + + Search engine + Kereső oldal + + + + TrackersAdditionDlg + + + Trackers addition dialog + Tracker hozzáadása + + + + List of trackers to add (one per line): + Trackerek listája (soronként egyet): + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Külön köszönet illeti a fordítókat, önkéntes munkájukért: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Amennyiben szeretnéd lefordítani (mondjuk már le van) a qBittorrentet, kérlek értesíts. + + + + addTorrentDialog + + + Torrent addition dialog + Torrent hozzáadása + + + + Save path: + Mentés helye: + + + + ... + ... + + + + Torrent size: + Torrent mérete: + + + + + Unknown + Ismeretlen + + + + Free disk space: + Szabad hely: + + + + Torrent content: + Torrent tartalma: + + + + Download in sequential order (slower but good for previewing) + Letöltés sorrendben (lassabb, de előnézethez ideális) + + + Download in correct order (slower but good for previewing) + Letöltés sorrendben. Előnézethez kiváló, de lassabb a letöltés + + + + Add to download list in paused state + Letöltés nélkül add a listához + + + + Add + Mehet + + + + Cancel + Mégse + + + + Ignored + Mellőzve + + + + Normal + Átlagos + + + + High + Magas + + + + Maximum + Maximális + + + + Collapse all + Elrejtés + + + Expand All + Kibontás + + + + Expand all + Kibontás + + + + authentication + + + + Tracker authentication + Tracker hitelesítés + + + + Tracker: + Tracker: + + + + Login + Belépés + + + + Username: + Felhasználónév: + + + + Password: + Jelszó: + + + + Log in + Bejelentkezés + + + + Cancel + Mégse + + + + bandwidth_dlg + + + Bandwidth allocation + Sávszélesség kiosztása + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 elérte a megengedett arányt. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' véglegesen törölve. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' eltávolítva. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' megállítva. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' elindítva. + + + + '%1' is not a valid magnet URI. + '%1' nem hiteles magnet URI. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' már letöltés alatt. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' visszaállítva. (folytatás) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' felvéve a letöltési listára. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Megfejthetetlen torrent: '%1' + + + + This file is either corrupted or this isn't a torrent. + Ez a fájl sérült, vagy nem is torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>letiltva IP szűrés miatt</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>kitiltva hibás adatküldés miatt</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Fájl ismételt letöltése %1 beágyazva a torrent %2 + + + + Unable to decode %1 torrent file. + Megfejthetetlen torrent: %1. + + + + Couldn't listen on any of the given ports. + A megadott porok zártak. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port felderítése sikertelen, hibaüzenet: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port felderítése sikeres, hibaüzenet: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... + + + + Url seed lookup failed for url: %1, message: %2 + Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Letöltés alatt: '%1', kis türelmet... + + + + createTorrentDialog + + ... + ... + + + Create + Létrehozás + + + + Cancel + Mégsem + + + + Torrent Creation Tool + Torrent készítő + + + + Torrent file creation + Torrent létrehozása + + + Input files or directories: + Forrás fájl vagy könyvtár: + + + + Announce urls (trackers): + Gazda tracker (url): + + + + Comment (optional): + Megjegyzés (esetleges): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Zárt (Nem jelenik meg a tracker nélküli DHT hálózaton) + + + Destination torrent file: + Torrent fájl neve: + + + + Web seeds urls (optional): + Web seeds urls (esetleges): + + + Input file or directory: + Forrás fájl vagy könyvtár: + + + + File or folder to add to the torrent: + Fájl vagy könyvtár. A torrent tartalma: + + + Add a file + Fájl hozzáadása + + + Add a folder + Mappa hozzáadása + + + + Add file + Fájl hozzáadása + + + + Add folder + Könyvtár hozzáadása + + + + Piece size: + Szelet mérete: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Zárt (nem jelenik meg a DHT hálózaton) + + + + Start seeding after creation + Megosztás létrehozás után + + + + Create and save... + Létrehozás és mentés... + + + + Progress: + Folyamat: + + + + createtorrent + + + Select destination torrent file + Torrent helye + + + + Torrent Files + Torrentek + + + No destination path set + Nincs célmappa + + + Please type a destination path first + Kérlek add meg a torrent helyét + + + + No input path set + Nincs forrásmappa + + + + Please type an input path first + Kérlek adj meg forrásmappát + + + + + + Torrent creation + Torrent létrehozása + + + + Torrent was created successfully: + Torrent sikeresen elkészült:): + + + + Select a folder to add to the torrent + Válassz egy könyvtárat a torrenthez + + + Select files to add to the torrent + Válassz fájlt(okat) a torrenthez + + + + Please type an announce URL + Kérlek add meg a gazda címét (URL) + + + + Torrent creation was unsuccessful, reason: %1 + Torrent készítése sikertelen:(, oka: %1 + + + + Announce URL: + Tracker URL + Gazda tracker (URL): + + + + Please type a web seed url + Kérlek adj meg címet a web seedhez (url) + + + + Web seed URL: + Web seed URL: + + + + Select a file to add to the torrent + Válassz fájlt(okat) a torrenthez + + + No tracker path set + Nincs tracker megadva + + + Please set at least one tracker + Kérlek adj meg legalább egy trackert + + + + Created torrent file is invalid. It won't be added to download list. + Az elkészült torrent fájl hibás. Nem lesz felvéve a listára. + + + + downloadFromURL + + + Download Torrents from URLs + Letöltés url címről + + + + Only one URL per line + Soronként csak egy címet + + + + Download + Letöltés + + + + Cancel + Mégsem + + + + Download from urls + Letöltés url címről + + + + No URL entered + Nem lett cím megadva + + + + Please type at least one URL. + Kérlek adj meg legalább egy url címet. + + + + downloading + + + Search + Keresés + + + Total DL Speed: + Bejövő sebesség: + + + KiB/s + KByte/s + + + Session ratio: + Megosztási arány: + + + Total UP Speed: + Kimenő sebesség: + + + Log + Napló + + + IP filter + IP szűrő + + + + Start + Indítás + + + + Pause + Szünet + + + + Delete + Törlés + + + Clear + Törlés + + + + Preview file + Minta fájl + + + + Set upload limit + Feltöltési korlát megadása + + + + Set download limit + Letöltési korlát megadása + + + + Delete Permanently + Végleges törlés + + + + Torrent Properties + Torrent tulajdonságai + + + + Open destination folder + Célmappa megnyitása + + + + Name + Név + + + + Size + Méret + + + + Progress + Folyamat + + + + DLSpeed + Letöltési sebesség + + + + UpSpeed + Feltöltési sebesség + + + + Seeds/Leechs + Feltöltők/Letöltők + + + + Ratio + Arány + + + + ETA + Hátramaradt idő + + + + Buy it + Megveszem + + + + Priority + Elsőbbség + + + + Increase priority + Elsőbbség fokozása + + + + Decrease priority + Elsőbbség csökkentése + + + + Force recheck + Kényszerített ellenőrzés + + + + Copy magnet link + Magnet link másolása + + + + engineSelect + + + Search plugins + Kereső modulok + + + + Installed search engines: + Telepített keresők: + + + + Name + Név + + + + Url + Url + + + + Enabled + Státusz + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Újabb kereső modulok elérhetőek itt : <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Új telepítése + + + + Check for updates + Frissítések ellenőrzése + + + + Close + Bezárás + + + + Enable + Enged + + + + Disable + Tilt + + + + Uninstall + Eltávolít + + + + engineSelectDlg + + True + Engedve + + + False + Tiltva + + + + Uninstall warning + Figyelemeztetés + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Néhány modult nem lehet eltávolítani, mivel a program részei. + Csak azokat lehet, amiket saját kezüleg telepítettél. +Viszont azok a modulok kikapcsolhatóak. + + + + Uninstall success + Sikeresen eltávolítva + + + + Select search plugins + Modul kiválasztása + + + + + qBittorrent search plugins + qBittorrent kereső modulok + + + + + + + + + + + Search plugin install + Kerső telepítése + + + + + + Yes + Igen + + + + + + + No + Nem + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + A %1 kereső modul egy újabb verziója már telepítve van. + + + + + + + + Search plugin update + Kereső modul frissítése + + + + + Sorry, update server is temporarily unavailable. + A kiszolgálő jelenleg nem elérhető. Bocs. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Bocs, nem sikerült frissíteni: %1. + + + + All your plugins are already up to date. + A legújabb kereső modulokat használod. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 keresőt nem lehet frissíteni, előző verzió megtartva. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 kereső modul telepítése sikertelen. + + + + All selected plugins were uninstalled successfully + Kereső modul(ok) sikeresen eltávolítva + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 kereső modul sikeresen frissítve. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 kereső modul sikeresen telepítve. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + %1 kereső modul sikeresen frissítve. + + + + Search engine plugin archive could not be read. + Kereső modul beolvasása sikertelen. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Bocs, %1 kereső modul telepítése sikertelen. + + + + New search engine plugin URL + Új kereső modul címe + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + Unknown + Ismeretlen + + + + Unknown + Unknown (size) + Ismeretlen + + + + < 1m + < 1 minute + < 1perc + + + + %1m + e.g: 10minutes + %1perc + + + + %1h%2m + e.g: 3hours 5minutes + %1óra%2perc + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1nap%2óra%3perc + + + + options_imp + + Range Start IP + IP tartomány kezdete + + + Start IP: + Kezdő IP: + + + Range End IP + IP tartomány vége + + + End IP: + Végső IP: + + + IP Range Comment + Megjegyzés a tartományhoz + + + Comment: + Megjegyzés: + + + to + <min port> to <max port> + - + + + Choose your favourite preview program + Válasz ki kedvenc bemutató programod + + + Invalid IP + Érvénytelen IP + + + This IP is invalid. + Ez az IP cím nemlétező. + + + Options were saved successfully. + Beállítások sikeresen elmentve. + + + + + Choose scan directory + Megfigyelt könyvtár beállítása + + + Choose an ipfilter.dat file + Ipfilter.dat fájl megnyitása + + + + + Choose a save directory + Letöltési könyvtár megadása + + + I/O Error + Input/Output Error + I/O Hiba + + + Couldn't open %1 in read mode. + %1 olvasása sikertelen. + + + + + Choose an ip filter file + Válassz egy ip szűrő fájlt + + + + + Filters + Szűrők + + + + pluginSourceDlg + + + Plugin source + Modul telepítés + + + + Search plugin source: + Kereső modul helye: + + + + Local file + Helyi fájl + + + + Web link + Webcím + + + + preview + + + Preview selection + Minta + + + + File preview + Előzetes + + + + The following files support previewing, <br>please select one of them: + Minta megtekinthető az alábbi fájloknál, <br>válassz egyet: + + + + Preview + Előzetes + + + + Cancel + Mégsem + + + + previewSelect + + + + Preview impossible + Bemutató hiba + + + + + Sorry, we can't preview this file + Nincs előzetes az ilyen fájlhoz. Bocs + + + + Name + Név + + + + Size + Méret + + + + Progress + Folyamat + + + + properties + + + Torrent Properties + Torrent tulajdonságai + + + + OK + Ok + + + + Unknown + Ismeretlen + + + + Files contained in current torrent: + Az aktuális torrent tartalma: + + + + Size + Méret + + + Tracker + Tracker + + + + Trackers: + Trackerek: + + + + + None - Unreachable? + Nincs - Vagy csak elérhetetlen? + + + Errors: + Hiba: + + + + Progress + Folyamat + + + Main infos + Fő infó + + + + Current tracker: + Aktuális tracker: + + + + Total uploaded: + Összes feltöltés: + + + + Main info + Fő adatok + + + + Torrent information + Torrent adatok + + + + Total downloaded: + Összes letöltés: + + + + Total failed: + Hibás adat: + + + + Torrent content + Torrent tartalma + + + + Download in correct order (slower but good for previewing) + Letöltés sorrendben. Előnézethez kiváló, de lassabb a letöltés + + + + Save path: + Letöltés helye: + + + Torrent infos + Torrent infó + + + + Creator: + Készítő program: + + + + Torrent hash: + Torrent hash: + + + + Comment: + Megjegyzés: + + + + Current session + Eddigi forgalom + + + + Share ratio: + Megosztási arány: + + + + Trackers + Trackerek + + + New tracker + Új tracker + + + New tracker url: + Új tracker címe: + + + + Priorities: + Prioritások: + + + + Normal: normal priority. Download order is dependent on availability + Normál: Az alap prioritás. A letöltés sorrendje az elérhetőségen múlik + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Magas: Magasabb a normálnál. Azonos elérhetőségnél elsőbbséget élvez, de alacsonyabbnál nem + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximális: legmagasabb prioritás. Nem veszi figyelembe az elérhetőséget, elsőbbséget biztosít minden más darabbal szemben + + + + File name + Fájl név + + + + + Priority + Prioritás + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + Nem hagyhatod üresen a trackerek listáját. + + + + Ignored: file is not downloaded at all + Mellőzve: a fájl nem lesz letöltve + + + + Ignored + Mellőzve + + + + Normal + Átlagos + + + + Maximum + Maximális + + + + High + Magas + + + + Url seeds + Url seed + + + + New url seed: + Új url seed: + + + + This url seed is already in the list. + Már letöltés alatt ez az url forrás. + + + Hard-coded url seeds cannot be deleted. + Nem törölhető ez az url forrás! (Hard-coded). + + + None + i.e: No error message + Nincs + + + + New url seed + New HTTP source + Új url forrás + + + + The following url seeds are available for this torrent: + Ehhez a torrenthez az alábbi url seedek elérhetőek: + + + + Priorities error + Priorities error + + + + Error, you can't filter all the files in a torrent. + Error, you can't filter all the files in a torrent. + + + + Downloaded pieces + Letöltött részek + + + + Collapse all + Elrejtés + + + + Expand all + Kibontás + + + + ... + ... + + + + + Choose save path + Mentés helye + + + + Save path creation error + Járhatatlan ösvény + + + + Could not create the save path + Nem sikerült létrehozni a letöltési könyvtárat. (Írásvédett?) + + + + search_engine + + + + Search + Keresés + + + Search Engines + Keresők + + + Search Pattern: + Kulcsszó: + + + Stop + Állj + + + + Status: + Állapot: + + + + Stopped + Megállítva + + + Results: + Eredmény: + + + + Download + Letöltés + + + Clear + Törlés + + + Update search plugin + Kereső modul frissítése + + + + Search engines... + Keresők... + + + Close tab + Bezárás + + + + seeding + + + Search + Keresés + + + The following torrents are finished and shared: + Letöltött és megosztott torrentek: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Megjegyzés:</u> A torrentezés lényege kapni és visszaadni! Ezt tartsd szem előtt mikor egy letöltést elkezdel. + + + + Start + Indítás + + + + Pause + Szünet + + + + Delete + Törlés + + + + Delete Permanently + Végleges törlés + + + + Torrent Properties + Torrent tulajdonságai + + + + Preview file + Minta fájl + + + + Set upload limit + Feltöltési korlát megadása + + + + Open destination folder + Célmappa megnyitása + + + + Name + Név + + + + Size + Méret + + + + Upload Speed + Feltöltési sebesség + + + + + Connected peers + Csatlakozott ügyfelek + + + + + Seeds / Leechers + Feltöltők / Letöltők + + + + Copy magnet link + Magnet link másolása + + + Leechers + Letöltők + + + + Ratio + Arány + + + + Buy it + Megveszem + + + + Total uploaded + Teljes feltöltés + + + Priority + Elsőbbség + + + Increase priority + Elsőbbség fokozásas + + + Decrease priority + Elsőbbség csökkentése + + + + Force recheck + Kényszerített ellenőrzés + + + + subDownloadThread + + + Host is unreachable + Kiszolgáló nem elérhető + + + + File was not found (404) + Fájl nem található (404) + + + + Connection was denied + Hozzáférés megtagadva + + + + Url is invalid + Érvénytelen cím + + + + I/O Error + I/O Hiba + + + Connection forbidden (403) + Kapcsolódás letiltva (403) + + + Connection was not authorized (401) + Sikertelen hitelesítés kapcsolódáskor (401) + + + Content has moved (301) + Tartalom áthelyezve (301) + + + + Connection failure + Kapcsolódás sikertelen + + + + Connection was timed out + Idő túllépés + + + + Incorrect network interface + Hibás hálózati csatlakozó + + + + Unknown error + Ismeretlen hiba + + + + Could not resolve proxy + Nem sikerült csatlakozni a proxy-hoz + + + + torrentAdditionDialog + + + + Unable to decode torrent file: + Hasznavehetetlen torrent fájl: + + + This file is either corrupted or this isn't a torrent. + Ez a fájl sérült, vagy nem is torrent. + + + Unknown + Ismeretlen + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 hely marad letöltés után) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 hely hiányzik a letöltéshez) + + + + + Choose save path + Mentés helye + + + + Empty save path + Mentés helye hiányos + + + + Please enter a save path + Kérlek add meg a mentés helyét + + + + Save path creation error + Járhatatlan ösvény + + + + Could not create the save path + Nem sikerült létrehozni a letöltési könyvtárat. (Írásvédett?) + + + + Invalid file selection + Választás hiánya + + + + You must select at least one file in the torrent + Legalább egy fájlt ki kell választanod + + + + File name + Fájlnév + + + + Size + Méret + + + + Progress + Folyamat + + + + + Priority + Elsőbbség + + + diff --git a/src/lang/qbittorrent_it.qm b/src/lang/qbittorrent_it.qm new file mode 100644 index 0000000000000000000000000000000000000000..fa0d8c518330576864e63b1c997058712cc6ef5f GIT binary patch literal 70441 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_it.ts b/src/lang/qbittorrent_it.ts new file mode 100644 index 000000000..506244d91 --- /dev/null +++ b/src/lang/qbittorrent_it.ts @@ -0,0 +1,5374 @@ + + + + + AboutDlg + + + About qBittorrent + Informazioni su qBittorrent + + + + About + Informazioni + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un client Bittorrent scritto in C++, basato sulle Qt4 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Autore + + + + Name: + Nome: + + + + Country: + Paese: + + + + E-mail: + E-mail: + + + + Home page: + Home page: + + + + Christophe Dumez + Christophe Dumez + + + + France + Francia + + + Thanks To + Ringraziamenti + + + + Translation + Traduzione + + + + License + Licenza + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Un client bittorrent Qt4 e libtorrent, scritto in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + + Birthday: + Data di nascita: + + + + Occupation: + Occupazione: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + Studente di informatica + + + + Thanks to + Ringraziamenti + + + + BandwidthAllocationDialog + + + Upload limit: + Limite upload: + + + + Download limit: + Limite download: + + + + + + + Unlimited + Unlimited (bandwidth) + Illimitata + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + Console di qBittorrent + + + + General + Generali + + + + Blocked IPs + IP bloccati + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opzioni -- qBittorrent + + + Options + Opzioni + + + Main + Principale + + + Save Path: + Directory di salvataggio: + + + Download Limit: + Limite download: + + + Upload Limit: + Limite upload: + + + Max Connects: + Connessioni massime: + + + Port range: + Intervallo porte: + + + ... + ... + + + Disable + Disabilita + + + connections + connessioni + + + + Proxy + Proxy + + + Proxy Settings + Impostazioni proxy + + + Server IP: + Server IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Porta: + + + Proxy server requires authentication + Il server proxy richiede l'autenticazione + + + + + + Authentication + Autenticazione + + + User Name: + Nome utente: + + + + + + Password: + Password: + + + Enable connection through a proxy server + Abilita connessione attraverso un server proxy + + + OK + OK + + + Cancel + Annulla + + + Scanned Dir: + Directory controllata: + + + Enable directory scan (auto add torrent files inside) + Abilita scansione directory (aggiunge automaticamente i torrent nella directory) + + + Connection Settings + Impostazioni di connessione + + + Share ratio: + Rapporto di condivisione: + + + + Activate IP Filtering + Attiva Filtraggio IP + + + + Filter Settings + Impostazioni del filtro + + + Start IP + IP iniziale + + + End IP + IP finale + + + Origin + Origine + + + Comment + Commento + + + Apply + Applica + + + + IP Filter + Filtro IP + + + Add Range + Aggiungi intervallo + + + Remove Range + Rimuovi intervallo + + + ipfilter.dat Path: + Percorso di ipfilter.dat: + + + Misc + Varie + + + Localization + Localizzazione + + + + Language: + Lingua: + + + Behaviour + Aspetto + + + Ask for confirmation on exit + Chiedi conferma all'uscita + + + Go to systray when minimizing window + Riduci alla systray quando si minimizza la finestra + + + OSD + OSD + + + Always display OSD + Mostra sempre l'OSD + + + Display OSD only if window is minimized or iconified + Mostra l'OSD solo se la finestra è minimizzata o ridotta a icona + + + Never display OSD + Non mostrare mai l'OSD + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + DHT (senza tracker): + + + Disable DHT (Trackerless) support + Disabilita il supporto DHT + + + Automatically clear finished downloads + Cancella automaticamente i download terminati + + + Preview program + Programma di anteprima + + + Audio/Video player: + Player audio/video: + + + Systray Messages + Messaggi systray + + + Always display systray messages + Mostra sempre i messaggi systray + + + Display systray messages only when window is hidden + Mostra i messaggi systray solo quando la finestra è nascosta + + + Never display systray messages + Non mostrare mai i messaggi systray + + + DHT configuration + Configurazione DHT + + + + DHT port: + Porta DHT: + + + Language + Lingua + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Nota:</b> Le modifiche saranno applicate al riavvio di qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Note per la traduzione:</b> Se qBittorrent non è disponibile nella tua lingua, e se sei <br/>disposto a tradurlo, per favore contattami (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Mostra una finestra di dialogo ogni volta che aggiungo un torrent + + + Default save path + Directory di default + + + Disable DHT (Trackerless) + Disabilita DHT (senza tracker) + + + Disable Peer eXchange (PeX) + Disabilita Scambio Peer (PeX) + + + Go to systray when closing main window + Riduci alla systray quando si chiude la finestra + + + + Connection + Connessione + + + Peer eXchange (PeX) + Scambio Peer (PeX) + + + DHT (trackerless) + DHT (senza tracker) + + + Torrent addition + Aggiunta torrent + + + Main window + Finestra principale + + + Systray messages + Messaggi systray + + + Directory scan + Scansione directory + + + Style (Look 'n Feel) + Stile (Look 'n Feel) + + + + Plastique style (KDE like) + Stile Plastique (KDE) + + + Cleanlooks style (GNOME like) + Stile Cleanlooks (GNOME) + + + Motif style (default Qt style on Unix systems) + Stile Motif (stile Qt di default su sistemi Unix) + + + + CDE style (Common Desktop Environment like) + Stile CDE (Common Desktop Environment) + + + MacOS style (MacOSX only) + Stile MacOS (solo MacOSX) + + + Exit confirmation when the download list is not empty + Conferma l'uscita quando la lista dei download non è vuota + + + Disable systray integration + Disabilita l'integrazione con la systray + + + WindowsXP style (Windows XP only) + Stile WindowsXP (solo Windows XP) + + + Server IP or url: + Server IP o url: + + + Proxy type: + Tipo di proxy: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + Connessioni interessate + + + + Use proxy for connections to trackers + Usa un proxy per le connessioni ai tracker + + + + Use proxy for connections to regular peers + Usa un proxy per le connessioni ai peer regolari + + + + Use proxy for connections to web seeds + Usa un proxy per connessioni ai seed web + + + + Use proxy for DHT messages + Usa un proxy per i messaggi DHT + + + Encryption + Cifratura + + + Encryption state: + Stato cifratura: + + + + Enabled + Attivata + + + + Forced + Forzata + + + + Disabled + Disattivata + + + + Preferences + Preferenze + + + General + Generali + + + Network + Rete + + + + User interface settings + Impostazioni interfaccia utente + + + + Visual style: + Stile grafico: + + + + Cleanlooks style (Gnome like) + Stile Cleanlooks (Gnome) + + + + Motif style (Unix like) + Stile Motif (Unix) + + + + Ask for confirmation on exit when download list is not empty + Chiedi conferma in uscita quando la lista dei download non è vuota + + + + Display current speed in title bar + Mostra la velocità attuale nella barra del titolo + + + + System tray icon + Icona nel vassoio di sistema + + + + Disable system tray icon + Disabilita icona nel vassoio di sistema + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Chiudi nel vassoio di sistema + + + + Minimize to tray + Minimizza nel vassoio di sistema + + + + Show notification balloons in tray + Mostra nuvolette di notifica nel vassoio di sistema + + + Media player: + Player multimediale: + + + + Downloads + Download + + + Put downloads in this folder: + Cartella dei download: + + + + Pre-allocate all files + Pre-alloca tutti i file + + + + When adding a torrent + All'aggiunta di un torrent + + + + Display torrent content and some options + Mostra il contenuto del torrent ed alcune opzioni + + + + Do not start download automatically + The torrent will be added to download list in pause state + Non iniziare il download automaticamente + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Controllo cartella + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Doppio clic nella lista trasferimenti + + + + Download list: + Lista download: + + + + + Start/Stop + Avvia/Ferma + + + + + Open folder + Apri cartella + + + + + Show properties + Mostra proprietà + + + + Seeding list: + Lista upload: + + + + Download folder: + Cartella download: + + + + Temp folder: + Cartella file temporanei: + + + + Automatically download torrents present in this folder: + Download automatico dei torrent presenti in questa cartella: + + + + Listening port + Porte di ascolto + + + to + i.e: 1200 to 1300 + a + + + + Enable UPnP port mapping + Abilita mappatura porte UPnP + + + + Enable NAT-PMP port mapping + Abilita mappatura porte NAT-PMP + + + + Global bandwidth limiting + Limiti globali di banda + + + + Upload: + Upload: + + + + Download: + Download: + + + + Bittorrent features + Caratteristiche di Bittorrent + + + + Use the same port for DHT and Bittorrent + Usa la stessa porta per DHT e Bittorrent + + + + Spoof µtorrent to avoid ban (requires restart) + Spoofing di µtorrent per evitare il ban (richiede riavvio) + + + + + Type: + Tipo: + + + + + (None) + (Nessuno) + + + + + Proxy: + Proxy: + + + + + + Username: + Nome utente: + + + + Bittorrent + Bittorrent + + + + UI + UI + + + + Connections limit + Limiti alle connessioni + + + + Global maximum number of connections: + Numero massimo globale di connessioni: + + + + Maximum number of connections per torrent: + Numero massimo di connessioni per torrent: + + + + Maximum number of upload slots per torrent: + Numero massimo di slot in upload per torrent: + + + Additional Bittorrent features + Funzioni aggiuntive Bittorrent + + + + Enable DHT network (decentralized) + Abilita rete DHT (decentralizzata) + + + Enable Peer eXchange (PeX) + Abilita scambio peer (PeX) + + + + Enable Local Peer Discovery + Abilita scoperta peer locali + + + + Encryption: + Cifratura: + + + + Share ratio settings + Impostazioni rapporto di condivisione + + + + Desired ratio: + Rapporto desiderato: + + + + Filter file path: + Percorso file filtro: + + + + transfer lists refresh interval: + intervallo aggiornamento liste di trasferimento: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + Intervallo aggiornamento feed RSS: + + + + minutes + minuti + + + + Maximum number of articles per feed: + Numero massimo di articoli per feed: + + + + File system + File system + + + + Remove finished torrents when their ratio reaches: + Rimuovi i torrent completati quando il rapporto raggiunge: + + + + System default + Predefinito di sistema + + + + Start minimized + Avvia minimizzato + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Azione per il doppio clic nella lista dei trasferimenti + + + In download list: + Nella lista dei download: + + + Pause/Start torrent + Ferma/Avvia torrent + + + Open destination folder + Apri cartella di destinazione + + + Display torrent properties + Mostra proprietà del torrent + + + In seeding list: + Nella lista degli upload: + + + Folder scan interval: + Intervallo controllo cartella: + + + seconds + secondi + + + Spoof Azureus to avoid ban (requires restart) + Spoofing di Azureus per evitare il ban (richiede riavvio) + + + + Web UI + Interfaccia Web + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Azione per il doppio clic + + + + Port used for incoming connections: + Porta usata per connessioni in entrata: + + + + Random + Casuale + + + + Enable Web User Interface + Abilita interfaccia Web + + + + HTTP Server + Server HTTP + + + + Enable RSS support + Attiva supporto RSS + + + + RSS settings + Impostazioni RSS + + + + Enable queueing system + Attiva sistema code + + + + Maximum active downloads: + Numero massimo di download attivi: + + + + Torrent queueing + Accodamento torrent + + + + Maximum active torrents: + Numero massimo di torrent attivi: + + + + Display top toolbar + Mostra la barra degli strumenti + + + + Search engine proxy settings + Impostazioni proxy motore di ricerca + + + + Bittorrent proxy settings + Impostazioni proxy bittorrent + + + + Maximum active uploads: + Numero massimo di upload attivi: + + + + DownloadingTorrents + + + Name + i.e: file name + Nome + + + + Size + i.e: file size + Dimensione + + + + Progress + i.e: % downloaded + Avanzamento + + + + DL Speed + i.e: Download speed + Velocità DL + + + + UP Speed + i.e: Upload speed + Velocità UP + + + + Seeds/Leechers + i.e: full/partial sources + Seeds / Leechs + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + + Ratio + Rapporto + + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 avviato. + + + Be careful, sharing copyrighted material without permission is against the law. + Attenzione, condividere materiale protetto da copyright senza il permesso è illegale. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>è stato bloccato</i> + + + Fast resume data was rejected for torrent %1, checking again... + Il recupero veloce del torrent %1 è stato rifiutato, altro tentativo in corso... + + + Url seed lookup failed for url: %1, message: %2 + Fallito seed per l'url: %1, messaggio: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' è stato aggiunto alla lista dei download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ripreso. (recupero veloce) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' è già nella lista dei download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossibile decifrare il file torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Questo file è corrotto o non è un torrent. + + + Couldn't listen on any of the given ports. + Impossibile mettersi in ascolto sulle porte scelte. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Download di '%1' in corso... + + + + Hide or Show Column + Mostra o nascondi colonna + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: mappatura porte fallita, messaggio: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: mappatura porte riuscita, messaggio: %1 + + + Priority + Priorità + + + + FeedDownloader + + + RSS Feed downloader + Scaricatore di Feed RSS + + + + RSS feed: + Feed RSS: + + + + Feed name + Nome del feed + + + + Automatically download torrents from this feed + Download automatico dei torrent da questo feed + + + + Download filters + Scarica filtri + + + + Filters: + Filtri: + + + + Filter settings + Impostazioni dei filtri + + + + Matches: + Corrisponde: + + + + Does not match: + Non corrisponde: + + + + Destination folder: + Cartella di destinazione: + + + + ... + ... + + + + Filter testing + Test del filtro + + + + Torrent title: + Titolo del torrent: + + + + Result: + Risultato: + + + + Test + Test + + + + Import... + Importa... + + + + Export... + Esporta... + + + + + Rename filter + Rinomina filtro + + + + + Remove filter + Cancella filtro + + + + Add filter + Aggiungi filtro + + + + FeedDownloaderDlg + + + New filter + Nuovo filtro + + + + Please choose a name for this filter + Per favore scegliere un nome per questo filtro + + + + Filter name: + Nome del filtro: + + + + + + Invalid filter name + Nome filtro non valido + + + + The filter name cannot be left empty. + Il nome del filtro non può essere lasciato vuoto. + + + + + This filter name is already in use. + Questo nome filtro è già in uso. + + + + Filter testing error + Errore test del filtro + + + + Please specify a test torrent name. + Per favore specificare il nome di un torrent di test. + + + + matches + corrisponde + + + + does not match + non corrisponde + + + + Select file to import + Selezionare file da importare + + + + + Filters Files + File del filtro + + + + Import successful + Importazione riuscita + + + + Filters import was successful. + Importazione dei filtri riuscita. + + + + Import failure + Importazione fallita + + + + Filters could not be imported due to an I/O error. + Filtri non importati a causa di un errore I/O. + + + + Select destination file + Selezionare file di destinazione + + + + Overwriting confirmation + Conferma sovrascrittura + + + + Are you sure you want to overwrite existing file? + Sei sicuro di voler sovrascrivere il file esistente? + + + + Export successful + Esportazione riuscita + + + + Filters export was successful. + Esportazione dei filtri riuscita. + + + + Export failure + Esportazione fallita + + + + Filters could not be exported due to an I/O error. + Filtri non esportati a causa di un errore I/O. + + + + FeedList + + + Unread + Non letti + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Errore I/O + + + + + + Couldn't open %1 in read mode. + Impossibile aprire %1 in lettura. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1 non è un file P2B valido per PeerGuardian. + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Completato + + + + Name + i.e: file name + Nome + + + + Size + i.e: file size + Dimensione + + + + Seeds / Leechers + Seeds / Leechs + + + + Connected peers + Peer connessi + + + Progress + i.e: % downloaded + Avanzamento + + + + UP Speed + i.e: Upload speed + Velocità upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + + Ratio + Rapporto + + + Leechers + i.e: full/partial sources + Leechers + + + + Total uploaded + i.e: Total amount of uploaded data + Upload totale + + + + Hide or Show Column + Mostra o nascondi la colonna + + + Incomplete torrent in seeding list + Torrent incompleto nella lista degli upload + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Sembra che lo stato del torrent '%1' sia cambiato da "In Upload" a "In Download". Vuoi rimetterlo nella lista dei download? (altrimenti il torrent sarà semplicemente cancellato) + + + Priority + Priorità + + + + GUI + + + Open Torrent Files + Apri file torrent + + + This file is either corrupted or this isn't a torrent. + Questo file è corrotto o non è un torrent. + + + Are you sure you want to delete all files in download list? + Sei sicuro di voler cancellare tutti i file nella lista di download? + + + + + + + + &Yes + &Sì + + + + + + + + &No + &No + + + + Are you sure you want to delete the selected item(s) in download list? + Sei sicuro di voler cancellare gli elementi selezionati dalla lista dei download? + + + + Finished + In Upload + + + Checking... + Controllo in corso... + + + Connecting... + Connessione in corso... + + + Downloading... + Download in corso... + + + Download list cleared. + Lista download vuota. + + + All Downloads Paused. + Fermati tutti i downloads. + + + All Downloads Resumed. + Ripresi tutti i downloads. + + + started. + iniziato. + + + UP Speed: + Velocità upload: + + + Couldn't create the directory: + Impossibile creare la directory: + + + + Torrent Files + File torrent + + + already in download list. + <file> already in download list. + già presente fra i downloads. + + + added to download list. + aggiunto. + + + resumed. (fast resume) + ripreso. + + + Unable to decode torrent file: + Impossibile decodificare il file torrent: + + + removed. + <file> removed. + rimosso. + + + paused. + <file> paused. + fermato. + + + resumed. + <file> resumed. + ripreso. + + + Listening on port: + In ascolto sulla porta: + + + qBittorrent + qBittorrent + + + + + + + Are you sure? -- qBittorrent + Sei sicuro? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Velocità download: + + + <b>Connection Status:</b><br>Online + <b>Status connessione:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Status connessione:</b><br>Firewall?<br><i>Nessuna connessione in ingresso...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Status connessione:</b><br>Offline<br><i>Nessun peer trovato...</i> + + + has finished downloading. + ha finito il dowload. + + + Couldn't listen on any of the given ports. + Impossibile mettersi in ascolto sulle porte scelte. + + + None + Nessuno + + + Empty search pattern + Pattern di ricerca vuoto + + + Please type a search pattern first + Per favore inserire prima un patter di ricerca + + + No seach engine selected + Nessun motore di ricerca selezionato + + + You must select at least one search engine. + Devi scegliere almeno un motore di ricerca. + + + Searching... + Ricerca... + + + Are you sure you want to quit? -- qBittorrent + Sicuro di voler uscire? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Sicuro di voler uscire da qBittorrent? + + + KiB/s + KiB/s + + + Search is finished + Ricerca completata + + + An error occured during search... + Un errore si è presentato durante la ricerca... + + + Search aborted + Ricerca annullata + + + Search returned no results + La ricerca non ha prodotto risultati + + + Search plugin update -- qBittorrent + Aggiornamento del plugin di ricerca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Esiste una nuova versione del plugin di Ricerca, vuoi aggiornarlo? + +Changelog: + + + Sorry, update server is temporarily unavailable. + Spiacenti, il server principale è momentaneamente irraggiungibile. + + + Your search plugin is already up to date. + Il plugin di Ricerca è già aggiornato. + + + Results + Risultati + + + Name + Nome + + + Size + Dimensione + + + Progress + Progresso + + + DL Speed + Velocità download + + + UP Speed + Velocità upload + + + Status + Status + + + ETA + ETA + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Motore di ricerca + + + Stalled + state of a torrent whose DL Speed is 0 + In stallo + + + Paused + In pausa + + + Preview process already running + Processo di anteprima già in esecuzione + + + There is already another preview process running. +Please close the other one first. + C'è già un altro processo di anteprima avviato. +Per favore chiuderlo. + + + Couldn't download + Couldn't download <file> + Impossibile scaricare il file + + + reason: + Reason why the download failed + motivo: + + + Downloading + +Example: Downloading www.example.com/test.torrent + Scaricando + + + Please wait... + Attendere prego... + + + Transfers + Trasferimenti + + + Downloading + Example: Downloading www.example.com/test.torrent + Downloading + + + + Download finished + Download completato + + + has finished downloading. + <filename> has finished downloading. + ha finito il download. + + + Search Engine + Motore di Ricerca + + + Are you sure you want to quit qBittorrent? + Sicuro di voler uscire da qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Sei sicuro di voler rimuovere i selezionati Downloads e i relativi files incompleti? + + + I/O Error + Errore I/O + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Stato della connessione: + + + Offline + Offline + + + No peers found... + Nessun peer trovato... + + + Name + i.e: file name + Nome + + + Size + i.e: file size + Dimensione + + + Progress + i.e: % downloaded + Avanzamento + + + DL Speed + i.e: Download speed + Velocità DL + + + UP Speed + i.e: Upload speed + Velocità UP + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 avviato. + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Velocità DL: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Velocità UP: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Completato + + + Checking... + i.e: Checking already downloaded parts... + Controllo in corso... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + In Stallo + + + + Are you sure you want to quit? + Sei sicuro di voler uscire? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' è stato rimosso. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' è stato aggiunto alla lista dei download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ripreso. (recupero veloce) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' è già nella lista dei download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossibile decifrare il file torrent: '%1' + + + None + i.e: No error message + Nessuno + + + Listening on port: %1 + e.g: Listening on port: 1666 + In ascolto sulla porta: %1 + + + All downloads were paused. + Tutti i download sono stati fermati. + + + '%1' paused. + xxx.avi paused. + '%1' fermato. + + + Connecting... + i.e: Connecting to the tracker... + Connessione in corso... + + + All downloads were resumed. + Tutti i download sono stati ripresi. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' ripreso. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 è stato scaricato. + + + + I/O Error + i.e: Input/Output Error + Errore I/O + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Errore di scrittura o di lettura con %1. Probabilmente il disco è pieno, il download è stato fermato + + + + Connection Status: + Stato della connessione: + + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Dietro firewall? + + + No incoming connections... + Nessuna connession in entrata... + + + No search engine selected + Non hai selezionato nessun motore di ricerca + + + Search plugin update + Aggiornato il plugin di ricerca + + + Search has finished + La ricerca è terminata + + + Results + i.e: Search results + Risultati + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Download di '%1' in corso... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Si è verificato un errore (disco pieno?), '%1' fermato. + + + + Search + Ricerca + + + + RSS + RSS + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Si è verificato un errore I/O per il torrent %1. +Motivo: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent è in ascolto sulla porta: %1 + + + DHT support [ON], port: %1 + Supporto DHT [ON], porta: %1 + + + + + DHT support [OFF] + Supporto DHT [OFF] + + + + PeX support [ON] + Supporto PeX [ON] + + + PeX support [OFF] + Supporto PeX [OFF] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + La lista dei download non è vuota. +Sei sicuro di voler uscire da qBittorrent? + + + + + Downloads + In Download + + + + Are you sure you want to delete the selected item(s) in finished list? + Sei sicuro di voler cancellare gli elementi selezionati dalla lista dei download completati? + + + + UPnP support [ON] + Supporto UPnP [ON] + + + Be careful, sharing copyrighted material without permission is against the law. + Attenzione, condividere materiale protetto da copyright senza il permesso è illegale. + + + + Encryption support [ON] + Supporto cifratura [ON] + + + + Encryption support [FORCED] + Supporto cifratura [FORZATO] + + + + Encryption support [OFF] + Supporto cifratura [OFF] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>è stato bloccato</i> + + + Ratio + Rapporto + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Errore download da indirizzo web + + + + Couldn't download file at url: %1, reason: %2. + Impossibile scaricare il file all'indirizzo: %1, motivo: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Il recupero veloce del torrent %1 è stato rifiutato, altro tentativo in corso... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Sei sicuro di voler rimuovere gli elementi selezionati dalla lista dei download e dal disco? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Sei sicuro di voler rimuovere gli oggetti selezionati dalla lista dei download completati e dal disco? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' è stato cancellato permanentemente. + + + Url seed lookup failed for url: %1, message: %2 + Fallito seed per l'url: %1, messaggio: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent è in ascolto sulla porta: TCP/%1 + + + + UPnP support [OFF] + Supporto UPnP [OFF] + + + + NAT-PMP support [ON] + Supporto NAT-PMP [ON] + + + + NAT-PMP support [OFF] + Supporto NAT-PMP [OFF] + + + + DHT support [ON], port: UDP/%1 + Supporto DHT [ON], porta: UDP/%1 + + + + Local Peer Discovery [ON] + Supporto scoperta peer locali [ON] + + + + Local Peer Discovery support [OFF] + Supporto scoperta peer locali [OFF] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' è stato rimosso perché il suo rapporto di condivisione ha raggiunto il massimo stabilito. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + DL: %1 KiB/s + + + + + UP: %1 KiB/s + UP: %1 KiB/s + + + + + Ratio: %1 + Rapporto: %1 + + + + + DHT: %1 nodes + DHT: %1 nodi + + + + + No direct connections. This may indicate network configuration problems. + Nessuna connessione diretta. Questo potrebbe indicare problemi di configurazione della rete. + + + + Uploads + Upload + + + + Options were saved successfully. + Le opzioni sono state salvate. + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Velocità totale download: + + + Total UP Speed: + Velocità totale upload: + + + &Options + &Opzioni + + + + &Edit + &Modifica + + + + &File + &File + + + + &Help + &Aiuto + + + + Open + Apri + + + + Exit + Esci + + + + Preferences + Preferenze + + + + About + Informazioni + + + + Start + Avvia + + + + Pause + Ferma + + + + Delete + Cancella + + + + Pause All + Ferma tutti + + + + Start All + Inizia tutti + + + + Documentation + Documentazione + + + Delete All + Cancella tutti + + + + Torrent Properties + Proprietà del torrent + + + Connection Status + Status connessione + + + Search + Ricerca + + + Search Pattern: + Pattern di ricerca: + + + Status: + Status: + + + Stopped + Fermato + + + Search Engines + Motori di ricerca + + + Results: + Risultati: + + + Stop + Ferma + + + + Download from URL + Download da indirizzo web + + + Download + Download + + + Clear + Pulisci + + + KiB/s + KiB/s + + + + Create torrent + Crea torrent + + + Update search plugin + Aggiorna plugin di ricerca + + + Session ratio: + Rapporto della sessione: + + + Transfers + Trasferimenti + + + + Preview file + Anteprima file + + + + Clear log + Cancella log + + + + Delete Permanently + Cancella permanentemente + + + + Visit website + Visita il sito web + + + + Report a bug + Segnala un bug + + + Downloads + Download + + + + Set upload limit + Imposta limite di upload + + + + Set download limit + Imposta limite di download + + + Log + Log + + + IP filter + Filtro IP + + + + Set global download limit + Imposta limite di download globale + + + + Set global upload limit + Imposta limite di upload globale + + + + Options + Opzioni + + + + Decrease priority + Diminuisci priorità + + + + Increase priority + Aumenta priorità + + + + Console + Console + + + + PropListDelegate + + False + Falso + + + True + Vero + + + + + Ignored + Ignora + + + + + + Normal + Normal (priority) + Normale + + + + + High + High (priority) + Alta + + + + + Maximum + Maximum (priority) + Massima + + + + RSS + + + Search + Ricerca + + + + + New subscription + Nuova iscrizione + + + + + + Mark items read + Segna come letti + + + + Update all + Aggiorna tutti + + + 1 + 1 + + + + Feed URL + URL del Feed + + + + + Update + Aggiorna + + + + New folder + Nuova cartella + + + + RSS feeds + Feed Rss + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrent:</span> <span style=" font-style:italic;">(doppio clic per scaricare)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + Aggiorna tutti i Feed + + + + + Delete + Cancella + + + + + Rename + Rinomina + + + Refresh + Aggiorna + + + + Download torrent + Scarica torrent + + + + Open news URL + Apri URL delle notizie + + + + Copy feed URL + Copia URL del Feed + + + + RSS feed downloader + Scaricatore di Feed RSS + + + Create + Crea + + + Delete selected streams + Cancella i flussi selezionati + + + + Refresh RSS streams + Aggiorna i flussi RSS + + + Add a new RSS stream + Aggiungi un nuovo flusso RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>News:</b> <i>(doppio-clic per aprire il link nel tuo browser web)</i> + + + Add RSS stream + Aggiungi flusso RSS + + + Refresh all streams + Aggiorna tutti i flussi + + + RSS streams: + Flussi RSS: + + + 2 + 2 + + + Mark all as read + Segna tutti come letti + + + + RSSImp + + + Please type a rss stream url + Per favore digitare l'indirizzo di un flusso rss + + + + Stream URL: + Indirizzo del flusso: + + + Please choose a new name for this stream + Per favore scegliere un nuovo nome per questo flusso + + + New stream name: + Nuovo nome del flusso: + + + + + Are you sure? -- qBittorrent + Sei sicuro? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Sei sicuro di voler cancellare questo flusso dalla lista ? + + + + + &Yes + &Sì + + + + + &No + &No + + + Are you sure you want to delete this stream from the list? + Sei sicuro di voler cancellare questo flusso dalla lista? + + + Description: + Descrizione: + + + url: + indirizzo: + + + Last refresh: + Ultimo aggiornamento: + + + + Please choose a folder name + Per favore scegliere un nome cartella + + + + Folder name: + Nome cartella: + + + + New folder + Nuova cartella + + + + Overwrite attempt + Tentativo di sovrascrittura + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Impossibile sovrascrivere %1. + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + Questo feed rss è già nella lista. + + + + Are you sure you want to delete these elements from the list? + Sei sicuro di voler cancellare questi elementi dalla lista? + + + + Are you sure you want to delete this element from the list? + Sei sicuro di voler cancellare questo elemento dalla lista? + + + + Please choose a new name for this RSS feed + Per favore scegliere un nuovo nome per questo Feed RSS + + + + New feed name: + Nuovo nome Feed: + + + + Name already in use + Nome già in uso + + + + This name is already used by another item, please choose another one. + Questo nome è già in uso da un altro elemento, per favore sceglierne un altro. + + + + Date: + Data: + + + + Author: + Autore: + + + + Unread + Non letti + + + + RssItem + + + No description available + Descrizione non disponibile + + + + RssStream + + %1 ago + 10min ago + %1 fa + + + + Automatically downloading %1 torrent from %2 RSS feed... + Download automatico del torrent %1 dal Feed RSS %2... + + + Never + Mai + + + + SearchCategories + + + All categories + Tutte le categorie + + + + Movies + Film + + + + TV shows + Programmi TV + + + + Music + Musica + + + + Games + Giochi + + + + Anime + Anime + + + + Software + Software + + + + Pictures + Immagini + + + + Books + Libri + + + + SearchEngine + + Name + i.e: file name + Nome + + + Size + i.e: file size + Dimensione + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Motore di ricerca + + + + Empty search pattern + Campo di ricerca vuoto + + + + Please type a search pattern first + Per favore inserire prima un campo di ricerca + + + No search engine selected + Nessun motore di ricerca selezionato + + + You must select at least one search engine. + Selezionare almeno un motore di ricerca. + + + + + Results + Risultati + + + + Searching... + Ricerca in corso... + + + Search plugin update -- qBittorrent + Aggiornamento del plugin di ricerca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Esiste una nuova versione del plugin di ricerca, vuoi aggiornarlo? + +Changelog: + + + + &Yes + &Sì + + + &No + &No + + + Search plugin update + Aggiornato il plugin di ricerca + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Spiacenti, il server è momentaneamente irraggiungibile. + + + Your search plugin is already up to date. + Il plugin di ricerca è già aggiornato. + + + + Cut + Taglia + + + + Copy + Copia + + + + Paste + Incolla + + + + Clear field + Azzera campo + + + + Clear completion history + Azzera cronologia completamento + + + + Search Engine + Motore di Ricerca + + + + + Search has finished + La ricerca è terminata + + + + An error occured during search... + Si è verificato un errore durante la ricerca... + + + + Search aborted + Ricerca annullata + + + + Search returned no results + La ricerca non ha prodotto risultati + + + + Results + i.e: Search results + Risultati + + + Search plugin download error + Errore nel download del plugin di ricerca + + + Couldn't download search plugin update at url: %1, reason: %2. + Impossibile aggiornare il plugin all'url: %1, motivo: %2. + + + + + Unknown + Sconosciuto + + + + SearchTab + + + Name + i.e: file name + Nome + + + + Size + i.e: file size + Dimensione + + + + Seeders + i.e: Number of full sources + Seeders + + + + Leechers + i.e: Number of partial sources + Leechers + + + + Search engine + Motore di ricerca + + + + TrackersAdditionDlg + + + Trackers addition dialog + Dialogo per l'aggiunta dei tracker + + + + List of trackers to add (one per line): + Lista dei tracker da aggiungere (uno per riga): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Per favore contattami se vuoi tradurre qBittorrent nella tua lingua. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Vorrei ringraziare le seguenti persone che si sono rese volontarie per tradurre qBittorrent: + + + Preview impossible + Anteprima impossibile + + + Sorry, we can't preview this file + Spiacenti, non è possibile fare un'anteprima di questo file + + + Name + Nome + + + Size + Dimensione + + + Progress + Progresso + + + No URL entered + Nessuna URL inserita + + + Please type at least one URL. + Per favore inserire almeno un URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Perpiacere contattami se vorresti tradurre qBittorrent nel tuo linguaggio + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Vorrei ringraziare le seguenti persone che si sono rese volontarie per tradurre qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Per favore contattami se vorresti tradurre qBittorrent nella tua lingua. + + + + addTorrentDialog + + + Torrent addition dialog + Dialogo per l'aggiunta di un torrent + + + + Save path: + Directory di salvataggio: + + + + ... + ... + + + + Torrent size: + Dimensione del torrent: + + + + + Unknown + Sconosciuta + + + + Free disk space: + Spazio libero sul disco: + + + + Torrent content: + Contenuto del torrent: + + + + Download in sequential order (slower but good for previewing) + Scarica nell'ordine giusto (più lento ma migliore per le anteprime) + + + File name + Nome del file + + + File size + Dimensione del file + + + Selected + Selezionato + + + Download in correct order (slower but good for previewing) + Scarica nell'ordine giusto (più lento ma migliore per le anteprime) + + + + Add to download list in paused state + Aggiungi fra i download mettendolo in pausa + + + + Add + Aggiungi + + + + Cancel + Cancella + + + Unselect + De-Seleziona + + + Select + Seleziona + + + + Ignored + Ignora + + + + Normal + Normale + + + + High + Alta + + + + Maximum + Massima + + + + Collapse all + Riduci tutto + + + Expand All + Espandi tutto + + + + Expand all + Espandi tutto + + + + authentication + + + + Tracker authentication + Autenticazione del tracker + + + + Tracker: + Tracker: + + + + Login + Accesso + + + + Username: + Nome utente: + + + + Password: + Password: + + + + Log in + Log in + + + + Cancel + Annulla + + + + bandwidth_dlg + + + Bandwidth allocation + Allocazione banda + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + %1 ha raggiunto il rapporto massimo impostato. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' è stato cancellato permanentemente. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' è stato rimosso. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' fermato. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' ripreso. + + + + '%1' is not a valid magnet URI. + '%1' non è un URI magnetico valido. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' è già nella lista dei download. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ripreso. (recupero veloce) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' è stato aggiunto alla lista dei download. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Impossibile decifrare il file torrent: '%1' + + + + This file is either corrupted or this isn't a torrent. + Questo file è corrotto o non è un torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>è stato bloccato a causa dei tuoi filtri IP</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>è stato bannato a causa di parti corrotte</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Download ricorsivo del file %1 incluso nel torrent %2 + + + + Unable to decode %1 torrent file. + Impossibile decifrare il file torrent %1. + + + + Couldn't listen on any of the given ports. + Impossibile mettersi in ascolto sulle porte scelte. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: mappatura porte fallita, messaggio: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: mappatura porte riuscita, messaggio: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Il recupero veloce del torrent %1 è stato rifiutato, altro tentativo in corso... + + + + Url seed lookup failed for url: %1, message: %2 + Fallito seed web per l'indirizzo: %1, messaggio: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Download di '%1' in corso... + + + + createTorrentDialog + + + Torrent Creation Tool + Strumento di creazione torrent + + + Create Torrent file + Crea file Torrent + + + ... + ... + + + Directory + Directory + + + Create + Crea + + + + Cancel + Annulla + + + <center>Destination torrent file:</center> + <center>Destinazione del file torrent:</center> + + + <center>Input file or directory:</center> + <center>File o directory da aggiungere:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>URL di annuncio:<br>(uno per riga)</center> + + + <center>Comment:</center> + <center>Commenti</center> + + + + Torrent file creation + Creazione file torrent + + + Input files or directories: + File o directory da inserire: + + + + Announce urls (trackers): + Indirizzo.web.di annuncio (tracker): + + + + Comment (optional): + Commento (facoltativo): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privato (non sarà condiviso su rete senza tracker / DHT se abilitato) + + + Destination torrent file: + File torrent di destinazione: + + + + Web seeds urls (optional): + Indirizzo dei seed web (facoltativo): + + + Input file or directory: + File o directory da aggiungere: + + + + File or folder to add to the torrent: + File o cartella da aggiungere al torrent: + + + Add a file + Aggiungi un file + + + Add a folder + Aggiungi una cartella + + + + Add file + Aggiungi file + + + + Add folder + Aggiungi cartella + + + + Piece size: + Dimensione parte: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + Privato (non sarà condiviso su rete DHT se abilitata) + + + + Start seeding after creation + Iniziare a distribuire dopo la creazione + + + + Create and save... + Crea e salva... + + + + Progress: + Avanzamento: + + + + createtorrent + + + Select destination torrent file + Selezionare il file torrent di destinazione + + + + Torrent Files + File torrent + + + Select input directory or file + File o directory da aggiungere + + + No destination path set + Nessuna directory di salvataggio definita + + + Please type a destination path first + Per favore inserire prima una directory di salvataggio + + + + No input path set + Nessun percorso da inserire definito + + + + Please type an input path first + Per favore scegliere prima un percorso da inserire + + + Input path does not exist + Il percorso da aggiungere non esiste + + + Please type a correct input path first + Per favore inserire un percorso da aggiungere corretto + + + + + + Torrent creation + Creazione di un torrent + + + + Torrent was created successfully: + Il torrent è stato creato correttamente: + + + + Select a folder to add to the torrent + Seleziona una cartella da aggiungere al torrent + + + Select files to add to the torrent + Selezionare i file da aggiungere al torrent + + + + Please type an announce URL + Per favore digitare un indirizzo web di annuncio + + + + Torrent creation was unsuccessful, reason: %1 + Creazione torrent fallita, motivo: %1 + + + + Announce URL: + Tracker URL + Indirizzo web di annuncio: + + + + Please type a web seed url + Per favore inserire l'indirizzo di un seed web + + + + Web seed URL: + Indirizzo del seed web: + + + + Select a file to add to the torrent + Selezionare un file da aggiungere al torrent + + + No tracker path set + Nessun percorso del tracker definito + + + Please set at least one tracker + Per favore impostare almeno un tracker + + + + Created torrent file is invalid. It won't be added to download list. + Il torrent creato non è valido. Non sarà aggiunto alla lista dei download. + + + + downloadFromURL + + + Download Torrents from URLs + Scarica torrent da indirizzo web + + + + Only one URL per line + Solo un indirizzo.web per riga + + + + Download + Download + + + + Cancel + Annulla + + + + Download from urls + Download da indirizzo web + + + + No URL entered + Nessun indirizzo.web inserito + + + + Please type at least one URL. + Per favore inserire almeno un indirizzo web. + + + + downloading + + + Search + Ricerca + + + Total DL Speed: + Velocità totale download: + + + KiB/s + KiB/s + + + Session ratio: + Rapporto di condivisione: + + + Total UP Speed: + Velocità totale upload: + + + Log + Log + + + IP filter + Filtro IP + + + + Start + Avvia + + + + Pause + Ferma + + + + Delete + Cancella + + + Clear + Pulisci + + + + Preview file + Anteprima file + + + + Set upload limit + Imposta limite di upload + + + + Set download limit + Imposta limite di download + + + + Delete Permanently + Cancella permanentemente + + + + Torrent Properties + Proprietà del torrent + + + + Open destination folder + Apri cartella di destinazione + + + + Name + Nome + + + + Size + Dimensione + + + + Progress + Avanzamento + + + + DLSpeed + Velocità DL + + + + UpSpeed + Velocità UP + + + + Seeds/Leechs + Seeds/Leechs + + + + Ratio + Rapporto + + + + ETA + ETA + + + + Buy it + Acquista + + + + Priority + Priorità + + + + Increase priority + Aumenta priorità + + + + Decrease priority + Diminuisci priorità + + + + Force recheck + Forza ricontrollo + + + + Copy magnet link + Copia link magnetico + + + + engineSelect + + + Search plugins + Plugin di ricerca + + + + Installed search engines: + Motori di ricerca installati: + + + + Name + Nome + + + + Url + Indirizzo + + + + Enabled + Attivato + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Puoi ottenere altri plugin di ricerca qui: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + Installane uno nuovo + + + + Check for updates + Controlla gli aggiornamenti + + + + Close + Chiudi + + + + Enable + Abilita + + + + Disable + Disabilita + + + + Uninstall + Disinstalla + + + + engineSelectDlg + + True + Vero + + + False + Falso + + + + Uninstall warning + Avviso di disinstallazione + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Alcuni plugin non possono essere disinstallati perché sono inclusi in qBittorrent. + Solo quelli aggiunti possono essere disinstallati. +Comunque, quei plugin sono stati disabilitati. + + + + Uninstall success + Disinstallazione riuscita + + + All selected plugins were uninstalled successfuly + Tutti i plugin selezionati sono stati disinstallati con successo + + + + Select search plugins + Seleziona plugin di ricerca + + + + + qBittorrent search plugins + Plugin di ricerca di qBittorrent + + + + + + + + + + + Search plugin install + Installare plugin di ricerca + + + + + + Yes + + + + + + + + No + No + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Una versione più recente del plugin di ricerca %1 è già installata. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato aggiornato con successo. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato installato con successo. + + + + + + + + Search plugin update + Aggiornato il plugin di ricerca + + + + + Sorry, update server is temporarily unavailable. + Spiacente, il server è momentaneamente non disponibile. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato aggiornato con successo. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Spiacente, l'aggiornamento del plugin di ricerca %1 è fallito. + + + + All your plugins are already up to date. + Tutti i plugin sono già aggiornati. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Non è stato possibile aggiornare %1, mantengo la versione attuale. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Non è stato possibile installare il plugin di ricerca %1. + + + + All selected plugins were uninstalled successfully + Tutti i plugin selezionati sono stati disinstallati con successo + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato aggiornato con successo. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato installato con successo. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + Il plugin di ricerca %1 è stato aggiornato con successo. + + + + Search engine plugin archive could not be read. + Non è stato possibile leggere l'archivio dei plugin dei motori di ricerca. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Spiacente, l'installazione del plugin di ricerca %1 è fallita. + + + + New search engine plugin URL + Indirizzo del nuovo plugin di ricerca + + + + URL: + Indirizzo web: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + h + hours + h + + + d + days + gg + + + Unknown + Sconosciuto + + + m + minutes + m + + + h + hours + h + + + + Unknown + Unknown (size) + Sconosciuta + + + + < 1m + < 1 minute + < 1m + + + + %1m + e.g: 10minutes + %1m + + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + Opzioni salvate correttamente! + + + Choose Scan Directory + Scegliere la directory da scansire + + + Choose save Directory + Scegliere la directory dei downloads + + + Choose ipfilter.dat file + Scegliere il file ipfilter.dat + + + I/O Error + Errore I/O + + + Couldn't open: + Impossibile aprire: + + + in read mode. + in modalità lettura. + + + Invalid Line + Linea non valida + + + Line + Linea + + + is malformed. + è malformata. + + + Range Start IP + Inizio intervallo IP + + + Start IP: + IP iniziale: + + + Incorrect IP + IP non corretto + + + This IP is incorrect. + Questo IP non è corretto + + + Range End IP + Fine intervallo IP + + + End IP: + IP finale: + + + IP Range Comment + Commento intervallo IP + + + Comment: + Commento: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + Scegliere il programma di anteprima preferito + + + Invalid IP + IP invalido + + + This IP is invalid. + Questo IP è invalido. + + + Options were saved successfully. + Le opzioni sono state salvate. + + + + + Choose scan directory + Scegliere una directory + + + Choose an ipfilter.dat file + Scegliere un file ipfilter.dat + + + + + Choose a save directory + Scegliere una directory di salvataggio + + + I/O Error + Input/Output Error + Errore I/O + + + Couldn't open %1 in read mode. + Impossibile aprire %1 in lettura. + + + + + Choose an ip filter file + Scegliere un file ip filter + + + + + Filters + Filtri + + + + pluginSourceDlg + + + Plugin source + Origine del plugin + + + + Search plugin source: + Origine del plugin di ricerca: + + + + Local file + File locale + + + + Web link + Link web + + + + preview + + + Preview selection + Anteprima della selezione + + + + File preview + Anteprima del file + + + + The following files support previewing, <br>please select one of them: + I seguenti file supportano l'anteprima, <br>per favore sceglierne uno: + + + + Preview + Anteprima + + + + Cancel + Annulla + + + + previewSelect + + + + Preview impossible + Anteprima impossibile + + + + + Sorry, we can't preview this file + Spiacente, non è possibile visuallizzare l'anteprima di questo file + + + + Name + Nome + + + + Size + Dimensione + + + + Progress + Avanzamento + + + + properties + + + Torrent Properties + Proprietà del torrent + + + File Name + Nome del file + + + Current Session + Sessione corrente + + + Download state: + Stato download: + + + + OK + OK + + + Finished + Finito + + + Queued for checking + In coda per il controllo + + + Checking files + Controllo files + + + Connecting to tracker + In connessione al tracker + + + Downloading Metadata + Scaricando i metadata + + + Downloading + Downloading + + + Seeding + Seeding + + + Allocating + Allocando + + + + Unknown + Sconosciuto + + + Complete: + Completo: + + + Partial: + Parziale: + + + + Files contained in current torrent: + File contenuti nel torrent selezionato: + + + + Size + Dimensione + + + Selected + Selezionato + + + Unselect + De-Seleziona + + + Select + Seleziona + + + You can select here precisely which files you want to download in current torrent. + Qui puoi scegliere quali file scaricare. + + + Tracker + Tracker + + + + Trackers: + Tracker: + + + + + None - Unreachable? + Nessuno - Irraggiungibile? + + + Errors: + Errori: + + + + Progress + Avanzamento + + + Main infos + Informazioni principali + + + Number of peers: + Numero di peer: + + + + Current tracker: + Tracker corrente: + + + + Total uploaded: + Upload totale: + + + + Main info + Informazioni principali + + + + Torrent information + Informazioni sul torrent + + + + Total downloaded: + Download totale: + + + + Total failed: + Fallimenti totali: + + + + Torrent content + Contenuto del torrent + + + Options + opzioni + + + + Download in correct order (slower but good for previewing) + Scarica nell'ordine giusto (più lento, ma migliore per le anteprime) + + + Share Ratio: + Percentuale di condivisione (ratio): + + + Seeders: + Seeders: + + + Leechers: + Leechers: + + + + Save path: + Directory di salvataggio: + + + Torrent infos + Informazioni sul torrent + + + + Creator: + Creatore: + + + + Torrent hash: + Hash del torrent: + + + + Comment: + Commento: + + + + Current session + Sessione corrente + + + + Share ratio: + Rapporto di condivisione: + + + + Trackers + Tracker + + + New tracker + Nuovo tracker + + + New tracker url: + URL del nuovo tracker: + + + + Priorities: + Priorità: + + + + Normal: normal priority. Download order is dependent on availability + Normale: priorità normale. L'ordine dei download dipende dalla disponibilità + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Alta: più alta della priorità normale. Le parti sono preferite alle altre con la stessa disponibilità, ma non a quelle con minore disponibilità + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Massima: priorità massima, la disponibilità è ignorata, le parti sono preferite su tutte le altre con minore priorità + + + + File name + Nome del file + + + + + Priority + Priorità + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + La lista dei tracker non può essere vuota. + + + + Ignored: file is not downloaded at all + Ignora: il file non viene scaricato + + + + Ignored + Ignora + + + + Normal + Normale + + + + Maximum + Massima + + + + High + Alta + + + + Url seeds + Seed web + + + + The following url seeds are available for this torrent: + I seguenti seed web sono disponibili per questo torrent: + + + None + i.e: No error message + Nessuno + + + + New url seed + New HTTP source + Nuovo seed web + + + + New url seed: + Nuovo seed web: + + + + This url seed is already in the list. + Questo seed web è già nella lista. + + + Hard-coded url seeds cannot be deleted. + Gli url seed codificati non possono essere cancellati. + + + + Priorities error + Errore di priorità + + + + Error, you can't filter all the files in a torrent. + Errore, non è possibile filtrare tutti i file in un torrent. + + + + Downloaded pieces + Parti scaricate + + + + Collapse all + Riduci tutto + + + + Expand all + Espandi tutto + + + + ... + ... + + + + + Choose save path + Scegliere una directory di salvataggio + + + + Save path creation error + Errore nella creazione della directory di salvataggio + + + + Could not create the save path + Impossibile creare la directory di salvataggio + + + + search_engine + + + + Search + Ricerca + + + Search Engines + Motori di ricerca + + + Search Pattern: + Campo di ricerca: + + + Stop + Ferma + + + + Status: + Stato: + + + + Stopped + Fermato + + + Results: + Risultati: + + + + Download + Download + + + Clear + Pulisci + + + Update search plugin + Aggiorna plugin di ricerca + + + + Search engines... + Motori di ricerca... + + + Close tab + Chiudi scheda + + + + seeding + + + Search + Ricerca + + + The following torrents are finished and shared: + I seguenti torrent sono completati e in condivisione: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Nota:<u/> E' importante lasciare i torrent in condivisione dopo il loro completamento per il bene della rete. + + + + Start + Avvia + + + + Pause + Ferma + + + + Delete + Cancella + + + + Delete Permanently + Cancella permanentemente + + + + Torrent Properties + Proprietà del torrent + + + + Preview file + Anteprima file + + + + Set upload limit + Imposta limite di upload + + + + Open destination folder + Apri cartella di destinazione + + + + Name + Nome + + + + Size + Dimensione + + + + Upload Speed + Velocità upload + + + + + Connected peers + Peer connessi + + + + + Seeds / Leechers + Seeds / Leechs + + + + Copy magnet link + Copia link magnetico + + + Leechers + Leechers + + + + Ratio + Rapporto + + + + Buy it + Acquista + + + + Total uploaded + Upload totale + + + Priority + Priorità + + + Increase priority + Aumenta priorità + + + Decrease priority + Diminuisci priorità + + + + Force recheck + Forza ricontrollo + + + + subDownloadThread + + + Host is unreachable + Host non raggiungibile + + + + File was not found (404) + File non trovato (404) + + + + Connection was denied + Connessione negata + + + + Url is invalid + Indirizzo non valido + + + + I/O Error + Errore I/O + + + Connection forbidden (403) + Connessione vietata (403) + + + Connection was not authorized (401) + Connessione non autorizzata (401) + + + Content has moved (301) + Il contenuto è stato spostato (301) + + + + Connection failure + Connessione fallita + + + + Connection was timed out + Connessione scaduta + + + + Incorrect network interface + Interfaccia di rete non corretta + + + + Unknown error + Errore sconosciuto + + + + Could not resolve proxy + Impossibile risolvere proxy + + + + torrentAdditionDialog + + True + Vero + + + + + Unable to decode torrent file: + Impossibile decodificare il file torrent: + + + This file is either corrupted or this isn't a torrent. + Questo file è corrotto o non è un torrent. + + + + + Choose save path + Scegliere una directory di salvataggio + + + False + Falso + + + Unknown + Sconosciuto + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 rimasti dopo il download del torrent) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 ancora per il download del torrent) + + + + Empty save path + Directory di salvataggio vuota + + + + Please enter a save path + Inserire per favore una directory di salvataggio + + + + Save path creation error + Errore nella creazione della directory di salvataggio + + + + Could not create the save path + Impossibile creare la directory di salvataggio + + + + Invalid file selection + Selezione file non valida + + + + You must select at least one file in the torrent + Devi selezionare almeno un file nel torrent + + + + File name + Nome del file + + + + Size + Dimensione + + + + Progress + Avanzamento + + + + + Priority + Priorità + + + diff --git a/src/lang/qbittorrent_ja.qm b/src/lang/qbittorrent_ja.qm new file mode 100644 index 0000000000000000000000000000000000000000..d56863be9c5dd5f94d1cda45b5ca5588a256490a GIT binary patch literal 38110 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 + + + + AboutDlg + + + About qBittorrent + qBittorrent のバージョン情報 + + + + About + バージョン情報 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Author + 作者 + + + + Name: + 名前: + + + + Country: + 国: + + + + E-mail: + 電子メール: + + + + Home page: + ホーム ページ: + + + + Christophe Dumez + Christophe Dumez + + + + France + フランス + + + Thanks To + 謝辞 + + + + Translation + 翻訳 + + + + License + ライセンス + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + bittorrent クライアントは Qt4 および libtorrent を使用し、C++ でプログラムされています。<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>ホーム ページ:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + 誕生日: + + + + Occupation: + 職業: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + コンピュータ科学の学生 + + + + Thanks to + 謝辞 + + + + BandwidthAllocationDialog + + + Upload limit: + アップロード制限: + + + + Download limit: + ダウンロード制限: + + + + + + + Unlimited + Unlimited (bandwidth) + 無制限 + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + + + + + General + 一般 + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + オプション -- qBittorrent + + + Options + オプション + + + Main + メイン + + + Save Path: + 保存パス: + + + Download Limit: + ダウンロード制限: + + + Upload Limit: + アップロード制限: + + + Max Connects: + 最大接続数: + + + Port range: + ポートの範囲: + + + ... + ... + + + Disable + 無効にする + + + connections + 個の接続 + + + + Proxy + プロキシ + + + Proxy Settings + プロキシの設定 + + + Server IP: + サーバー IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + ポート: + + + Proxy server requires authentication + プロキシ サーバーは認証を必要とします + + + + + + Authentication + 認証 + + + User Name: + ユーザー名: + + + + + + Password: + パスワード: + + + Enable connection through a proxy server + プロキシ サーバーを通じての接続を有効にする + + + OK + OK + + + Cancel + キャンセル + + + Scanned Dir: + スキャン済みディレクトリ: + + + Enable directory scan (auto add torrent files inside) + ディレクトリ スキャンを有効にする (torrent ファイル内部の自動追加) + + + Share ratio: + 共有率: + + + + Activate IP Filtering + IP フィルタをアクティブにする + + + + Filter Settings + フィルタの設定 + + + Start IP + 開始 IP + + + End IP + 最終 IP + + + Origin + オリジン + + + Comment + コメント + + + Apply + 適用 + + + + IP Filter + IP フィルタ + + + Add Range + (sp)範囲の追加 + + + Remove Range + (sp)範囲の削除 + + + ipfilter.dat Path: + ipfilter.dat のパス: + + + Go to systray when minimizing window + ウィンドウの最小化時にシステムトレイへ移動する + + + Misc + + + + Localization + 地方化 + + + + Language: + 言語: + + + Behaviour + 動作 + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL =(sp) + + + KiB UP max. + KiB UP 最大。 + + + Preview program + プログラムのプレビュー + + + Audio/Video player: + オーディオ/ビデオ プレーヤー: + + + Always display systray messages + 常にシステムトレイ メッセージを表示する + + + Display systray messages only when window is hidden + ウィンドウが隠れたときのみシステムトレイ メッセージを表示する + + + Never display systray messages + システムトレイ メッセージを表示しない + + + DHT configuration + DHT 構成 + + + + DHT port: + DHT ポート: + + + Language + 言語 + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>注意:</b> 変更は qBittorrent が再起動された後に適用されます。 + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>翻訳の注意:</b> qBittorrent がお使いの言語で利用できない場合、<br/>そして母国語に翻訳したい場合は、<br/>ご連絡ください (chris@qbittorrent.org)。 + + + Display a torrent addition dialog everytime I add a torrent + Torrent を追加するごとに torrent の追加ダイアログを表示する + + + Default save path + 既定の保存パス + + + Disable DHT (Trackerless) + DHT (トラッカレス) を無効にする + + + Disable Peer eXchange (PeX) + eer eXchange (PeX) を無効にする + + + Go to systray when closing main window + メイン ウィンドウが閉じられるときにシステムトレイへ移動する + + + + Connection + 接続 + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (トラッカレス) + + + UPnP port forwarding + UPnP ポート転送 + + + Disable UPnP port forwarding + UPnP ポート転送を無効にする + + + UPnP configuration + UPnP 構成 + + + UPnP port: + UPnP ポート: + + + Torrent addition + Torrent の追加 + + + Main window + メイン ウィンドウ + + + Systray messages + システムトレイ メッセージ + + + Directory scan + ディレクトリ スキャン + + + Style (Look 'n Feel) + スタイル (外観) + + + + Plastique style (KDE like) + プラスチック スタイル (KDE 風) + + + Cleanlooks style (GNOME like) + クリアルック スタイル (GNOME 風) + + + Motif style (default Qt style on Unix systems) + Motif スタイル (既定の Unix システムでの Qt スタイル) + + + + CDE style (Common Desktop Environment like) + CDE スタイル (Common Desktop Environment 風) + + + MacOS style (MacOSX only) + MacOS スタイル (MacOSX のみ) + + + Exit confirmation when the download list is not empty + ダウンロードの一覧が空ではないときに終了を確認する + + + Disable systray integration + システムトレイ統合を無効にする + + + WindowsXP style (Windows XP only) + WindowsXP スタイル (Windows XP のみ) + + + Server IP or url: + サーバーの IP または url: + + + Proxy type: + プロキシの種類: + + + + + HTTP + HTTP + + + + SOCKS5 + SOCKS5 + + + + Affected connections + 影響された接続 + + + + Use proxy for connections to trackers + トラッカへの接続にプロキシを使用する + + + + Use proxy for connections to regular peers + 通常のピアへの接続にプロキシを使用する + + + + Use proxy for connections to web seeds + Web シードへの接続にプロキシを使用する + + + + Use proxy for DHT messages + DHT メッセージへの接続にプロキシを使用する + + + Encryption + 暗号化 + + + Encryption state: + 暗号化の状況: + + + + Enabled + 有効 + + + + Forced + 強制済み + + + + Disabled + 無効 + + + + Preferences + 環境設定 + + + General + 一般 + + + + User interface settings + ユーザー インターフェイスの設定 + + + + Visual style: + 視覚スタイル: + + + + Cleanlooks style (Gnome like) + クリーンルック スタイル (Gnome 風) + + + + Motif style (Unix like) + モチーフ スタイル (Unix 風) + + + + Ask for confirmation on exit when download list is not empty + ダウンロードの一覧が空ではないときの終了時の確認を質問する + + + + Display current speed in title bar + タイトル バーに現在の速度を表示する + + + + System tray icon + システム トレイ アイコン + + + + Disable system tray icon + システム トレイ アイコンを無効にする + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + トレイへ閉じる + + + + Minimize to tray + トレイへ最小化する + + + + Show notification balloons in tray + トレイに通知バルーンを表示する + + + Media player: + メディア プレーヤー: + + + + Downloads + ダウンロード + + + Put downloads in this folder: + このフォルダにダウンロードを置く: + + + + Pre-allocate all files + すべてのファイルを前割り当てする + + + + When adding a torrent + Torrent の追加時 + + + + Display torrent content and some options + Torrent の内容といくつかのオプションを表示する + + + + Do not start download automatically + The torrent will be added to download list in pause state + 自動的にダウンロードを開始しない + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + フォルダの監視 + + + + UI + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + Download list: + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + このフォルダに torrent プリセットを自動的にダウンロードする: + + + + Listening port + 傾聴するポート + + + to + i.e: 1200 to 1300 + から + + + + Enable UPnP port mapping + UPnP ポート マップを有効にする + + + + Enable NAT-PMP port mapping + NAT-PMP ポート マップを有効にする + + + + Global bandwidth limiting + グローバル大域幅制限 + + + + Upload: + アップロード: + + + + Download: + ダウンロード: + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + 種類: + + + + + (None) + (なし) + + + + + Proxy: + プロキシ: + + + + + + Username: + ユーザー名: + + + + Bittorrent + Bittorrent + + + + Connections limit + 接続制限 + + + + Global maximum number of connections: + グローバル最大接続数: + + + + Maximum number of connections per torrent: + Torrent あたりの最大接続数: + + + + Maximum number of upload slots per torrent: + Torrent あたりの最大アップロード スロット数: + + + Additional Bittorrent features + Bittorrent の追加機能 + + + + Enable DHT network (decentralized) + DHT ネットワーク (分散) を有効にする + + + Enable Peer eXchange (PeX) + Peer eXchange (PeX) を有効にする + + + + Enable Local Peer Discovery + ローカル ピア ディスカバリを有効にする + + + + Encryption: + 暗号化: + + + + Share ratio settings + 共有率の設定 + + + + Desired ratio: + 希望率: + + + + Filter file path: + フィルタのファイル パス: + + + + transfer lists refresh interval: + 転送の一覧の更新の間隔: + + + + ms + ms + + + + + RSS + RSS + + + + RSS feeds refresh interval: + RSS フィードの更新の間隔: + + + + minutes + + + + + Maximum number of articles per feed: + フィードあたりの最大記事数: + + + + File system + ファイル システム + + + + Remove finished torrents when their ratio reaches: + 率の達成時に完了済み torrent を削除する: + + + + System default + システム既定 + + + + Start minimized + 最小化して起動する + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + 転送リストのダブル クリックの動作 + + + In download list: + ダウンロードの一覧: + + + Pause/Start torrent + Torrent の一時停止/開始 + + + Open destination folder + 作成先のフォルダを開く + + + Display torrent properties + Torrent のプロパティを表示する + + + In seeding list: + シードの一覧: + + + + Web UI + + + + + Port used for incoming connections: + + + + + Random + + + + + Enable Web User Interface + + + + + HTTP Server + + + + + Enable RSS support + + + + + RSS settings + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Torrent queueing + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + 名前 + + + + Size + i.e: file size + サイズ + + + + Progress + i.e: % downloaded + 進行状況 + + + + DL Speed + i.e: Download speed + DL 速度 + + + + UP Speed + i.e: Upload speed + UP 速度 + + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + 速度/リーチ + + + + Ratio + + + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 が開始されました。 + + + Be careful, sharing copyrighted material without permission is against the law. + ご用心ください、許可なしの著作権のある材料の共有は法律に違反しています。 + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>はブロックされました</i> + + + Fast resume data was rejected for torrent %1, checking again... + 高速再開データは torrent %1 を拒絶しました、再びチェックしています... + + + Url seed lookup failed for url: %1, message: %2 + 次の url の url シードの参照に失敗しました: %1、メッセージ: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' がダウンロードの一覧に追加されました。 + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' が再開されました。 (高速再開) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' はすでにダウンロードの一覧にあります。 + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent ファイルをデコードすることができません: '%1' + + + This file is either corrupted or this isn't a torrent. + このファイルは壊れているかこれは torrent ではないかのどちらかです。 + + + Couldn't listen on any of the given ports. + 所定のポートで記入できませんでした。 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1' をダウンロードしています、お待ちください... + + + + Hide or Show Column + 列の非表示または表示 + + + Priority + 優先度 + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O エラー + + + + + + Couldn't open %1 in read mode. + 読み込みモードで %1 を開くことができませんでした。 + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + 完了しました + + + + Name + i.e: file name + 名前 + + + + Size + i.e: file size + サイズ + + + + Seeds / Leechers + + + + + Connected peers + + + + Progress + i.e: % downloaded + 進行状況 + + + DL Speed + i.e: Download speed + DL 速度 + + + + UP Speed + i.e: Upload speed + UP 速度 + + + Seeds/Leechs + i.e: full/partial sources + 速度/リーチ + + + Status + 状態 + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + 完了済み + + + None + i.e: No error message + なし + + + + Ratio + + + + Leechers + i.e: full/partial sources + リーチャ + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Hide or Show Column + 列の非表示または表示 + + + Priority + 優先度 + + + + GUI + + + Open Torrent Files + Torrent ファイルを開く + + + This file is either corrupted or this isn't a torrent. + このファイルは壊れているかこれは torrent ではないかのどちらかです。 + + + + + + + + &Yes + はい(&Y) + + + + + + + + &No + いいえ(&N) + + + + Are you sure you want to delete the selected item(s) in download list? + ダウンロードの一覧にある選択されたアイテムを削除してもよろしいですか? + + + Connecting... + 接続しています... + + + Downloading... + ダウンロードしています.... + + + + Torrent Files + Torrent ファイル + + + + + + + Are you sure? -- qBittorrent + よろしいですか? -- qBittorrent + + + Couldn't listen on any of the given ports. + 所定のポートで記入できませんでした。 + + + Status + 状態 + + + Paused + 一時停止済み + + + Preview process already running + プレビュー処理はすでに起動中です + + + There is already another preview process running. +Please close the other one first. + すでに別のプレビュー処理が起動中です。 +まず他の 1 つを閉じてください。 + + + + Download finished + ダウンロードが完了しました + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + ダウンロードの一覧およびハード ドライブにある選択されたアイテムを削除してもよろしいですか? + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + 接続状態: + + + Offline + オフライン + + + No peers found... + ピアが見つかりません... + + + Name + i.e: file name + 名前 + + + Size + i.e: file size + サイズ + + + Progress + i.e: % downloaded + 進行状況 + + + DL Speed + i.e: Download speed + DL 速度 + + + UP Speed + i.e: Upload speed + UP 速度 + + + Seeds/Leechs + i.e: full/partial sources + 速度/リーチ + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 が開始されました。 + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + DL 速度: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + UP 速度: %1 KiB/s + + + Checking... + i.e: Checking already downloaded parts... + チェックしています... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + 失速しました + + + + Are you sure you want to quit? + 終了してもよろしいですか? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' は削除されました。 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' がダウンロードの一覧に追加されました。 + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' が再開されました。 (高速再開) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' はすでにダウンロードの一覧にあります。 + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent ファイルをデコードすることができません: '%1' + + + None + i.e: No error message + なし + + + All downloads were paused. + すべてのダウンロードが一時停止されました。 + + + '%1' paused. + xxx.avi paused. + '%1' が停止されました。 + + + Connecting... + i.e: Connecting to the tracker... + 接続しています... + + + All downloads were resumed. + すべてのダウンロードが再開されました。 + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' が再開されました。 + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 はダウンロードが完了しました。 + + + + I/O Error + i.e: Input/Output Error + I/O エラー + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + %1 の読み込みまたは書き込みを試行にエラーが発生しました。ディスクはおそらくいっぱいです、ダウンロードは一時停止されました + + + + Connection Status: + 接続状態: + + + + Online + オンライン + + + Firewalled? + i.e: Behind a firewall/router? + ファイアウォールされましたか? + + + No incoming connections... + 次期接続がありません... + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1' をダウンロードしています、お待ちください... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + エラーが発生しました (ディスクいっぱい?)、'%1' が停止されました。 + + + + Search + 検索 + + + + RSS + RSS + + + UPnP: no WAN service detected... + UPnP: WAN サービスが検出されません... + + + UPnP: WAN service detected! + UPnP: WAN が検出されました! + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent は次のポートに拘束されています: %1 + + + DHT support [ON], port: %1 + DHT サポート [オン]、ポート: %1 + + + + + DHT support [OFF] + DHT サポート [オフ] + + + UPnP support [ON], port: %1 + UPnP サポート [オン]、ポート: %1 + + + + UPnP support [OFF] + UPnP サポート [オフ] + + + + PeX support [ON] + PeX サポート [オン] + + + PeX support [OFF] + PeX サポート [オフ] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + ダウンロードの一覧は空ではありません。 +qBittorrent を終了してもよろしいですか? + + + + + Downloads + ダウンロード + + + + Finished + 完了しました + + + Are you sure you want to delete the selected item(s) in finished list and in hard drive? + 完了済みの一覧およびハード ドライブにある選択されたアイテムを削除してもよろしいですか? + + + + Are you sure you want to delete the selected item(s) in finished list? + ダウンロードの一覧にある選択されたアイテムを削除してもよろしいですか? + + + + UPnP support [ON] + UPnP サポート [オン] + + + Be careful, sharing copyrighted material without permission is against the law. + ご用心ください、許可なしの著作権のある材料の共有は法律に違反しています。 + + + + Encryption support [ON] + 暗号化サポート [オン] + + + + Encryption support [FORCED] + 暗号化サポート [強制済み] + + + + Encryption support [OFF] + 暗号化サポート [オフ] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>はブロックされました</i> + + + Ratio + + + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3、Ctrl+F + + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + + Url download error + Url のダウンロード エラー + + + + Couldn't download file at url: %1, reason: %2. + 次の url にあるファイルをダウンロードできませんでした: %1、理由: %2。 + + + Fast resume data was rejected for torrent %1, checking again... + 高速再開データは torrent %1 を拒絶しました、再びチェックしています... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + ダウンロードの一覧とハード ドライブから選択されたアイテムを削除してもよろしいですか? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + 完了済みの一覧とハード ドライブから選択されたアイテムを削除してもよろしいですか? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' は永久に削除されました。 + + + Url seed lookup failed for url: %1, message: %2 + 次の url の url シードの参照に失敗しました: %1、メッセージ: %2 + + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' はその率が設定した最大値を達成したので削除されました。 + + + + NAT-PMP support [ON] + NAT-PMP サポート [オン] + + + + NAT-PMP support [OFF] + NAT-PMP サポート [オフ] + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + ローカル ピア ディスカバリ [オン] + + + + Local Peer Discovery support [OFF] + ローカル ピア ディスカバリ [オフ] + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s、UP: %3KiB/s) + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + Options were saved successfully. + オプションの保存に成功しました。 + + + + MainWindow + + Log: + ログ: + + + Total DL Speed: + 全体の DL 速度: + + + Total UP Speed: + 全体の UP 速度: + + + &Options + オプション(&O) + + + + &Edit + 編集(&E) + + + + &File + ファイル(&F) + + + + &Help + ヘルプ(&H) + + + + Open + 開く + + + + Exit + 終了 + + + + Preferences + 環境設定 + + + + About + バージョン情報 + + + + Start + 開始 + + + + Pause + 一時停止 + + + + Delete + 削除 + + + + Pause All + すべて一時停止 + + + + Start All + すべて開始 + + + + Torrent Properties + Torrent のプロパティ + + + + Download from URL + URL からダウンロード + + + KiB/s + KiB/s + + + + Create torrent + Torrent の作成 + + + Session ratio: + セッション率: + + + + Preview file + ファイルのプレビュー + + + + Clear log + ログのクリア + + + + Delete Permanently + 永久に削除 + + + + Visit website + ウェブサイトの訪問 + + + + Report a bug + バグの報告 + + + Downloads + ダウンロード + + + + Set upload limit + アップロード制限の設定 + + + + Set download limit + ダウンロード制限の設定 + + + + Documentation + 資料 + + + Log + ログ + + + IP filter + IP フィルタ + + + + Set global download limit + グローバル ダウンロード制限の設定 + + + + Set global upload limit + グローバル アップロード制限の設定 + + + + Options + オプション + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + False + False + + + True + True + + + + + Ignored + 無視済み + + + + + + Normal + Normal (priority) + 通常 + + + + + High + High (priority) + + + + + + Maximum + Maximum (priority) + 最大 + + + + RSS + + + Search + 検索 + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + Bullet + + + + + Article title + + + + + Feed URL + + + + + + Update + + + + + New folder + + + + + RSS feeds + + + + RSS streams: + RSS ストリーム: + + + + + Update all feeds + + + + News: + ニュース: + + + + + Delete + 削除 + + + + + Rename + 名前の変更 + + + Refresh + 更新 + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + Create + 作成 + + + RSS streams : + RSS ストリーム : + + + Delete selected streams + 選択されたストリームを削除します + + + + Refresh RSS streams + RSS ストリームの更新 + + + Add a new RSS stream + 新しい RSS ストリームを追加します + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>ニュース:</b> <i>(お使いの web ブラウザでリンクを開くにはダブルクリックします)</i> + + + Add RSS stream + RSS ストリームの追加 + + + Refresh all streams + すべてのストリームの更新 + + + 2 + 2 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + Mark all as read + すべてを既読にする + + + + RSSImp + + + Please type a rss stream url + rss ストリームの url を入力してください + + + + Stream URL: + ストリームの URL: + + + Please choose a new name for this stream + このストリームの新しい名前を選択してください + + + New stream name: + 新しいストリーム名: + + + no description avalaible + 利用可能な説明がありません + + + + + Are you sure? -- qBittorrent + よろしいですか? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + 一覧からこのストリームを削除してもよろしいですか ? + + + + + &Yes + はい(&Y) + + + + + &No + いいえ(&N) + + + no refresh + 更新なし + + + Are you sure you want to delete this stream from the list? + 一覧からこのストリームを削除してもよろしいですか ? + + + Description: + 説明: + + + url: + url: + + + Last refresh: + 最後の更新: + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + この rss フィードはすでに一覧にあります。 + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + 日付: + + + + Author: + 作者: + + + + Unread + + + + + RssItem + + + No description available + 説明が利用できません + + + + RssStream + + %1 ago + 10min ago + %1 前 + + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + Never + しない + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + 名前 + + + Size + i.e: file size + サイズ + + + Seeders + i.e: Number of full sources + シーダ + + + Leechers + i.e: Number of partial sources + リーチャ + + + Search engine + 検索エンジン + + + + Empty search pattern + 検索パターンを空にする + + + + Please type a search pattern first + まず検索パターンを入力してください + + + No search engine selected + 検索エンジンが選択されていません + + + You must select at least one search engine. + 少なくとも 1 つの検索エンジンを選択する必要があります。 + + + + + Results + 結果 + + + + Searching... + 検索しています... + + + Search plugin update -- qBittorrent + 検索プラグイン更新 -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + 検索プラグインは更新できます、更新しますか? + +変更ログ: + + + + &Yes + はい(&Y) + + + &No + いいえ(&N) + + + Search plugin update + 検索プラグイン更新 + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + すみません、更新サーバーが一時的に利用不可能です。 + + + Your search plugin is already up to date. + お使いの検索プラグインはすでに最新です。 + + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Search Engine + 検索エンジン + + + + + Search has finished + 検索は完了しました + + + + An error occured during search... + 検索中にエラーが発生しました... + + + + Search aborted + 検索が中止されました + + + + Search returned no results + 検索結果がありません + + + + Results + i.e: Search results + 結果 + + + Search plugin download error + 検索プラグインのダウンロード エラー + + + Couldn't download search plugin update at url: %1, reason: %2. + 次の url にある検索プラグインの更新をダウンロードできませんでした: %1、理由: %2。 + + + + + Unknown + 不明 + + + + SearchTab + + + Name + i.e: file name + 名前 + + + + Size + i.e: file size + サイズ + + + + Seeders + i.e: Number of full sources + シーダ + + + + Leechers + i.e: Number of partial sources + リーチャ + + + + Search engine + 検索エンジン + + + + TrackersAdditionDlg + + + Trackers addition dialog + + + + + List of trackers to add (one per line): + + + + + Ui + + I would like to thank the following people who volunteered to translate qBittorrent: + qBittorrent の翻訳にボランティアしてくださった以下の方々に感謝したいと思います: + + + Preview impossible + プレビューが不可能です + + + Sorry, we can't preview this file + すみません、このファイルをプレビューできません + + + Name + 名前 + + + Size + サイズ + + + Progress + 進行状況 + + + No URL entered + URL が入力されていません + + + Please type at least one URL. + 少なくとも 1 つの URL を入力してください。 + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + qBittorrent を自分の言語に翻訳したいとお思いならご連絡ください。 + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + qBittorrent の翻訳にボランティアしてくださった以下の方々に感謝したいと思います: + + + + Please contact me if you would like to translate qBittorrent into your own language. + qBittorrent を自分の言語に翻訳したいとお思いならご連絡ください。 + + + + addTorrentDialog + + + Torrent addition dialog + Torrent の追加ダイアログ + + + + Save path: + 保存パス: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + 不明 + + + + Free disk space: + + + + + Torrent content: + Torrent の内容: + + + + Download in sequential order (slower but good for previewing) + + + + File name + ファイル名 + + + File size + ファイル サイズ + + + Selected + 選択済み + + + Download in correct order (slower but good for previewing) + 正しい順にダウンロードする (より遅いがプレビューにはふさわしい) + + + + Add to download list in paused state + 一時停止済み状態でダウンロードの一覧に追加する + + + + Add + 追加 + + + + Cancel + キャンセル + + + Unselect + 選択しない + + + Select + 選択 + + + + Ignored + 無視済み + + + + Normal + 通常 + + + + High + + + + + Maximum + 最大 + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + トラッカ認証 + + + + Tracker: + トラッカ: + + + + Login + ログイン + + + + Username: + ユーザー名: + + + + Password: + パスワード: + + + + Log in + ログ イン + + + + Cancel + キャンセル + + + + bandwidth_dlg + + + Bandwidth allocation + 大域幅の割り当て + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' は永久に削除されました。 + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' は削除されました。 + + + '%1' paused. + e.g: xxx.avi paused. + '%1' が停止されました。 + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' が再開されました。 + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' はすでにダウンロードの一覧にあります。 + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' が再開されました。 (高速再開) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' がダウンロードの一覧に追加されました。 + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent ファイルをデコードすることができません: '%1' + + + + This file is either corrupted or this isn't a torrent. + このファイルは壊れているかこれは torrent ではないかのどちらかです。 + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + 所定のポートで記入できませんでした。 + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + + Fast resume data was rejected for torrent %1, checking again... + 高速再開データは torrent %1 を拒絶しました、再びチェックしています... + + + + Url seed lookup failed for url: %1, message: %2 + 次の url の url シードの参照に失敗しました: %1、メッセージ: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1' をダウンロードしています、お待ちください... + + + + createTorrentDialog + + Create Torrent file + Torrent ファイルの作成 + + + ... + ... + + + Create + 作成 + + + + Cancel + キャンセル + + + Directory + ディレクトリ + + + + Torrent Creation Tool + Torrent 作成ツール + + + <center>Destination torrent file:</center> + <center>作成先の torrent ファイル:</center> + + + <center>Input file or directory:</center> + <center>入力ファイルまたはディレクトリ:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>公表 url :<br>(行あたり 1 つ)</center> + + + <center>Comment:</center> + <center>コメント:</center> + + + + Torrent file creation + Torrent ファイルの作成 + + + Input files or directories: + ファイルまたはディレクトリの入力: + + + + Announce urls (trackers): + アナウンス url (トラッカ): + + + URL seeds (optional): + URL シード (オプション): + + + + Comment (optional): + コメント (オプション): + + + Private (won't be distributed on trackerless network / DHT if enabled) + 非公開 (トラッカレス ネットワーク上に配布されません / 有効なら DHT) + + + Destination torrent file: + Torrent ファイルの作成先: + + + + Web seeds urls (optional): + Web シードの url (オプション): + + + + File or folder to add to the torrent: + Torrent に追加するファイルまたはフォルダ: + + + Add a file + ファイルの追加 + + + Add a folder + フォルダの追加 + + + + Add file + + + + + Add folder + + + + + Piece size: + 一片のサイズ: + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + Private (won't be distributed on DHT network if enabled) + プライベート (有効なら DHT ネットワークで再配布されます) + + + + Start seeding after creation + 作成後にシードを開始する + + + + Create and save... + 作成と保存... + + + + Progress: + + + + + createtorrent + + + Select destination torrent file + 作成先の torrent ファイルを選択します + + + + Torrent Files + Torrent ファイル + + + Select input directory or file + 入力ファイルまたはディレクトリのを選択します + + + No destination path set + 作成先のパスが設定されていません + + + Please type a destination path first + まず保存先のパスを入力してくださいい + + + + No input path set + 入力パスが設定されていません + + + + Please type an input path first + まず入力パスを入力してください + + + Input path does not exist + 入力パスが存在しません + + + + + + Torrent creation + Torrent の作成 + + + + Torrent was created successfully: + Torrent の作成に成功しました: + + + Please type a valid input path first + まず有効な入力パスを入力してください + + + Torrent creation was successfully, reason: %1 + Torrent の作成に成功しました、理由: %1 + + + + Select a folder to add to the torrent + Torrent に追加するフォルダを選択します + + + Select files to add to the torrent + Torrent に追加するファイルを選択します + + + + Please type an announce URL + アナウンス URL を入力してください + + + Announce URL: + アナウンス URL: + + + Please type an URL Seed + URL シードを入力してください + + + URL Seed: + URL シード: + + + + Torrent creation was unsuccessful, reason: %1 + Torrent の作成に成功しませんでした、理由: %1 + + + + Announce URL: + Tracker URL + アナウンス URL: + + + + Please type a web seed url + Web シード の url を入力してください + + + + Web seed URL: + Web シード の URL: + + + + Select a file to add to the torrent + Torrent に追加するファイルを選択します + + + No tracker path set + トラッカ パスが設定されてません + + + Please set at least one tracker + 少なくとも 1 つのトラッカを設定してください + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + URL から Torrent をダウンロード + + + + Only one URL per line + 行あたり 1 つの URL のみ + + + + Download + ダウンロード + + + + Cancel + キャンセル + + + + Download from urls + Url からダウンロード + + + + No URL entered + URL が入力されていません + + + + Please type at least one URL. + 少なくとも 1 つの URL を入力してください。 + + + + downloading + + + Search + 検索 + + + Total DL Speed: + 全体の DL 速度: + + + KiB/s + KiB/s + + + Session ratio: + セッション率: + + + Total UP Speed: + 全体の UP 速度: + + + Log + ログ + + + IP filter + IP フィルタ + + + + Start + 開始 + + + + Pause + 一時停止 + + + + Delete + 削除 + + + Clear + クリア + + + + Preview file + ファイルのプレビュー + + + + Set upload limit + アップロード制限の設定 + + + + Set download limit + ダウンロード制限の設定 + + + + Delete Permanently + 永久に削除 + + + + Torrent Properties + Torrent のプロパティ + + + + Open destination folder + 作成先のフォルダを開く + + + + Name + 名前 + + + + Size + サイズ + + + + Progress + 進行状況 + + + + DLSpeed + DL 速度 + + + + UpSpeed + Up 速度 + + + + Seeds/Leechs + 速度/リーチ + + + + Ratio + + + + + ETA + ETA + + + + Buy it + 購入 + + + + Priority + 優先度 + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + 検索プラグイン + + + + Installed search engines: + インストールされている検索エンジン: + + + + Name + 名前 + + + + Url + Url + + + + Enabled + 有効 + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + ここで新しい検索エンジン プラグインを取得できます: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + 新しいもののインストール + + + + Check for updates + 更新のチェック + + + + Close + 閉じる + + + + Enable + 有効にする + + + + Disable + 無効にする + + + + Uninstall + アンインストール + + + + engineSelectDlg + + True + True + + + False + False + + + + Uninstall warning + アンインストールの警告 + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + 検索プラグインは qBittorrent に含まれているのでアンインストールできません。 + あなた自身で追加されたもののみアンインストールできます。 +しかし、それらのプラグインは無効になります。 + + + + Uninstall success + アンインストール成功 + + + All selected plugins were uninstalled successfuly + すべての選択されたプラグインのアンインストールに成功しました + + + + Select search plugins + 検索プラグインの選択 + + + + + qBittorrent search plugins + qBittorrent 検索プラグイン + + + + + + + + + + + Search plugin install + 検索プラグインのインストール + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + %1 検索エンジン プラグインのより最近のバージョンはすでにインストールされています。 + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + %1 検索エンジン プラグインの更新に成功しました。 + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + %1 検索エンジン プラグインのインストールに成功しました。 + + + + + + + + Search plugin update + 検索プラグインの更新 + + + + + Sorry, update server is temporarily unavailable. + すみません、更新サーバーが一時的に利用不可です。 + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + %1 検索プラグインの更新に成功しました。 + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + すみません、%1 検索プラグインの更新に失敗しました。 + + + + All your plugins are already up to date. + すべてのお使いのプラグインはすでに最新です。 + + + + All selected plugins were uninstalled successfully + すべての選択されたプラグインのアンインストールに成功しました + + + + + + Yes + + + + + + + + No + + + + + Search engine plugin archive could not be read. + 検索エンジン プラグイン アーカイブは読み込めませんでした。 + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 検索エンジン プラグインはインストールできませんでした。 + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 検索エンジン プラグインは更新できませんでした、古いバージョンを維持します。 + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 検索エンジン プラグインの更新に成功しました。 + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 検索エンジン プラグインのインストールに成功しました。 + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + すみません、%1 検索エンジン プラグインのインストールに失敗しました。 + + + + New search engine plugin URL + 新しい検索エンジン プラグインの URL + + + + URL: + URL: + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + Unknown + 不明 + + + + Unknown + Unknown (size) + 不明 + + + + < 1m + < 1 minute + < 1 分 + + + + %1m + e.g: 10minutes + %1 分 + + + + %1h%2m + e.g: 3hours 5minutes + %1 時間 %2 分 + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1 日 %2 時間 %3 分 + + + + options_imp + + Range Start IP + 範囲の開始 IP + + + Start IP: + 開始 IP: + + + Range End IP + 範囲の最終 IP + + + End IP: + 最終 IP: + + + IP Range Comment + IP 範囲のコメント + + + Comment: + コメント: + + + to + <min port> to <max port> + から + + + Choose your favourite preview program + お気に入りのプレビュー プログラムを選択します + + + Invalid IP + 不正な IP + + + This IP is invalid. + この IP は不正です。 + + + Options were saved successfully. + オプションの保存に成功しました。 + + + + + Choose scan directory + スキャンするディレクトリを選択します + + + Choose an ipfilter.dat file + ipfilter.dat ファイルを選択します + + + + + Choose a save directory + 保存ディレクトリを選択します + + + I/O Error + Input/Output Error + I/O エラー + + + Couldn't open %1 in read mode. + 読み込みモードで %1 を開くことができませんでした。 + + + + + Choose an ip filter file + + + + + + Filters + + + + + pluginSourceDlg + + + Plugin source + プラグイン ソース + + + + Search plugin source: + 検索エンジン ソース: + + + + Local file + ローカル ファイル + + + + Web link + Web リンク + + + + preview + + + Preview selection + 選択範囲のプレビュー + + + + File preview + ファイル プレビュー + + + + The following files support previewing, <br>please select one of them: + 以下のファイルがプレビューにサポートされています、<br>これらの 1 つを選択してください: + + + + Preview + プレビュー + + + + Cancel + キャンセル + + + + previewSelect + + + + Preview impossible + プレビューが不可能です + + + + + Sorry, we can't preview this file + すみません、このファイルをプレビューできません + + + + Name + 名前 + + + + Size + サイズ + + + + Progress + 進行状況 + + + + properties + + + Torrent Properties + Torrent のプロパティ + + + File Name + ファイル名 + + + + OK + OK + + + + Unknown + 不明 + + + + Files contained in current torrent: + 現在の torrent に含まれているファイル: + + + + Size + サイズ + + + Selected + 選択済み + + + Unselect + 選択しない + + + Select + 選択 + + + You can select here precisely which files you want to download in current torrent. + どのファイルを現在の torrent にダウンロードしたいかを正確にここで選択できます。 + + + Tracker + トラッカ + + + + Trackers: + トラッカ: + + + + + None - Unreachable? + なし - アンリーチ可能ですか? + + + Errors: + エラー: + + + + Progress + 進行状況 + + + Main infos + メイン情報 + + + + Current tracker: + 現在のトラッカ: + + + + Total uploaded: + 全体のアップロード済み: + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + 現在のダウンロード済み: + + + + Total failed: + 現在の失敗済み: + + + + Torrent content + Torrent の内容 + + + + Download in correct order (slower but good for previewing) + 正しい順にダウンロードする (より遅いがプレビューにはふさわしい) + + + + Save path: + 保存パス: + + + Torrent infos + Torrent 情報 + + + + Creator: + 作成者: + + + + Torrent hash: + Torrent ハッシュ: + + + + Comment: + コメント: + + + + Current session + 現在のセッション + + + + Share ratio: + 共有率: + + + + Trackers + トラッカ + + + New tracker + 新しいトラッカ + + + New tracker url: + 新しいトラッカの url: + + + + Priorities: + 優先度: + + + Ignored: File is not downloaded at all + 無視済み: ファイルはとにかくダウンロードされません + + + + Normal: normal priority. Download order is dependent on availability + 通常: 通常の優先度です。ダウンロードの順序は利用性に依存します + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + 高: 通常より高い優先度です。部分は同じ利用性での部分を超えて優先されますが、より低い利用性での部分は超えません + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + 最大: 最大の優先度です、利用性は無視され、部分はすべてのより低い優先度でのその他の部分を超えて優先されます + + + + File name + ファイル名 + + + + + Priority + 優先度 + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + トラッカの一覧を空にできません。 + + + + Ignored: file is not downloaded at all + 無視済み: ファイルは全くダウンロードされませんでした + + + + Ignored + 無視済み + + + + Normal + 通常 + + + + Maximum + 最大 + + + + High + + + + + Url seeds + Url シード + + + + New url seed: + 新しい url シード: + + + + This url seed is already in the list. + この url シードはすでに一覧にあります。 + + + Hard-coded url seeds cannot be deleted. + ハードコードされた url シードが削除できません。 + + + None + i.e: No error message + なし + + + + New url seed + New HTTP source + 新しい url シード + + + + The following url seeds are available for this torrent: + 以下の url シードはこの torrent に利用可能です: + + + + Priorities error + 優先度エラー + + + + Error, you can't filter all the files in a torrent. + エラーです、torrent のすべてのファイルをフィルタできません。 + + + + Downloaded pieces + ダウンロードされた部分 + + + + Collapse all + + + + + Expand all + + + + + ... + ... + + + + + Choose save path + 保存パスの選択 + + + + Save path creation error + 保存パスの作成エラー + + + + Could not create the save path + 保存パスを作成できませんでした + + + + search_engine + + + + Search + 検索 + + + Search Engines + 検索エンジン + + + Search Pattern: + 検索パターン: + + + Stop + 停止 + + + + Status: + 状態: + + + + Stopped + 停止されました + + + Results: + 結果: + + + + Download + ダウンロード + + + Clear + クリア + + + Update search plugin + 検索プラグインの更新 + + + + Search engines... + 検索エンジン... + + + + seeding + + + Search + 検索 + + + The following torrents are finished and shared: + 以下の torrent は完了および共有しました: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>注意:</u> ネットワークを良好に維持するには完了した後に torrent の共有を維持することが重要です。 + + + + Start + 開始 + + + + Pause + 一時停止 + + + + Delete + 削除 + + + + Delete Permanently + 永久に削除 + + + + Torrent Properties + Torrent のプロパティ + + + + Preview file + ファイルのプレビュー + + + + Set upload limit + アップロード制限の設定 + + + + Open destination folder + 作成先のフォルダを開く + + + + Name + 名前 + + + + Size + サイズ + + + + Upload Speed + アップロード速度 + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + Leechers + リーチャ + + + + Ratio + + + + + Buy it + 購入 + + + + Total uploaded + + + + Priority + 優先度 + + + + Force recheck + + + + + subDownloadThread + + + Host is unreachable + ホストは達成できません + + + + File was not found (404) + ファイルは見つかりませんでした (404) + + + + Connection was denied + 接続は拒否されました + + + + Url is invalid + Url は不正です + + + + I/O Error + I/O エラー + + + Connection forbidden (403) + 接続が禁止されました (403) + + + Connection was not authorized (401) + 接続は権限を許可されませんでした (401) + + + Content has moved (301) + 内容は移動しました (301) + + + + Connection failure + 接続失敗 + + + + Connection was timed out + 接続はタイムアウトしました + + + + Incorrect network interface + 不正確なネットワーク インターフェイスです + + + + Unknown error + 不明なエラーです + + + + Could not resolve proxy + プロキシを解決できませんでした + + + + torrentAdditionDialog + + True + True + + + + + Unable to decode torrent file: + Torrent ファイルをデコードすることができません: + + + This file is either corrupted or this isn't a torrent. + このファイルは壊れているかこれは torrent ではないかのどちらかです。 + + + + + Choose save path + 保存パスの選択 + + + False + False + + + Unknown + 不明 + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + 空の保存パス + + + + Please enter a save path + 保存パスを入力してください + + + + Save path creation error + 保存パスの作成エラー + + + + Could not create the save path + 保存パスを作成できませんでした + + + + Invalid file selection + 不正なファイル選択 + + + + You must select at least one file in the torrent + Torrent では少なくとも 1 つのファイルを選択する必要があります + + + + File name + ファイル名 + + + + Size + サイズ + + + + Progress + 進行状況 + + + + + Priority + 優先度 + + + diff --git a/src/lang/qbittorrent_ko.qm b/src/lang/qbittorrent_ko.qm new file mode 100644 index 0000000000000000000000000000000000000000..79e9ac36e05ba5414170f5b661cb31077e54a505 GIT binary patch literal 56626 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 + + + + @default + + MB + MB + + + + AboutDlg + + + About qBittorrent + 큐비토런트에 대하여 + + + + About + 정보 + + + + Author + 저자 + + + qBitorrent Author + 큐비토런트 제작자 + + + + Name: + 이름: + + + + Country: + 국가: + + + + E-mail: + E-메일: + + + + Home page: + 홈페이지: + + + + Christophe Dumez + 크리스토프 두메스 + + + + France + 프랑스 + + + Thanks To + 도와주신 분들 + + + + Translation + 번역 + + + + License + 라이센스 + + + + <h3><b>qBittorrent</b></h3> + <h3><b>큐비토런트</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + 비트토렌트 프로그램은 Qt4, libtorrent, C++로 제작되었습니다.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + 큐비토런트 제작자 + + + + chris@qbittorrent.org + + + + + http://www.dchris.eu + + + + + Birthday: + 생일: + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">큐비토렌트는 QT4 Toolkit 와 libtorrent-rasterbar 을 기반으로 C++을 만들어진 비토렌트 클라이언트입니다. <br /><br />Copyright ©2006-2009 크리스토퍼 두메스<br /><br /><span style=" text-decoration: underline;">홈페이지:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Occupation: + 직업: + + + + 03/05/1985 + 03/05/1985 + + + + Student in computer science + 컴퓨터과학 대학생 + + + + Thanks to + 다음 분들에게 감사의 말씀을 드립니다 + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + 이 프로그램은 비토렌트 클라이언트로 QT4와 libtorrent를 기반으로 C++로 만들어 졌습니다.<br> +<br> +저작권 © 2006 크리스토프 두메스<br> +<br> <u>홈페이지:</u> <i>http://www.qbittorrent.org</i><br> + + + + BandwidthAllocationDialog + + + Upload limit: + 업로드 제한: + + + + Download limit: + 다운로드 제한: + + + + + + + Unlimited + Unlimited (bandwidth) + 무제한 + + + + KiB/s + + + + + ConsoleDlg + + + qBittorrent console + 큐비토런트 콘솔 + + + + General + 일반 + + + + Blocked IPs + 접속이 금지된 IP + + + + DLListDelegate + + + KiB/s + + + + + Dialog + + Options -- qBittorrent + 설정 -- +큐비토런트 + + + Options + 환경설정 + + + Main + 주요설정 + + + Scanned Dir: + 스캔된 폴더: + + + ... + ... + + + Save Path: + 저장폴더 저장: + + + Download Limit: + 다운로드 속도 제한: + + + Upload Limit: + 업로드 속도 제한: + + + Max Connects: + 최대 동시 연결: + + + Port range: + 포트 영역: + + + Kb/s + Kb/s + + + Disable + 사용하지 않기 + + + connections + 연결 + + + to + 연결 대상 + + + Enable directory scan (auto add torrent files +inside) + 자동 자료목록 +새로고침(받은 자료는 자동적으로 표시될 +것입니다.) + + + + Proxy + 프럭시 (Proxy) + + + Enable connection through a proxy server + 프록시 서버를 통해 연결하기 + + + Proxy Settings + 프록시 설정 + + + Server IP: + 서버 주소: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + 포트: + + + Proxy server requires authentication + 프록시 서버를 사용하기 위해서는 인증확인이 필요합니다 + + + + + + Authentication + 인증 + + + User Name: + 아이디: + + + + + + Password: + 비밀번호: + + + Language + 언어 + + + Please choose your preferred language in the following +list: + 사용할 언어를 +선택하세요 + + + Language settings will take effect after restart. + 언어설정 변경 사항은 프로그램 재시작 시 적용 될것입니다. + + + OK + 확인 + + + Cancel + 취소 + + + Enable directory scan (auto add torrent files inside) + 자동으로 목록 스캔하기(자동적으로 토렌트 파일 추가하기) + + + Please choose your preferred language in the following list: + 사용할 언어를 선택하세요 : + + + Connection Settings + 연결설정 + + + Share ratio: + 공유비율: + + + KB UP max. + KB 최고 업로딩 속도. + + + + Activate IP Filtering + IP 필터링 사용 + + + + Filter Settings + 필터 설정 + + + ipfilter.dat URL or PATH: + ipfilter.dat 웹주소 또는 경로: + + + Start IP + 시작 IP + + + End IP + 끝 IP + + + Origin + 출처 + + + Comment + 설명 + + + Apply + 적용 + + + + IP Filter + IP 필터 + + + Add Range + 범위 확장 + + + Remove Range + 범위 축소 + + + ipfilter.dat Path: + ipfilter.dat 경로: + + + Clear finished downloads on exit + 종료시 완료된 파일목록 삭제 + + + Ask for confirmation on exit + 종료시 확인 + + + Go to systray when minimizing window + 최소화시 시스템 트레이에 아이콘 표시 + + + Misc + 기타 + + + Localization + 변환 + + + + Language: + 언어: + + + Behaviour + 동작 + + + OSD + OSD(On Screen Display) + + + Always display OSD + OSD 항시 표시 + + + Display OSD only if window is minimized or iconified + 창이 최소화할때나 작업창 아이콘이 될때만 OSD 표시 + + + Never display OSD + OSD 표시하지 않기 + + + 1 KiB DL = + 1 KiB 다운로드 = + + + KiB UP max. + KIB 최대 업로드. + + + DHT (Trackerless): + DHT(트렉커 없음): + + + Disable DHT (Trackerless) support + DHT(트렉커 없음) 사용하지 않기 + + + Automatically clear finished downloads + 완료된 목록 자동으로 지우기 + + + Preview program + 미리보기 프로그램 + + + Audio/Video player: + 음악 및 영상 재생기: + + + + + KiB/s + + + + DHT configuration + DHT 설정 + + + + DHT port: + DHT 포트: + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>참고:</b> 수정된 상항은 프로그램 재시작시 적용 될것입니다. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>번역자 노트:</b> 만약 큐비토렌트가 자신이 사용하는 언어로 번역되지 않았고, <br/>자신의 사용하는 언어로 번역/수정 작업에 참여하고 싶다면, <br/>저에게 email을 주십시오 (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + 토렌트 추가시 '토렌트 추가 다이얼로그' 보이기 + + + Default save path + 기본 저장 경로 + + + Systray Messages + 시스템 트레이 아이템 + + + Always display systray messages + 시스템 트레이 아이템 항시 보기 + + + Display systray messages only when window is hidden + 프로그램 윈도우가 최소화시에만 시스템 트레이 아이템 보여주기 + + + Never display systray messages + 시스템 트레이 아이템 사용하지 않기 + + + Disable DHT (Trackerless) + DHT(트렉커 없음) 사용하지 않기 + + + Disable Peer eXchange (PeX) + 피어 익스체인지(Pex) 사용하지 않기 + + + Go to systray when closing main window + 메인 창을 닫을 때 시스템 트레이에 아이템 보여주기 + + + + Connection + 연결 + + + Peer eXchange (PeX) + 피어 익스체인지(Pex) + + + DHT (trackerless) + DHT(트렉커 없음) + + + Torrent addition + 토렌트 추가 + + + Main window + 메인 창 + + + Systray messages + 시스템 트레이 메세지 + + + Directory scan + 디렉터리 스켄 + + + Style (Look 'n Feel) + 스타일 (Look 'n Feel) + + + + Plastique style (KDE like) + Plastique 스타일 (KDE 과 비슷) + + + Cleanlooks style (GNOME like) + 깨끗한 스타일 (GNOME 와 비슷) + + + Motif style (default Qt style on Unix systems) + Motif 스타일 (기본 Qt 스타일 on 유닉스 시스템) + + + + CDE style (Common Desktop Environment like) + CDE 스타일 (Common Desktop Environment과 비슷) + + + MacOS style (MacOSX only) + MacOS 스타일 (MacOSX 전용) + + + Exit confirmation when the download list is not empty + 다운로드 리스트에 있는 파일이 남아 있을때 종료 확인하기 + + + Disable systray integration + 시스템 트레이 아이템 사용하지 않기 + + + WindowsXP style (Windows XP only) + WindowsXP 스타일 (Windows XP 전용) + + + Server IP or url: + 서버 주소 (Server IP or url): + + + Proxy type: + 프락시 종류 (Proxy type): + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + 관련된 연결 + + + + Use proxy for connections to trackers + 트렉커(tracker)에 연결하는데 프락시 사용 + + + + Use proxy for connections to regular peers + 일반 사용자(peer)와 연결하는데 프락시 사용 + + + + Use proxy for connections to web seeds + 웹 완전체(Web seed)와 연결하는데 프락시 사용 + + + + Use proxy for DHT messages + DHT 메세지에 프락시 사용 + + + Encryption + 암호화(Encryption) + + + Encryption state: + 암호화(Encryption) 상태: + + + + Enabled + 사용하기 + + + + Forced + 강제 + + + + Disabled + 사용하지 않기 + + + + Preferences + 선호사항 설정 + + + General + 일반 + + + Network + 네트웍크 + + + + User interface settings + 사용자 인터페이스 정의 + + + + Visual style: + 시각 스타일: + + + + Cleanlooks style (Gnome like) + 깨끗한 스타일 (Gnome과 비슷) + + + + Motif style (Unix like) + 모티브 스타일 (Unix와 비슷) + + + + Ask for confirmation on exit when download list is not empty + 종료시 다운로드 목록에 파일이 남아있다면 종료 확인하기 + + + + Display current speed in title bar + 현재 속도를 타이틀 바에 표시하기 + + + + System tray icon + 시스템 트레이 이이콘 + + + + Disable system tray icon + 시스템 트레이 아이템 사용하지 않기 + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + 창을 닫은 후 시스템 트레이 이이콘으로 + + + + Minimize to tray + 최소화후 시스템 트레이 이이콘으로 + + + + Show notification balloons in tray + 트레이에서 알림창 띄우기 + + + Media player: + 미디어 플레이어: + + + + Downloads + 다운로드 + + + Put downloads in this folder: + 다운로드 된것을 다음 폴더에 보관함: + + + + Pre-allocate all files + 파일을 받기전에 디스크 용량 확보하기 + + + + When adding a torrent + 토렌트를 추가할때 + + + + Display torrent content and some options + 토렌트 내용과 선택사항을 보이기 + + + + Do not start download automatically + The torrent will be added to download list in pause state + 자동 다운로드 시작 사용하기 않기 + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + 폴더 감시 (Folder watching) + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + 현재 진행중인 파일 더블클릭 + + + + Download list: + 다운로드 목록: + + + + + Start/Stop + 시작/멈춤 + + + + + Open folder + 폴더 열기 + + + + + Show properties + 자세한 사항 보기 + + + + Seeding list: + 완료(seeding) 목록: + + + + Download folder: + 다운로드 폴더: + + + + Temp folder: + 임시 폴더: + + + + Automatically download torrents present in this folder: + 이 폴더에 있는 토렌트 파일을 자동으로 다운받기: + + + + Listening port + 포트 연결 + + + to + i.e: 1200 to 1300 + ~ + + + + Enable UPnP port mapping + UPnP 포트 맵핑 사용하기 + + + + Enable NAT-PMP port mapping + NAT-PMP 포트 맵핑 사용하기 + + + + Global bandwidth limiting + 전제 속도 제한하기 + + + + Upload: + 업로드: + + + + Download: + 다운로드: + + + + Bittorrent features + 비토렌트 기능 + + + + Use the same port for DHT and Bittorrent + DHT와 비토렌트에 동일한 포트를 사용하기 + + + + Spoof µtorrent to avoid ban (requires restart) + Ban을 피하기 위해 µtorrent처럼 보이게 하기 (Spoof µtorrent) (이 설정은 재시작을 필요합니다) + + + + + Type: + 종류: + + + + + (None) + (없음) + + + + + Proxy: + 프록시: + + + + + + Username: + 사용자 이름: + + + + Bittorrent + 비트토렌트 + + + + UI + 사용자 인터페이스(UI) + + + + Connections limit + 연결 제한 + + + + Global maximum number of connections: + 최대 전체 연결수 + + + + Maximum number of connections per torrent: + 한 토렌트 파일에 사용할수 있는 최대 연결수: + + + + Maximum number of upload slots per torrent: + 한 토렌트 파일의 업로드에 사용할수 있는 최대 연결수: + + + Additional Bittorrent features + 부과 비토렌트 사항 + + + + Enable DHT network (decentralized) + DHT 네트웍크 (분화됨, decentralized) 사용하기 + + + Enable Peer eXchange (PeX) + 피어 익스체인지(Pex) 사용하기 + + + + Enable Local Peer Discovery + 로컬 네트웍크내 공유자 찾기 (Local Peer Discovery) 사용하기 + + + + Encryption: + 암호화(Encryption) + + + + Share ratio settings + 공유 비율(Radio) 설정 + + + + Desired ratio: + 원하는 할당비(Ratio): + + + + Filter file path: + 필터 파일 경로: + + + + transfer lists refresh interval: + 전송 목록을 업데이트 할 간격: + + + + ms + ms(milli second) + + + + + RSS + + + + + RSS feeds refresh interval: + RSS 을 새로 고칠 시간 간격: + + + + minutes + + + + + Maximum number of articles per feed: + 하나의 소스당 최대 기사수: + + + + File system + 파일 시스템 + + + + Remove finished torrents when their ratio reaches: + 공유비율(Shared Ratio)에 도달했을때 완료된 파일을 목록에서 지우기: + + + + System default + 시스템 디폴트 + + + + Start minimized + 최소화하기 + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Transfer 목록 더블클릭시 실행 + + + In download list: + 다운로드 목록 중: + + + Pause/Start torrent + 멈춤/시작 토렌트 + + + Open destination folder + 저장 폴더 열기 + + + Display torrent properties + 토렌트 목록 표시 + + + In seeding list: + 완료(seeding) 목록중: + + + Folder scan interval: + 폴더 스켄 간격: + + + seconds + + + + Spoof Azureus to avoid ban (requires restart) + Ban을 피하기 위해 Arureus처럼 보이게 하기 (Spoof Azureus) (이 설정은 재시작을 필요합니다) + + + + Web UI + 웹 유저 인터페이스 + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + 더블 클릭시 동작 + + + + Port used for incoming connections: + 다운용(incoming connection) 으로 사용된 포트: + + + + Random + 무작위 + + + + Enable Web User Interface + 웹사용자인터페이스 사용 + + + + HTTP Server + HTTP 서버 + + + + Enable RSS support + RSS 지원을 사용하기 + + + + RSS settings + RSS 설정 + + + + Enable queueing system + 우선 순위 배열 시스템(queueing system) 사용하기 + + + + Maximum active downloads: + 최대 활성 다운로드(Maximum active downloads): + + + + Torrent queueing + 토렌트 배열 + + + + Maximum active torrents: + 최대 활성 토렌트(Maximum active torrents): + + + + Display top toolbar + 상위 도구메뉴 보이기 + + + + Search engine proxy settings + 검색 엔진 프록시 설정 + + + + Bittorrent proxy settings + 비토렌트 프록시 설정 + + + + Maximum active uploads: + 최대 활성 업로드(Maximum active downloads): + + + + DownloadingTorrents + + + Name + i.e: file name + 파일 이름 + + + + Size + i.e: file size + 크기 + + + + Progress + i.e: % downloaded + 진행상황 + + + + DL Speed + i.e: Download speed + 다운로드 속도 + + + + UP Speed + i.e: Upload speed + 업로드 속도 + + + + Seeds/Leechers + i.e: full/partial sources + 완전체 공유자/부분 공유자 + + + Seeds/Leechs + i.e: full/partial sources + 완전체 공유/부분 공유 + + + + Ratio + 비율 + + + + ETA + i.e: Estimated Time of Arrival / Time left + 남은시간 + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + 큐비토런트 %1가 시작되었습니다. + + + Be careful, sharing copyrighted material without permission is against the law. + 허락없이 저작권이 있는 자료를 공유하는 것은 법에 저촉됩니다. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>은/는 막혔습니다</i> + + + Fast resume data was rejected for torrent %1, checking again... + 토렌트 %1는 빨리 이어받기가 사용될수 없습니다, 확인중입니다... + + + Url seed lookup failed for url: %1, message: %2 + 다음 Url 완전체(Url seed)의 검색이 실패하였습니다: %1, 관련내용: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1'가 다운로드 목록에 추가되었습니다. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1'가 다시 시작되었습니다. (빠른 재개) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1'는/은 이미 다운로드 목록에 포함되어 있습니다. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 다음 파일을 디코드할수 없습니다: '%1' + + + This file is either corrupted or this isn't a torrent. + 이 파일은 오류가 있거나 토런트 파일이 아닙니다. + + + Couldn't listen on any of the given ports. + 설정하신 포트에 연결할수 없습니다. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1'을 다운 중입니다, 잠시 기다려 주세요... + + + + Hide or Show Column + 열(Column) 숨기기/보이기 + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping 실패, 메세지: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping 성공, 메세지: %1 + + + Priority + 우선순위 + + + + FeedDownloader + + + RSS Feed downloader + RSS 피드 다운로더 + + + + RSS feed: + RSS 피드: + + + + Feed name + 피드 이름 + + + + Automatically download torrents from this feed + 이 피드에서 자동으로 다운하기 + + + + Download filters + 다운로트 필터 + + + + Filters: + 필터: + + + + Filter settings + 필터 설정사항 + + + + Matches: + 해당: + + + + Does not match: + 해당하지 않음: + + + + Destination folder: + 저장 폴더: + + + + ... + ... + + + + Filter testing + 필터 시험 + + + + Torrent title: + 토렌트 이름: + + + + Result: + 결과: + + + + Test + 시험 + + + + Import... + 가져오기... + + + + Export... + 내보내기... + + + + + Rename filter + 필터 이름 바꾸기 + + + + + Remove filter + 필터 지우기 + + + + Add filter + 필터 추가 + + + + FeedDownloaderDlg + + + New filter + 새 필터 + + + + Please choose a name for this filter + 이 필터 이름을 고르세요 + + + + Filter name: + 필터 이름: + + + + + + Invalid filter name + 부적당한 필터 이름 + + + + The filter name cannot be left empty. + 필터 이름을 꼭 입력하셔야 합니다. + + + + + This filter name is already in use. + 이 필터 이름은 벌써 사용되고 있습니다. + + + + Filter testing error + 핕터 테스트 오류 + + + + Please specify a test torrent name. + 시험용 토렌트 이름을 입력하세요. + + + + matches + 해당 + + + + does not match + 해당하지 않음 + + + + Select file to import + 가져올 파일을 선택하세요 + + + + + Filters Files + 필터 파일 + + + + Import successful + 가져오기 성공 + + + + Filters import was successful. + 필터 가져오기가 성공적으로 이루어졌습니다. + + + + Import failure + 가져오기 실패 + + + + Filters could not be imported due to an I/O error. + I/O 에러에 의하여 필터를 가져 올수 없었습니다. + + + + Select destination file + 저장경로를 선택하세요 + + + + Overwriting confirmation + 덮어쓰기 확인 + + + + Are you sure you want to overwrite existing file? + 현재 시스템에 존재하는 파일에 덮어쓰기를 하려고 합니다 괜찬습니까? + + + + Export successful + 내보내기 성공 + + + + Filters export was successful. + 핕터 내보내기가 성공적으로 이루어졌습니다. + + + + Export failure + 내보내기 실패 + + + + Filters could not be exported due to an I/O error. + I/O 에러에 의하여 필터 내보내기가 실패하였습니다. + + + + FeedList + + + Unread + 안 읽음 + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + I/O 에러 + + + + + + Couldn't open %1 in read mode. + %1을 읽기전용 모드로 열수 없습니다. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + %1은 유효한 PeerGuardian P2B 파일이 아닙니다. + + + + FinishedListDelegate + + + KiB/s + + + + + FinishedTorrents + + Finished + 완료됨 + + + + Name + i.e: file name + 파일 이름 + + + + Size + i.e: file size + 크기 + + + + Seeds / Leechers + 완전체 공유자/부분파일 공유자 + + + + Connected peers + 연결된 사용자 + + + Progress + i.e: % downloaded + 진행상황 + + + DL Speed + i.e: Download speed + 다운로드 속도 + + + + UP Speed + i.e: Upload speed + 업로드 속도 + + + Seeds/Leechs + i.e: full/partial sources + 완전체 공유/부분 공유 + + + Status + 상태 + + + ETA + i.e: Estimated Time of Arrival / Time left + 남은시간 + + + None + i.e: No error message + 없음 + + + + Ratio + 비율 + + + Leechers + i.e: full/partial sources + 파일 공유자(Leechers) + + + + Total uploaded + i.e: Total amount of uploaded data + 총 업로드 + + + + Hide or Show Column + Column 숨기기/보이기 + + + Incomplete torrent in seeding list + Seeding 목록에 포함된 완료되지 못한 토렌트 목룍 + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + 토렌트 '%1'의 상태가 '배포(seeding)' 에서 '다운로딩'으로 전환되었습니다. 다시 '다운로딩' 상태로 전화하시겠습니까? (그렇지 않다면 이 토렌트는 삭제됩니다.) + + + Priority + 우선순위 + + + + GUI + + started. + 시작. + + + DL Speed: + 다운로딩 속도: + + + kb/s + kb/s + + + UP Speed: + 업로딩 속도: + + + + Open Torrent Files + 토런트 파일 열기 + + + + Torrent Files + 토런트 파일 + + + Couldn't create the directory: + 폴더를 만들수가 없습니다: + + + already in download list. + <file> already in download list. + 이미 다운로드 리스트에 포함되어 있습니다. + + + MB + MB + + + kb/s + kb/s + + + Unknown + 알수 없음 + + + added to download list. + 다운로드 목록에 포함하기. + + + resumed. (fast resume) + 다시 시작됨. (빠르게 재개) + + + Unable to decode torrent file: + 토런트 파일을 읽을 수가 없습니다: + + + This file is either corrupted or this isn't a +torrent. + 이 파일은 오류가 있거나 +토런트 파일이 아닙니다. + + + Are you sure? + 재확인해주십시요? + + + Are you sure you want to delete all files in download +list? + 다운로드 목록에 있는 모든 +파일을 지우고 싶으세요? + + + + + + + + &Yes + &예 + + + + + + + + &No + &아니요 + + + Download list cleared. + 다운로딩 목록이 깨끗히 정리되었습니다. + + + Are you sure you want to delete the selected item(s) in +download list? + 다운로딩 목록에서 +선택하신 모든 아이템을 삭제하시겠습니까? + + + removed. + <file> removed. + 삭제됨. + + + Listening on port: + 이미 연결 된 +포트: + + + Couldn't listen on any of the given ports + 설정하신 포트에 연결할수 없습니다 + + + paused + 멈춤 + + + All Downloads Paused. + 모든 다움로드가 멈추었습니다. + + + started + 시작됨 + + + All Downloads Resumed. + 모든 다운로드가 다시 시작되었습니다. + + + paused. + <file> paused. + 멈춤. + + + resumed. + <file> resumed. + 다시 시작됨. + + + + Finished + 완료 + + + Checking... + 확인중... + + + Connecting... + 연결중... + + + Downloading... + 다운로딩 중... + + + m + minutes + + + + h + hours + + + + d + days + + + + This file is either corrupted or this isn't a torrent. + 이 파일은 오류가 있거나 토런트 파일이 아닙니다. + + + Are you sure you want to delete all files in download list? + 다운로드 목록에 있는 모든 파일을 지우고 싶으세요? + + + + Are you sure you want to delete the selected item(s) in download list? + 다운로딩 목록에서 선택하신 모든 아이템을 삭제하시겠습니까? + + + qBittorrent + 큐비토런트 + + + :: By Christophe Dumez :: Copyright (c) 2006 + 개발자: 크리스토프 두메스 :: Copyright (c) 2006 + + + + + qBittorrent + 큐비토런트 + + + + + + + Are you sure? -- qBittorrent + 재확인해주십시요? -- 큐비토런트 + + + <b>Connection Status:</b><br>Online + 연결상태: +연결됨 + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + 연결상태: +방화벽을 사용중이십니까? +<i>연결이 되지않고 있습니다...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + 연결 상태: +오프라인 상태 +<i>다른 사용자를 찾을수 없습니다.</i> + + + <b>qBittorrent</b><br>DL Speed: + 큐비토런트 +다운로딩 속도: + + + has finished downloading. + 가 완료되었습니다. + + + Couldn't listen on any of the given ports. + 설정하신 포트에 연결할수 없습니다. + + + None + 없음 + + + Empty search pattern + 빈 검색 양식 + + + Please type a search pattern first + 검색 양식을 작성해주십시오 + + + No seach engine selected + 검색엔진이 선택되지 않았음 + + + You must select at least one search engine. + 적어도 하나 이상의 검색 엔진을 선택해야 합니다. + + + Searching... + 검색중... + + + Could not create search plugin. + 검색 플러그인을 생성할수 없음. + + + Stopped + 정지됨 + + + I/O Error + I/O 에러 + + + Couldn't create temporary file on hard drive. + 하드 드라이브에서 임시파일을 생성할수 없음. + + + Torrent file URL + 토렌트 파일 URL + + + Downloading using HTTP: + HTTP로 다운로딩 중: + + + Torrent file URL: + 토렌트 파일 URL: + + + A http download failed... + http로 부터 다운로드 실패... + + + A http download failed, reason: + http로 부터 다운로드 실패한 이유: + + + Are you sure you want to quit? -- qBittorrent + 종료하시겠습니까? -- 큐비토런트 + + + Are you sure you want to quit qbittorrent? + 정말로 큐비토런트를 종료하시겠습니까? + + + Timed out + 시간 초과 + + + Error during search... + 검색 중 에러 발생... + + + Failed to download: + 다운로드 실패: + + + A http download failed, reason: + http로 부터 다운로드 실패, 그 이유는 다음과 같습니다: + + + Stalled + 대기중 + + + Search is finished + 검색 완료 + + + An error occured during search... + 검색 중 오류 발생... + + + Search aborted + 검색이 중단됨 + + + Search returned no results + 검색 결과가 없음 + + + Search is Finished + 검색 종료 + + + Search plugin update -- qBittorrent + 검색 플로그인 업데이트 -- 큐비토런트 + + + Search plugin can be updated, do you want to update it? + +Changelog: + + 검색 플로그인 업데이트가 준비 되었습니다, 지금 업데이트 하시겠습니까? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + 죄송합니다. 현재 임시적으로 업데이트 서버가 접속이 불가능합니다. + + + Your search plugin is already up to date. + 현재 최신 검색 엔진 플로그인을 사용중에 있습니다. + + + Results + 결과 + + + Name + 파일 이름 + + + Size + 크기 + + + Progress + 진행상황 + + + DL Speed + 다운로드 속도 + + + UP Speed + 업로드 속도 + + + Status + 상태 + + + ETA + 남은시간 + + + Seeders + 완전체 공유자 + + + Leechers + 부분 공유 + + + Search engine + 검색 엔진 + + + Stalled + state of a torrent whose DL Speed is 0 + 대기중 + + + Paused + 정지됨 + + + Preview process already running + 미리보기가 진행중입니다 + + + There is already another preview process running. +Please close the other one first. + 미리보기가 진행중입니다. +다른 미리보기를 닫아주세요. + + + Couldn't download + Couldn't download <file> + 다운로드 실패 + + + reason: + Reason why the download failed + 이유: + + + Downloading + Example: Downloading www.example.com/test.torrent + 다운로딩 중 + + + Please wait... + 기다려주십시오... + + + Transfers + 전송 + + + Are you sure you want to quit qBittorrent? + 정말로 큐비토런트를 종료하시겠습니까? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + 정말로 지금 선택하신 파일들을 다운로드 목록과 하드 드라이브에서 삭제하시겠습니까? + + + + Download finished + 다운로드 완료 + + + has finished downloading. + <filename> has finished downloading. + 가 완료되었습니다. + + + Search Engine + 검색 엔진 + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + 큐비토런트 %1 + + + + + Connection status: + 연결 상태: + + + Offline + 오프라인 + + + No peers found... + 피어가 없습니다... + + + Name + i.e: file name + 파일 이름 + + + Size + i.e: file size + 크기 + + + Progress + i.e: % downloaded + 진행상황 + + + DL Speed + i.e: Download speed + 다운로드 속도 + + + UP Speed + i.e: Upload speed + 업로드 속도 + + + Seeds/Leechs + i.e: full/partial sources + 완전체 공유/부분 공유 + + + ETA + i.e: Estimated Time of Arrival / Time left + 남은시간 + + + Seeders + i.e: Number of full sources + 완전체 공유자 + + + Leechers + i.e: Number of partial sources + 부분 공유 + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + 큐비토런트 %1가 시작되었습니다. + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + 다운로딩 속도: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + 업로딩 속도: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + 완료되었습니다 + + + Checking... + i.e: Checking already downloaded parts... + 확인중... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + 대기중 + + + + Are you sure you want to quit? + 정말로 종료하시겠습니까? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' 가 삭제되었습니다. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1'가 다운로드 목록에 추가되었습니다. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1'가 다시 시작되었습니다. (빠른 재개) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1'는/은 이미 다운로드 목록에 포함되어 있습니다. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 다음 파일을 디코드할수 없습니다: '%1' + + + None + i.e: No error message + 없음 + + + Listening on port: %1 + e.g: Listening on port: 1666 + 이미 연결 된 포트: %1 + + + All downloads were paused. + 모든 다운로드가 멈추었습니다. + + + '%1' paused. + xxx.avi paused. + '%1'가 정지 되었습니다. + + + Connecting... + i.e: Connecting to the tracker... + 연결중... + + + All downloads were resumed. + 모든 다운로드가 다시 시작되었습니다. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' 가 다운로드를 다시 시작되었습니다. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1가 다운로드를 완료하였습니다. + + + + I/O Error + i.e: Input/Output Error + I/O 에러 + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + %1을 사용하려고 하던 중 오류가 발생했습니다. 디스크 용량이 꽉찼고 다운로드가 중지되었습니다 + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + 오류 발생 (디스크가 꽉찼습니까?), '%1'가 정지 되었습니다. + + + + Connection Status: + 연결 상태: + + + + Online + 온라인 + + + Firewalled? + i.e: Behind a firewall/router? + 방화벽이 설치되어있습니까? + + + No incoming connections... + 받는 연결이 없습니다... + + + No search engine selected + 검색엔진이 선택되지 않았음 + + + Search plugin update + 검색 엔진 플러그인 업데이트 + + + Search has finished + 검색 완료 + + + Results + i.e: Search results + 결과 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1'을 다운 중입니다, 잠시 기다려 주세요... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + 오류 발생 (디스크가 꽉찼습니까?), '%1'가 정지 되었습니다. + + + + Search + 검색 + + + + RSS + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + 다음 파일에서 IO오류가 발생하였습니다 (%1). + 이유: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + 큐비토런트는 다음 포트을 사용하고 있습니다: %1 + + + DHT support [ON], port: %1 + DHT 지원 [사용함], 포트: %1 + + + + + DHT support [OFF] + DHT 지원 [사용안함] + + + + PeX support [ON] + Pes 지원 [사용함] + + + PeX support [OFF] + Pes 지원 [사용안함] + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + 다운로드 리스트가 파일이 있습니다. +큐비토런트를 종료하시겠습니까? + + + + + Downloads + 다운로드 + + + + Are you sure you want to delete the selected item(s) in finished list? + 현재 완료목록에서 선택된 파일을 지우시겠습니까? + + + + UPnP support [ON] + UPnp 지원 [사용함] + + + Be careful, sharing copyrighted material without permission is against the law. + 허락없이 저작권이 있는 자료를 공유하는 것은 법에 저촉됩니다. + + + + Encryption support [ON] + 암호화(Encryption) 지원 [사용함] + + + + Encryption support [FORCED] + 암호화(Encryption) 지원 [강압적으로 사용] + + + + Encryption support [OFF] + 암호화(Encryption) 지원 [사용안함] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>은/는 막혔습니다</i> + + + Ratio + 비율 + + + + Alt+1 + shortcut to switch to first tab + + + + + Alt+2 + shortcut to switch to second tab + + + + + Alt+4 + shortcut to switch to fourth tab + + + + + Url download error + Url 다운로드 오류 + + + + Couldn't download file at url: %1, reason: %2. + 다음 주소(Url)에서 파일을 다운로드할수 없습니다: %1, 이유:%2. + + + Fast resume data was rejected for torrent %1, checking again... + 토렌트 %1는 빨리 이어받기가 사용될수 없습니다, 확인중입니다... + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + 다운로드 목록에서 선택된 파일을 하드 드라이버에서도 지우시겠습니까? + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + 완료 목록에서 선택된 파일을 하드 드라이버에서도 지우시겠습니까? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' 는 영구삭제 되었습니다. + + + Url seed lookup failed for url: %1, message: %2 + 다음 Url 완전체(Url seed)의 검색이 실패하였습니다: %1, 관련내용: %2 + + + + Alt+3 + shortcut to switch to third tab + + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + 큐비토런트는 다음 포트을 사용하고 있습니다: TCP/%1 + + + + UPnP support [OFF] + UPnP 지원 [사용안함] + + + + NAT-PMP support [ON] + NAT-PMP 지원 [사용함] + + + + NAT-PMP support [OFF] + NAT-PMP 지원 [사용안함] + + + + DHT support [ON], port: UDP/%1 + DHT 지원 [사용함], 포트:'UDP/%1 + + + + Local Peer Discovery [ON] + Local Peer Discovery (로컬 네트웍크내 공유자 찾기) [사용함] + + + + Local Peer Discovery support [OFF] + Local Peer Discovery (로컬 네트웍크내 공유자 찾기) [사용안함] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + 사용자께거 지정하신 할당율에 도달하였기에 '%1'는(은) 목록에서 삭제되었습니다. + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + 큐비토런트 버젼: %1 (DL: %2KiB/s, UP: %3KiB/s) + + + + + DL: %1 KiB/s + 다운로딩 속도: %1 KiB/s + + + + + UP: %1 KiB/s + 업로딩 속도: %1 KiB/s + + + + + Ratio: %1 + 비율: %1 + + + + + DHT: %1 nodes + DHT: %1 노드(nodes) + + + + + No direct connections. This may indicate network configuration problems. + 직접적으로 연결된 네트워크를 찾지 못했습니다. 네트워크 설정에 의해 발생된 오류일 가능성이 있습니다. + + + + Uploads + 업로드 + + + + Options were saved successfully. + 설정이 성공적으로 저장되었습니다. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + 큐비토런트 :: 개발자: 크리스토프 두메스 + + + Log: + 로그: + + + Total DL Speed: + 총 다운로드 속도: + + + Kb/s + Kb/s + + + Total UP Speed: + 총 업로드 속도: + + + Name + 파일 이름 + + + Size + 크기 + + + % DL + % 상태 + + + DL Speed + 다운로드 속도 + + + UP Speed + 업로드 속도 + + + Status + 상태 + + + ETA + 남은시간 + + + &Options + &설정 + + + + &Edit + &편집 + + + + &Help + &도움말 + + + + &File + &파일 + + + + Open + 열기 + + + + Exit + 끝내기 + + + + Preferences + 설정사항 + + + + About + 정보 + + + + Start + 시작 + + + + Pause + 정지 + + + + Delete + 삭제 + + + + Pause All + 모두 멈추기 + + + + Start All + 모두 시작하기 + + + + Documentation + 참고자료 + + + Connexion Status + 연결 상태 + + + Delete All + 모두 삭제 + + + + Torrent Properties + 토렌트 구성요소 + + + Connection Status + 연결 상태 + + + Downloads + 다운로드 + + + Search + 검색 + + + Search Pattern: + 검색 양식: + + + Status: + 상태: + + + Stopped + 정지됨 + + + Search Engines + 검색 엔진 + + + Results: + 결과: + + + Stop + 정지 + + + Seeds + 완전체 + + + Leechers + 부분 공유 + + + Search Engine + 검색 엔진 + + + + Download from URL + URL로 다운로드 + + + Download + 다운로드 + + + Clear + 모두 지우기 + + + + Create torrent + 토렌트 파일 생성 + + + Ratio: + 비율: + + + Update search plugin + 검색 엔진 업데이트 + + + Session ratio: + 세션 비율: + + + Transfers + 전송 + + + + Preview file + 미리보기 + + + + Clear log + 로그 지우기 + + + + Delete Permanently + 영구 삭제 + + + + Visit website + 웹사이트 방문하기 + + + + Report a bug + 버그 신고하기 + + + + Set upload limit + 업로드 속도 제한하기 + + + + Set download limit + 다운로드 속도 제한하기 + + + Log + 로그 + + + IP filter + IP 필터 + + + + Set global download limit + 총 다운로드 속도 설정 + + + + Set global upload limit + 총 업로드 속도 설정 + + + + Options + 환경설정 + + + + Decrease priority + 우선순위(priority)를 낮추기 + + + + Increase priority + 우선순위(priority)를 낮추기 + + + + Console + 콘솔 + + + + PropListDelegate + + False + 아님 + + + True + 맞음 + + + + + Ignored + 무시 + + + + + + Normal + Normal (priority) + 보통 + + + + + High + High (priority) + 높음 + + + + + Maximum + Maximum (priority) + 최고 + + + + QTextEdit + + Clear + 모두 지우기 + + + + RSS + + + Search + 검색 + + + + + New subscription + 새 구독 + + + + + + Mark items read + 읽은 것으로 표시 + + + + Update all + 다 업데이트하기 + + + + Feed URL + 피드 주소(url) + + + + + Update + 업데이트하기 + + + + New folder + 새 폴더 + + + + RSS feeds + RSS 피드 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">토렌트:</span> <span style=" font-style:italic;">(다운로드하려면 더블 클릭하세요)</span></p></body></html> + + + + Bullet + + + + + Article title + + + + + + Update all feeds + 모든 피드 업데이트하기 + + + + + Delete + 삭제 + + + + + Rename + 이름 바꾸기 + + + Refresh + 새로 고침 + + + + Download torrent + 토렌트 다운로드하기 + + + + Open news URL + 새 주소(url) 열기 + + + + Copy feed URL + 피드 주소(url) 복사 + + + + RSS feed downloader + RSS 피드 다운로더 + + + Create + 생성하기 + + + Delete selected streams + 선택된 스트림 삭제하기 + + + + Refresh RSS streams + RSS 스트림 새로고침 + + + Add a new RSS stream + 새 RSS 스트림 추가 + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>뉴스:</b> <i>(링크를 웹브라우저에서 열려면 더블 클릭하세요)</i> + + + Add RSS stream + RSS 스트림 추가 + + + Refresh all streams + 모든 스트림 새로고침 + + + RSS streams: + RSS 스트림: + + + 2 + 2 + + + Mark all as read + 읽은 아이템 표식하기 + + + + RSSImp + + + Please type a rss stream url + RSS 스트림 주소(url)를 입력하세요 + + + + Stream URL: + 스트림 URL: + + + Please choose a new name for this stream + 이 스트림의 이름을 입력하세요 + + + New stream name: + 새 스트림 이름: + + + + + Are you sure? -- qBittorrent + 재확인 해주십시요? -- 큐비토런트 + + + + + &Yes + &예 + + + + + &No + &아니요 + + + Are you sure you want to delete this stream from the list? + 이 스트림을 리스트에서 지우시겠습니까? + + + Description: + 설명: + + + Last refresh: + 최근 새로고침: + + + + Please choose a folder name + 폴더 이름을 고르세요 + + + + Folder name: + 폴도 이름: + + + + New folder + 새 폴더 + + + + Overwrite attempt + 덮어쓰기 시도 + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + %1 아이템은 덮어쓸수 없습니다. + + + + qBittorrent + 큐비토런트 + + + + This rss feed is already in the list. + 이 RSS 피드는 이미 리스트에 포함되어 있습니다. + + + + Are you sure you want to delete these elements from the list? + 이 목록에서 이 자료들을 지우싶으십니까? + + + + Are you sure you want to delete this element from the list? + 이 목록에서 이 자료를 지우싶으십니까? + + + + Please choose a new name for this RSS feed + RSS 피드에 쓸 새 이름을 고르세요 + + + + New feed name: + 새 피드 이름: + + + + Name already in use + 이 이름은 이미 사용중에 있음 + + + + This name is already used by another item, please choose another one. + 이 이름은 이미 다른 아이템이 사용하고 있습니다. 다른 이름을 사용하십시오. + + + + Date: + 날짜: + + + + Author: + 작성자: + + + + Unread + 안 읽음 + + + + RssItem + + + No description available + 관련 자료가 없습니다 + + + + RssStream + + %1 ago + 10min ago + %1분전 + + + + Automatically downloading %1 torrent from %2 RSS feed... + RSS 피드(%2)에서 자동으로 자료(%1) 다운하기... + + + Never + 전혀 사용안함 + + + + SearchCategories + + + All categories + 모든 카테고리 + + + + Movies + 영화 + + + + TV shows + 텔레비젼 쇼 + + + + Music + 음악 + + + + Games + 게임 + + + + Anime + 애니 + + + + Software + 유틸 + + + + Pictures + 사진 + + + + Books + + + + + SearchEngine + + Name + i.e: file name + 파일 이름 + + + Size + i.e: file size + 크기 + + + Seeders + i.e: Number of full sources + 완전체 공유자 + + + Leechers + i.e: Number of partial sources + 부분 공유 + + + Search engine + 검색 엔진 + + + + Empty search pattern + 검색 양식 지우기 + + + + Please type a search pattern first + 검색 양식을 작성해주십시오 + + + No search engine selected + 검색엔진이 선택되지 않았음 + + + You must select at least one search engine. + 적어도 하나 이상의 검색 엔진을 선택해야 합니다. + + + + + Results + 결과 + + + + Searching... + 검색중... + + + Search plugin update -- qBittorrent + 검색 플로그인 업데이트 -- 큐비토런트 + + + Search plugin can be updated, do you want to update it? + +Changelog: + + 검색 플로그인 업데이트가 준비 되었습니다, 지금 업데이트 하시겠습니까? + +Changelog: + + + + &Yes + &예 + + + &No + &아니요 + + + Search plugin update + 검색 엔진 플러그인 업데이트 + + + qBittorrent + 큐비토런트 + + + Sorry, update server is temporarily unavailable. + 죄송합니다. 현재 임시적으로 업데이트 서버가 접속이 불가능합니다. + + + Your search plugin is already up to date. + 님은 현재 최신 검색 엔진 플로그인을 사용중입니다. + + + + Cut + 잘라내기 + + + + Copy + 복사하기 + + + + Paste + 붙이기 + + + + Clear field + 내용 지우기 + + + + Clear completion history + 완료 내역 지우기 + + + + Search Engine + 검색 엔진 + + + + + Search has finished + 검색 완료 + + + + An error occured during search... + 검색 중 오류 발생... + + + + Search aborted + 검색이 중단됨 + + + + Search returned no results + 검색 결과가 없음 + + + + Results + i.e: Search results + 결과 + + + Search plugin download error + 검색 플러그인(plugin) 다운로드 오류 발생 + + + Couldn't download search plugin update at url: %1, reason: %2. + 다음 url에서 검색 플러그인 (Plugin)을 다운로드 할수 없습니다: %1, 이유: %2. + + + + + Unknown + 알려지지 않음 + + + + SearchTab + + + Name + i.e: file name + 파일이름 + + + + Size + i.e: file size + 크기 + + + + Seeders + i.e: Number of full sources + + + + + Leechers + i.e: Number of partial sources + + + + + Search engine + 검색 엔진 + + + + TrackersAdditionDlg + + + Trackers addition dialog + Tracker 입력창 + + + + List of trackers to add (one per line): + Tracker 입력 (한줄에 하나씩): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + 큐비토런트를 번역하는데 도움을 주신 다음 분들에게 다시 한번 감사드립니다: + + + Please contact me if you would like to translate qBittorrent to your own language. + 큐비토런드 번역에 도움을 주실 분은 저에게 연락해 주십시오. + + + qBittorrent + 큐비토런트 + + + I would like to thank sourceforge.net for hosting qBittorrent project. + 큐비토런트 프로잭트를 호스팅해준 소스포지(Sourceforge.net)에 다시 한번 감사드립니다. + + + I would like to thank the following people who volunteered to translate qBittorrent: + 큐비토런트를 번역하는데 도움을 주신 다음 분들에게 다시 한번 감사드립니다: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>큐비토런트 프로잭트를 호스팅해준 소스포지(Sourceforge.net)에 다시 한번 감사드립니다.<li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>또한 RPM 패키지하는데 도움을 준 Fernandez (developer@jefferyfernandez.id.au)에게 감사드립니다.</li></ul> + + + Preview impossible + 미리보기 불가 + + + Sorry, we can't preview this file + 죄송합니다. 이 파일은 미리보기를 할수 없습니다 + + + Name + 파일 이름 + + + Size + 크기 + + + Progress + 진행상황 + + + No URL entered + 주소(URL)가 포함되지 않았습니다 + + + Please type at least one URL. + 적어도 하나의 주소(URL)를 적어주십시오. + + + qBittorrent + 큐비토런트 + + + Please contact me if you would like to translate qBittorrent into your own language. + 큐비토런트를 자신이 사용하는 언어로 번역하는데 관심이 있으시가면 제게 연락을 주십시오. + + + + about + + + qBittorrent + 큐비토런트 + + + + I would like to thank the following people who volunteered to translate qBittorrent: + 큐비토런트를 번역하는데 도움을 주신 다음 분들에게 다시 한번 감사드립니다: + + + + Please contact me if you would like to translate qBittorrent into your own language. + 큐비토런트를 자신이 사용하는 언어로 번역하는데 관심이 있으시가면 제게 연락을 주십시오. + + + + addTorrentDialog + + + Torrent addition dialog + 토렌트 추가 다이얼로그 + + + + Save path: + 저장 경로: + + + + ... + ... + + + + Torrent size: + 토렌트 사이즈: + + + + + Unknown + 알수 없음 + + + + Free disk space: + 남은 디스크 공간: + + + + Torrent content: + 토렌트 내용: + + + + Download in sequential order (slower but good for previewing) + 순차적으로 다운받기(느리지만 미리보기에 좋음) + + + File name + 파일 이름 + + + File size + 파일 크기 + + + Selected + 선택됨 + + + Download in correct order (slower but good for previewing) + 순차적으로 다운받기(느리지만 미리보기에 편합니다) + + + + Add to download list in paused state + 정지 상태로 다운로드 목록에 추가하기 + + + + Add + 추가 + + + + Cancel + 취소 + + + select + 선택 + + + Unselect + 선택하지 않기 + + + Select + 선택 + + + + Ignored + 무시 + + + + Normal + 보통 + + + + High + 높음 + + + + Maximum + 최고 + + + + Collapse all + 모두 접어서 간단하게 보여주기 + + + + Expand all + 다 펼쳐서 보여주기 + + + + authentication + + + + Tracker authentication + 트렉커 인증 + + + + Tracker: + 트렉커: + + + + Login + 로그인 + + + + Username: + 사용자: + + + + Password: + 비밀번호: + + + + Log in + 로그인 + + + + Cancel + 취소 + + + + bandwidth_dlg + + + Bandwidth allocation + 인터넷 속도 분배 + + + + KiB/s + + + + + bittorrent + + + %1 reached the maximum ratio you set. + '%1' 는 설정된 최대 공유 비율에 도달했습니다. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' 는 영구삭제 되었습니다. + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' 가 삭제되었습니다. + + + '%1' paused. + e.g: xxx.avi paused. + '%1'가 정지 되었습니다. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' 가 다운로드를 다시 시작되었습니다. + + + + '%1' is not a valid magnet URI. + '%1'는 유효한 마그넷 URI (magnet URI)가 아닙니다. + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1'는/은 이미 다운로드 목록에 포함되어 있습니다. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1'가 다시 시작되었습니다. (빠른 재개) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1'가 다운로드 목록에 추가되었습니다. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 다음 파일은 해독 할수가 없습니다: '%1' + + + + This file is either corrupted or this isn't a torrent. + 이 파일은 오류가 있거나 토런트 파일이 아닙니다. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>은/는 IP 필터에 의해 접속이 금지되었습니다</i> + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>은/는 유효하지 않은 파일 공유에 의해 접속이 금지되었습니다</i> + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + 토렌트 %2 에는 회귀적 다운로드 파일 %1이 포함되어 있습니다 + + + + Unable to decode %1 torrent file. + %1 토렌트를 해독할수 없습니다. + + + + Couldn't listen on any of the given ports. + 설정하신 포트에 연결할수 없습니다. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping 실패, 메세지: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping 성공, 메세지: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + 토렌트 %1는 빨리 이어받기가 사용될수 없습니다, 확인중입니다... + + + + Url seed lookup failed for url: %1, message: %2 + 다음 Url 완전체(Url seed)의 검색이 실패하였습니다: %1, 관련내용: %2 + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1'을 다운 중입니다, 잠시 기다려 주세요... + + + + createTorrentDialog + + Create Torrent file + 토렌트 파일 만들기 + + + Destination torrent file: + 토렌트 파일 저장 위치: + + + Input file or directory: + 변환 할 파일 또는 폴더 경로: + + + Comment: + 설명: + + + ... + ... + + + Create + 생성하기 + + + + Cancel + 취소 + + + Announce url (Tracker): + 발표 되는 url(Tracker 주소): + + + Directory + 디렉터리 + + + + Torrent Creation Tool + 토렌트 파일 생성도구 + + + <center>Destination torrent file:</center> + <center>토렌트 파일 경로:</center> + + + <center>Input file or directory:</center> + <center>원본 파일 또는 폴더:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>서버 url:<br>(한줄에 하나씩)</center> + + + <center>Comment:</center> + <center>설명:</center> + + + + Torrent file creation + 토렌트 파일 만들기 + + + Input files or directories: + 입력할 파일 또는 폴더 경로: + + + + Announce urls (trackers): + 발표 되는 url(Tracker 주소): + + + + Comment (optional): + 의견(옵션): + + + Private (won't be distributed on trackerless network / DHT if enabled) + 은거하기 (이 기능을 선택하시면 님의 컴퓨터는 trackerless network나 DHT에 알려지지 않을 것입니다) + + + + Web seeds urls (optional): + 웹시드(Web seeds) url (옵션사항): + + + + File or folder to add to the torrent: + 토렌트를 추가할 파일 또는 폴더: + + + Add a file + 파일 추가 + + + Add a folder + 폴더 추가 + + + + Add file + 파일 추가 + + + + Add folder + 폴더 추가 + + + + Piece size: + 조각 크기: + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + 개인적으로 사용하기 (이 기능을 사용하시면 귀하의 파일은 DHT 네트웍크에 배포되지 않을 것입니다) + + + + Start seeding after creation + 생성후 바로 배포 시작하기 + + + + Create and save... + 생성 후 저장하기... + + + + Progress: + 진행: + + + + createtorrent + + + Select destination torrent file + 토렌트 파일을 저장할 위치 지정 + + + + Torrent Files + 토런트 파일 + + + Select input directory or file + 변환할 파일 위치 지정 + + + No destination path set + 저장 경로가 없음 + + + Please type a destination path first + 저장 경로를 설정해 주십시오 + + + + No input path set + 변환할 파일 경로가 설정되지 않았습니다 + + + + Please type an input path first + 파일 경로를 설정해 주십시오 + + + Input path does not exist + 변환할 파일 경로가 존재하지 않습니다 + + + Please type a correct input path first + 변환할 파일 경로를 재설정해 주십시오 + + + + + + Torrent creation + 토렌트 생성 + + + + Torrent was created successfully: + 토렌트가 성공적으로 생성되었습니다: + + + Please type a valid input path first + 먼저 변환 될 파일의 경로를 설정해 주십시오 + + + + Select a folder to add to the torrent + 토텐트를 추가할 폴더를 지정해 주십시오 + + + Select files to add to the torrent + 토렌트를 추가할 파일을 선택해 주십시오 + + + + Please type an announce URL + 발표되는 주소(announce URL)를 입력해 주십시오 + + + + Torrent creation was unsuccessful, reason: %1 + 토렌트 생성이 실패하였습니다, 이유: %1 + + + + Announce URL: + Tracker URL + 발표 되는 url(Tracker 주소): + + + + Please type a web seed url + 웹에 있는 완전체의 주소(web seed url)를 입력해 주십시오 + + + + Web seed URL: + 웹 시드 주소 (Web Seed URL): + + + + Select a file to add to the torrent + 토렌트에 추가할 파일을 선택하십시오 + + + No tracker path set + 트렉커(Tracker) 경로가 설정되지 않았습니다 + + + Please set at least one tracker + 적어도 하나 이상의 트렉커(tracker)을 설정해 주십시오 + + + + Created torrent file is invalid. It won't be added to download list. + 토렌트 파일 목록 생성하기(다운로드 목록에 추가하지 않음). + + + + downloadFromURL + + + Download Torrents from URLs + URL에서 토렌트를 다운받기 + + + + Only one URL per line + 한줄 당 하나의 URL을 쓰십시오 + + + + Download + 다운로드 + + + + Cancel + 취소 + + + + Download from urls + URL로 부터 다운로드 받기 + + + + No URL entered + 주소(URL)가 포함되지 않았습니다 + + + + Please type at least one URL. + 적어도 하나의 주소(URL)를 적어주십시오. + + + + downloading + + + Search + 검색 + + + Total DL Speed: + 총 다운로드 속도: + + + Session ratio: + 세션 비율: + + + Total UP Speed: + 총 업로드 속도: + + + Log + 로그 + + + IP filter + IP 필터 + + + + Start + 시작 + + + + Pause + 정지 + + + + Delete + 삭제 + + + Clear + 모두 지우기 + + + + Preview file + 미리보기 + + + + Set upload limit + 업로드 속도 제한하기 + + + + Set download limit + 다운로드 속도 제한하기 + + + + Delete Permanently + 영구 삭제 + + + + Torrent Properties + 토렌트 구성요소 + + + + Open destination folder + 저장 폴더 열기 + + + + Name + 이름 + + + + Size + 크기 + + + + Progress + 진행 + + + + DLSpeed + 다운로드 속도 + + + + UpSpeed + 업로드 속도 + + + + Seeds/Leechs + + + + + Ratio + 비율 + + + + ETA + 남은시간 + + + + Buy it + 구입하기 + + + + Priority + 우선순위 + + + + Increase priority + 우선순위(priority)를 높이기 + + + + Decrease priority + 우선순위(priority)를 낮추기 + + + + Force recheck + 강제로 재확인하기 + + + + Copy magnet link + 카피 마그넷 링크 (Copy magnet link) + + + + engineSelect + + + Search plugins + 검색 엔진 플러그인 + + + + Installed search engines: + 설치된 검색엔진: + + + + Name + 이름 + + + + Url + + + + + Enabled + 사용하기 + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 새 검색엔진 플러그인은 다음 링크에서 제공 받으실수 있습니다: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + Install a new one + 새것 설치하기 + + + + Check for updates + 업데이트 확인 + + + + Close + 닫기 + + + + Enable + 사용하기 + + + + Disable + 사용하지 않기 + + + + Uninstall + 제거하기 + + + + engineSelectDlg + + True + 맞음 + + + False + 아님 + + + + Uninstall warning + 언인스톨 경고 + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + 개중 몇의 검색엔진 플러그인은 큐비토런트에 포함이 되있기 때문에 제거 될수 없습니다. + 사용자가 직접 설치한 플러그인만이 제거 할수 있습니다. +하지만 큐비토런트에 포함된 검색플러그인들을 사용하지 않으시려면 "사용하지 않기"를 선택하시면 됩니다. + + + + + Uninstall success + 제거 완료 + + + + Select search plugins + 검색 플러그인을 선택하십시오 + + + + + qBittorrent search plugins + 큐비토런트 검색엔진 + + + + + + + + + + + Search plugin install + 검색 엔진 설치 + + + + + + Yes + + + + + + + + No + 아니오 + + + + + + + + + + + + + + + + qBittorrent + 큐비토런트 + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + 최신 버젼의 %1이 이미 설치되어있습니다. + + + + + + + + Search plugin update + 검색 엔진 플러그인 업데이트 + + + + + Sorry, update server is temporarily unavailable. + 죄송합니다. 현재 임시적으로 업데이트 서버가 접속이 불가능합니다. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + 죄송하지만 검색엔진 %1의 업데이트가 실패하였습니다. + + + + All your plugins are already up to date. + 모든 검색엔진이 최신버젼입니다. + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + 검색엔진 %1은 업데이트 될수 없습니다. 기존버젼을 유지하겠습니다. + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + 검색엔진 %1은/는 설치될수 없습니다. + + + + All selected plugins were uninstalled successfully + 선택된 모든 플러그인들이 성공적으로 제거 되었습니다 + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + 검색엔진 %1이 성공적으로 업데이트 되었습니다. + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + 검색엔진 %1이 성공적으로 설치 되었습니다. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + 검색엔진 %1이 성공적으로 업데이트 되었습니다. + + + + Search engine plugin archive could not be read. + 검색엔진 플러그인이 일혀지질 않습니다. + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + 죄송하지만, 검색엔진 플로그인, %1,의 설치가 실패하였습니다. + + + + New search engine plugin URL + 새 검색엔진 플러그인 주소(URL) + + + + URL: + + + + + misc + + + B + bytes + + + + + KiB + kibibytes (1024 bytes) + + + + + MiB + mebibytes (1024 kibibytes) + + + + + GiB + gibibytes (1024 mibibytes) + + + + + TiB + tebibytes (1024 gibibytes) + + + + m + minutes + + + + h + hours + + + + d + days + + + + Unknown + 알수 없음 + + + h + hours + + + + d + days + + + + + Unknown + Unknown (size) + 알수 없음 + + + + < 1m + < 1 minute + < 1분 + + + + %1m + e.g: 10minutes + %1분 + + + + %1h%2m + e.g: 3hours 5minutes + %1시간%2분 + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1일%2시간%3분 + + + + options_imp + + Options saved successfully! + 환경설정 저장 완료! + + + Choose Scan Directory + 공유폴더 변경 + + + Choose save Directory + 저장폴더 변경 + + + Choose ipfilter.dat file + ipfilter.dat 파일 선택 + + + I/O Error + I/O 에러 + + + Couldn't open: + 다음 파일을 열수 없습니다: + + + in read mode. + 읽기전용. + + + Invalid Line + 잘못된 줄 + + + Line + + + + is malformed. + 이 잘못되었습니다. + + + Range Start IP + 시작하는 IP의 범위 + + + Start IP: + 시작 IP: + + + Incorrect IP + 잘못된 IP + + + This IP is incorrect. + 잘못된 IP입니다. + + + Range End IP + 끝나는 IP의 범위 + + + End IP: + 끝 IP: + + + IP Range Comment + IP 범위 설명 + + + Comment: + 설명: + + + to + <min port> to <max port> + ~ + + + Choose your favourite preview program + 미리보기를 할 프로그램을 선택해 주십시오 + + + Invalid IP + 유효하지 않은 IP + + + This IP is invalid. + 유효하지 않은 IP 입니다. + + + Options were saved successfully. + 환경설정이 성공적으로 저장되었습니다. + + + + + Choose scan directory + 스켄할 곳을 선택해주세요 + + + Choose an ipfilter.dat file + ipfilter.dat의 경로를 선택해주세요 + + + + + Choose a save directory + 파일을 저장할 경로를 선택해주세요 + + + I/O Error + Input/Output Error + I/O 에러 + + + Couldn't open %1 in read mode. + %1을 읽기전용 모드로 열수 없습니다. + + + + + Choose an ip filter file + ip filter 파일 선택 + + + + + Filters + 필터 + + + + pluginSourceDlg + + + Plugin source + 플러그인 소스 + + + + Search plugin source: + 검색엔진 플러그인 소스: + + + + Local file + 로컬 파일 + + + + Web link + 웹 링크 + + + + preview + + + Preview selection + 미리보기 선택 + + + + File preview + 파일 미리보기 + + + + The following files support previewing, <br>please select one of them: + 다음 파일은 미리보기를 실행하실수 있습니다, +이 중 하나를 선택해 주십시오: + + + + Preview + 미리보기 + + + + Cancel + 취소 + + + + previewSelect + + + + Preview impossible + 미리보기 불가 + + + + + Sorry, we can't preview this file + 죄송합니다. 이 파일은 미리보기를 할수 없습니다 + + + + Name + 파일 이름 + + + + Size + 크기 + + + + Progress + 진행상황 + + + + properties + + + Torrent Properties + 토렌트 구성요소 + + + Main Infos + 주요 정보 + + + File Name + 파일 이름 + + + Current Session + 현재 세션 + + + Total Uploaded: + 총 업로드량: + + + Total Downloaded: + 총 다운로드량: + + + Download state: + 다운로딩 상태: + + + Current Tracker: + 현재 서버: + + + Number of Peers: + 공유자수: + + + Torrent Content + 토렌트 내용 + + + + OK + 확인 + + + Cancel + 취소 + + + Total Failed: + 총 실패: + + + Finished + 완료됨 + + + Queued for checking + 확인을 위해 대기중 + + + Checking files + 파일 확인중 + + + Connecting to tracker + 서버에 연결중 + + + Downloading Metadata + 자료설명을 받는중 + + + Downloading + 다운로딩 중 + + + Seeding + 공유중 + + + Allocating + 할당중 + + + MB + MB + + + + Unknown + 알수 없음 + + + Complete: + 완전함: + + + Partial: + 부분적: + + + + Files contained in current torrent: + 현 토렌트에 있는 파일들: + + + + Size + 크기 + + + Selected + 선택됨 + + + Unselect + 선택되지 않음 + + + Select + 선택함 + + + You can select here precisely which files you want to download in current torrent. + 여기서 현재 토렌트 중 다운로드 받을 파일을 선택할수 있습니다. + + + False + 아님 + + + True + 맞음 + + + Tracker + 서버 + + + + Trackers: + 서버목록: + + + + + None - Unreachable? + 없음 - 접근할수 없습니까? + + + Errors: + 에러: + + + + Progress + 진행상황 + + + Main infos + 주요 정보 + + + Number of peers: + 전송자수: + + + + Current tracker: + 현재 트레커: + + + + Total uploaded: + 총 업로드양: + + + + Main info + 주요 정보 + + + + Torrent information + 토렌트 정보 + + + + Total downloaded: + 총 다운로드양: + + + + Total failed: + 총 실패수: + + + + Torrent content + 토렌트 내용 + + + Options + 환경설정 + + + + Download in correct order (slower but good for previewing) + 순차적으로 다운받기(늘리지만 미리보기하기에 좋음) + + + Share Ratio: + 공유 비율: + + + Seeders: + 완전체 공유자: + + + Leechers: + 부분 공유: + + + + Save path: + 저장 경로: + + + Torrent infos + 토렌트 정보 + + + + Creator: + 생성자: + + + + Torrent hash: + 토렌트 헤쉬(Hash): + + + + Comment: + 설명: + + + + Current session + 현재 색션 + + + + Share ratio: + 공유비율: + + + + Trackers + 트렉커(Trackers) + + + New tracker + 새 트렉커 + + + New tracker url: + 새 트렉커 주소 (url): + + + + Priorities: + 구성요소: + + + + Normal: normal priority. Download order is dependent on availability + 보통: 보통 우선순위로 다운로드 순서는 자료의 유효성에 의 해 정해집니다 + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + 높음: 보통보다 높은 우선순위로 동등한 유효성을 지닌 우선순위 보통의 자료들보다 우선적으로 다운로드 됩니다. + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + 최고: 최고의 우선순위로 유효성에 상관없이 무조건 다른 우선순위 자료들보다 우선적으로 다운로드 됩니다. + + + + File name + 파일 이름 + + + + + Priority + 우선순위 + + + + + qBittorrent + 큐비토런트 + + + + Trackers list can't be empty. + 트렉커 리스트(Trackers List)를 비울수 없습니다. + + + + Ignored: file is not downloaded at all + 무시: 무시된 파일은 전혀 다운로드 되지 않습니다 + + + + Ignored + 무시 + + + + Normal + 보통 + + + + Maximum + 최고 + + + + High + 높음 + + + + Url seeds + Url 완전체(Url seeds) + + + + New url seed: + 새 Url 완전체 (Url seed): + + + + This url seed is already in the list. + 이 Url 완전체(Url seed)는 이미 리스트에 포함되어 있습니다. + + + Hard-coded url seeds cannot be deleted. + 직접적으로 입력된 url 완전체(Hard-Coded url seeds) 는 삭제될수 없습니다. + + + None + i.e: No error message + 없음 + + + + New url seed + New HTTP source + 새 Url 완전체(seed) + + + + The following url seeds are available for this torrent: + 다음 Url 완전체(seed)가 이 토렌트에 사용될수 있습니다. + + + + Priorities error + 우선순위 설정 에러 + + + + Error, you can't filter all the files in a torrent. + 에러, 모든 파일을 필터할수는 없습니다. + + + + Downloaded pieces + 다운로드 된 조각들 + + + + Collapse all + 모두 접어서 간단하게 보여주기 + + + + Expand all + 다 펼펴서 보여주기 + + + + ... + ... + + + + + Choose save path + 저장 경로 선택 + + + + Save path creation error + 저장 경로 설정이 잘못되었습니다 + + + + Could not create the save path + 저장 경로를 생성할수가 없습니다 + + + + search_engine + + + + Search + 검색 + + + Search Engines + 검색 엔진 + + + Search Pattern: + 검색 양식: + + + Stop + 정지 + + + + Status: + 상태: + + + + Stopped + 정지됨 + + + Results: + 결과: + + + + Download + 다운로드 + + + Clear + 모두 지우기 + + + Update search plugin + 검색 plugin 업데이트 + + + + Search engines... + 검색 엔진... + + + Close tab + 탭 닫기 + + + + seeding + + + Search + 검색 + + + The following torrents are finished and shared: + 다음 토렌트는 완료되었으며 공유중입니다: + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>참고:</u> 파일 다운로드가 완료된 후에도 공유상태를 유지하는 것이 좋습니다. + + + + Start + 시작 + + + + Pause + 정지 + + + + Delete + 삭제 + + + + Delete Permanently + 영구 삭제 + + + + Torrent Properties + 토렌트 구성요소 + + + + Preview file + 미리보기 + + + + Set upload limit + 업로드 속도 제한하기 + + + + Open destination folder + 저장 폴더 열기 + + + + Name + 이름 + + + + Size + 크기 + + + + Upload Speed + 업로드 속도 + + + + + Connected peers + 연결된 사용자 + + + + + Seeds / Leechers + 완전체 공유자/부분파일 공유자 + + + + Copy magnet link + 카피 마그넷 링크 (Copy magnet link) + + + Leechers + Leechers + + + + Ratio + 비율 + + + + Buy it + 구입하기 + + + + Total uploaded + 총 업로드 + + + Priority + 우선순위 + + + Increase priority + 우선순위(priority)를 높이기 + + + Decrease priority + 우선순위(priority)를 낮추기 + + + + Force recheck + 강제로 재확인하기 + + + + subDownloadThread + + + Host is unreachable + 호스트에 도달할수 없습니다 + + + + File was not found (404) + 파일을 찾을수 없습니다 (404) + + + + Connection was denied + 연결 시간이 부인되었습니다 + + + + Url is invalid + 주소(Url)가 유효하지 않습니다 + + + + I/O Error + I/O 에러 + + + Connection forbidden (403) + 연결이 금지되었습니다 (403) + + + Connection was not authorized (401) + 연결이 허가되지 않았습니다 (401) + + + Content has moved (301) + 내용이 이동되었습니다 (301) + + + + Connection failure + 연결 실패 + + + + Connection was timed out + 연결 시간이 초과하였습니다 + + + + Incorrect network interface + 네트웍크 인터페이스(network interface)가 맞지 않습니다. + + + + Unknown error + 알수 없는 오류 + + + + Could not resolve proxy + 프록시를 설정할수 없습니다 + + + + torrentAdditionDialog + + True + 맞음 + + + + + Unable to decode torrent file: + 토런트 파일을 해독 할 수가 없습니다: + + + This file is either corrupted or this isn't a torrent. + 이 파일은 오류가 있거나 토런트 파일이 아닙니다. + + + + + Choose save path + 저장 경로 선택 + + + False + 틀림 + + + Unknown + 알려지지 않음 + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (자료를 다운 후에는 %1 의 디스크 공간이 남습니다.) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (자료를 다운받기 위해서는 %1 의 디스크 공간이 필요합니다) + + + + Empty save path + 저장 경로 지우기 + + + + Please enter a save path + 저장 경로를 지정해주십시오 + + + + Save path creation error + 저장 경로 설정이 잘못되었습니다 + + + + Could not create the save path + 저장 경로를 생성할수가 없습니다 + + + + Invalid file selection + 부적당한 파일 선택 + + + + You must select at least one file in the torrent + 토렌트에서 적어도 하나 이상의 파일을 선택해야 합니다 + + + + File name + 파일 이름 + + + + Size + 크기 + + + + Progress + 진행상황 + + + + + Priority + 우선순위 + + + diff --git a/src/lang/qbittorrent_nb.qm b/src/lang/qbittorrent_nb.qm new file mode 100644 index 0000000000000000000000000000000000000000..84be77a97210a4b32b853bf75b8fa76653e94d07 GIT binary patch literal 20358 zcmc&+3v?V;dA`3*qn!qVgnqYGXq2-Vin$pwI@4t8E z&SPiSGC8G3$GO_o-2eXX=ba4vb*km5U;OEZ{&8LF*WP*0qdy#CtY$A`4C{7{vFbN6 zHt;LPI{px!TNr!8VaDP=6>AH=?@KTiyG5+ZpNsYKV~p+lBxB0cj9u|=#-bHs?fC&? z2fqV2H#7ETTJL3SlGcA<>^QA2v5K!f##nuwSXZrKl|QC)ceAQ*Rx!5xRaU)!2jE>P z*19Ley7t3j?OiL@z8{J8vi}zA&@NUz`&GtPbh7Gus1CM1NV_n~B$NCKG`gt$b-?Gu?KF-+EwQS$n$HBYLh_$(gP28Pg ztnruZ&Ckv-R`p?feNL=3d&OFJn^-qI%_gsYjj>A)v8fwxWvt>HJ9g$nzHzTSciMq$s2Nz)l=-@PlM+zZ)0EjF81}` z%YOa<@M--#`_0$-A>Z~T%HU1-JhSA$v+EhFdy`m)k1x6Rj}{nP-?!w84Tl)({^gRV zpBV(bS1)<--YLd*zgn@P<2cr}6?>lSVr=Y{isQLv@b^)%#``K3>L9N-{z9yyiHi5# zcN=5dzF%?Ye}Yd9U1D9ex8nKKRnW2TR{Yl!Pk`=6DtGGFF%~&k`SzcFk+GelmG3?c zJ}_2!recJ#)sI(xyA${}f2{Jw!S~_YbCtiiWE1E=SasRpD~xS=A}#Jc%WvF==1_3`__?}oEjAHaI9>cP#Q0{j=m+H${GduGKt_*B)m ztQWxlSk?D#0$vqERWJ3#@cCWU%SXY_%lfK!oFzG~tX6wRp%;bfkKA$>V@+3!wdLDl z?R`?LgWX~sdbaw(%J(z2qrUoce|taleW_S`&Wd&L*OAqSAh(uUvF`pz zWccg<%-H46M~0sU{YyU;Sy%@;B7YpY<%WL)zuy;m;?Z}3AJ0dAbOWBNY>b@m1OGR_ zBG$eCQB$!EeCoWXX2sDf7~6A4&Fb@@f7dr_j1T+`=v$~Un@)p|&x!R-kJp^}=ADqs zhimSrg#PV#pyr-G`59w-`)mHP;)9I!zFhO@4c)+NdCj@w*uUhC+Rd-%u`kkqg%`p1t?}r|n;(L{ zTpNAp`KN%#vFMi{e2lR+7XA0CX93?{drykbLm!B~oN5Q1k?3pBK>w<1V~JNzGB*09 zSjXRY1KzE%w|u`Ec5p*%?zL6W>)M#v0X!-{8N2Z{{C(*!V}I6qJ7XJv6T9y#{frI1 zJ@(M<-#{Bx%QlF0)n~=3sAAnVB-Xu;)Lq{R_-ohK-E=wZxB05N zPron>KHgmSr57K@_t(@t`IeW#r#FjrY)9QUu1+&H@|n7SeS9}#o9?gs?avCJYbf4U zJp#Yb93N@`oa$HN!$*D&y}T(7)lg@tbaXnz2i=@msPt z!tZU3-?3*k{8L`68_vY>^<=x{#_;b@~T)@d?o(Eb+)V0n1Btr} z(69BkCGNcfpSwPic=#{gf%EnxUd~`$eypM4wsVMW*Eg(;o3O7Z8#umeA8Xk6S2x36 zIvXDPRut#8KpFS9gF@EAdf7JC%@mepNv2`#W0$jCY)38r$RhX`>)qDVyQ8P?@?AS> z@UeDqS}#~5nYksjeJ2}WX#m)bbsGP@7GYUq7JhVQ;74US{64^X_+M$|PfOry2GZMh z4@~dAc1W`<-7wUgHPAD?d!Pqj7oS$e4zsM>Tg@>keyWw80wJNe$lXi%ZpCwOF{BlM zl*dmRteIyfXHkyjB#g*l!Ak2!@x~T5#$IJ9Y*AST|4jh^v7}#ajSgvsl};s3^%w6} z*f5SXz(|wtA_PxGX2@YNc8Ciw=Q*JIP%;|^JI3A$ zDnNth*}B6sGlhK8()3&iHeHYlNtgbq*qHT7C3P*1c~dKNvn{8t}9wj znbEWPf~6XYIisne%xZxe&I7i=X(rp4kn23leg3+OqQfJv|Ex z3*9MxO1D}l1{`Bo0?i?SbVXc!r8d-K(zC0ElDX7^ma@`=nT$Te2_Mmt8C|%g@|zPQ z2M)k$M%0Wtm$X#w$j;af>>%g!2~guWEn#=$AJ4-E$s&{B6v;pV&q_KPwi$n)g%>ce zlBTBcn}&6cf1=$Mz9Fe9_+EkLkQL41+iuCL5xB-fx~2A$Q&fi2$=sZ3DhpaBqfDzx zGM~?AYD!7YlKOZ&nWCABp_*3Gu+&sH@hjqCP8S=*VHOS*N~N%IHUR`?@l8e|#Zi@r zEFYY)w0ST~8J|$bvGEg>byXF~NgA+#WJO|Yi@YzpX* z4V<-n?Tg^56!6wlb+&7I5ckcXZRGx^BWyXH~@H8MTO8EsQLM_K^)(+?nS{n((=806=OPBpm1Mi3f^WXB6@&?eF+g?s4purks_ z2U+s18GNREAq#CyLHkV4No`1mGO64qOVRUcP65IQ%7&UuDOo+GawM9B>zGIyP|m3| z{gET0AQ2IOdmu-V{*X^4U#gNrlH^3kdk!n3h9Q#0Qt-+zl2%A7oivqMn=?wvHF7Sw%6&)2 zxu|N{M(#f}DU!;Khjg+{`A7thT)~p^fvSyf6@E`XkwI`G1QhOc$OfEHV?p&O4HBVV z${(LQpbG^kU-qcgz-$ z0i-nZ#GcO0%BJ?dO-PjsrXA}gx+mH9z&$!p7%XYNuo076gvcZnc;F;H&jI}oJlV<7 zA&a3}gUUDh*5KchEs<@x@^HK`#Sd}_v}2EC;n<*|DyQ^NX(g?K$rA&q2fsTsxb7lo1B;Er$e|q{T%5``AvT*7oBPS*%Di6U z+#7ldX_pgz9J3NRwj1@AI?+OU1s`kUC|9L>k)o+}+@$Z>MfvxYTDRJ-jOS3q^&Bo( zScIde-ihDsOX8XW;)T6SOd^MK87;@-zI=W?dqM^^e`iJH?4U>PZ#qm-%=Y$_st0`7 zcBHxCiJu6Xq;3?!D8SA^;r+fyIh-doLk)twP%)G9Fk7=Qg9OnepLELabR&q0ud)*o zx5%WLG-lF19=CuOl(LG%%d)EwFGcmGi5XaI0#sfXkrb8F#T6H@>pD-uJB+~xp%F3Z2xK6Fp_ePw8%I-`MGwagCbisES`I!_hB{sj$rGwKk{*OT8wY&R ziOI0M=lT6=CLi{EsSaEa2L#^vG0K)Wh?d zx`4nEZcQ7ZI~1Z)*e*hqT?cT%QB#5!=Ptk_Dz!6|q%vIyRe#c5yWb=?RU^b3p@vVY z>vX3=c**yb;^q2)8&=``i3G|XlU$2ko;EoS85MqBH7repm}1rrapgn=06)?p{a%-~ z^~W?*vk+CLv4pD01#es!CD?>Iov9rx(-a2JNLwRGN<;cBFF~}k4y;FQU#84%|eJ)5i?;(T!E~*0}PUMbW z&%AyD;Rr6rI+aI*HE=u(-!Qr96(iBi+!eGun>9JSD$*17^TDJW9@Q7nnolABh+$RT~r=?-VZ z4{MZ%8G#;^O)8YWq_#H)${4aKH@wvzP}P~VYH+oP3dE+8({>hT53MABWH&MJ*`;U}Q8Sp-Rmb;YCs`t?acF7oX~a*BD+|;JM91L- z<&$VlBy%TtgJM?4jA?;&m>I!3VFaR815TmAgWl9aPRZD_3|<9#=)Tyf<=I-QFWi_+rR+4sGumq8 z4cR%)QqBlzJe7kfJ_ZQiHxb+iW)=6ka`;Zn9K78wS0O#^J9+K~oXh)Nc4Lw^w5Y=+ z8g|qi7x_*&VsW0PljA+*DIX%kG*#z0arm~)$ZAOqsD2ScD{z}&<^)E{e#Vp{n&NwDz^;1L+F-e?!l<~o* zv5D@06o4VIiwvgtIl2o&p0iWh!WxbhrLyx=tiayJej5%!{-%&fj3`KW?YzR?aRh%X`Wi7;x z%?c71Dr^>#nq{Y}K_1WZTu|tqr~iS&#F0e3nD9^{NA!y(vBlFeaT`E9Nq-~F5TBe$ ziCdcyhe)Fdo-4PVQ)#FvHCN~Yi>hHbWZ-&~VHEN-9>M_3q6ajShP6qj=NHPYLuG|a z=+S6Jh|m|k5GpBf5^6NQu)Tv++e?q;lGDJCPq1b%A9k?dX!mnghpF!cgV3@W-pDLY zY4)>YoQ-s2=T#`B8_Y>5h58XI9rY6`8bXt#VYw4KdGC~lMpL@ZlZlc@4Ec(7!J=Sp zA-tB|FqN{GvqgFQ(nC625RFMF(?EsI3+j47za{#(+$rwmlv6$6D9+*zE-vaX@fGzs z@A0yt4?$p~2LV4rw;*vp4>jQkNy;vnP)O?2p0W!!vh<)L@~bTPp85uX1kpAzH!)b} zC?vUTp$Gn{63-YyP`RL0H8`Pn46Sf5&iu#_ZgOt1- z0VOLFuyQb5L2gbZa!H2nf}^H(qhsQwP7#d&8X=LN!PQ}T(sB$;5k+$(BV^4W)E-E zaXTr3wy1Vk(XR4youbF-QmhKY^W55%>R&UWnUs={g~dgiPlO?^NM$5g{P37PO&2ko zI3coj$BR3o0E!<}9Md$C?tY2}9JQIqSGW1JwGX>PWN+F-JdmRm4Je^lbQYB6& z^Q2b=$TLvfa&Lf;`I6-5d%{8t$!UBcaB}Jp!ixOHoF~`pokXT_YO{?LvJhh)o&(t> z?jRuvPZ}DWN+Fk=$4d{yUSZo|cwcODE0p-H{3aMNe$I2<1mR8{{346`y=gr>GrLG%`v{&e^6z6U*M?( zZpqUdL$)iGC{+z8!AC3Dko@zKAwQ-OT*1X%fBE;yeOl2I{0fo#1a1rkVI1_sI9U9| zl>dpT;1h9n6gDQ5jjM6uXzoOgI-4CP?&5ax(Tn|+|MbnCRFPh!q9lvTL#OfP+@|3M zC8=0BoYr;JWSBEi=PjifxW%O#{7ONcE^gXfquJxgT^BgQ(RQj+v*;br1jv8fa{D-Q zCW#w%We>YxW>u3Hvv96y)NZ7bE;vMY8m5i|@u$mix|E{WaEP5gm@C3zO5WAj!}y|& zTf;YU9VJge!%R{5IT^A$rd#Sv_)VV4+exqwuQb31rxX$p4xw>5xhNs|AV;XFLo*C| zTh74yax|szRyZPECiL9&cx(!nB;6SV)yF0-UFG@J0h@hD95yQh)5dPQ$`|X` zdTw^&w`aWl$K3~a9#l+|Ed-Bf<})Ypo}HLH86Mrjn}Aumhs3obxRshHl$#R{Ucm-y zJ*OE(PEO!2rX*g95Vs{;#f^ImUM;)Y;|;K~RBT0>b{^L96X+PF0K$OFHMCv(X&f%_ z7fTgOw6#NNy*;F+q7s2}Adz-a8-flO>g|pyssAb7g42kx+ebRneuOWk?UKk<-I$;>jA|_!fiFF#SlsR2b!ABU5hQc3+HfliO60l-Q z*X$Q>q)4LN7t?z;VLH@n?{X|$G(R21@V7~3Vd{uy5xxURc+EdB@e9(@W|vB$3@~L(3r^$Wlj$U`0~^#f3Ki#~+ughm1?o1bG(aN(rbzJcSo`e6}AN z=q6}|JiRbi0v_EGDn0h|CNNQZ@F!kN2#UEV>E{2}ff`Sm9o%uT6<2WoA{&79Ccnvc zjVStfye`vc2zfdI4w2k~?`zcHCZ_XRMagYKJP?aiMr_mbdC^M?*>-^*Q;msM#_Q@Y z`5=@@9(~W1ZwvVzeO)afAEYv3@;$dGx8&PVzH#GwbWtyla9#JmC9>2kOgll}^RD6l zL8`dip0?nM3csJ>xk&T>nEI8$s>7ERc;Y79qOg}>8@j>1Me1B^A$MEmfW@UpWdL*` zPnpADgl?;dVYo8@^GADxVQJSZ#&h$@jE4M;>S15yS>~jEPw601O+P=JC|Rz6XtBH5 zyh-nLA)G>@%-O$(9H-3bi?Z4>`^&#ROqInVX2Vi?ZRIDz7f`qZ$gt?8Oz}ULaJm6h zZt>O|FQ=T@gpe;K0OB + + + + AboutDlg + + + About qBittorrent + Om qBittorrent + + + + About + Om + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + Author + Opphavsmann + + + + Name: + Navn: + + + + Country: + Land: + + + + E-mail: + E-post: + + + + Home page: + Hjemmeside: + + + + Christophe Dumez + Christophe Dumez + + + + France + Frankrike + + + Thanks To + Takk til + + + + Translation + Oversettelse + + + + License + Lisens + + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + En bitttorrent klient som bruker Qt4 og libtorrent, programmert i C++.<br> +<br> +Copyright © 2006 av Christophe Dumez<br> +<br> <u>Hjemmeside:</u> <i>http://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + + Birthday: + Fødselsdato: + + + + Occupation: + Yrke: + + + + 03/05/1985 + 03. mai 1985 + + + + Student in computer science + Datateknologi-student + + + + Thanks to + + + + + BandwidthAllocationDialog + + + Upload limit: + + + + + Download limit: + + + + + + + + Unlimited + Unlimited (bandwidth) + + + + + KiB/s + KiB/s + + + + ConsoleDlg + + + qBittorrent console + + + + + General + + + + + Blocked IPs + + + + + DLListDelegate + + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Valg -- qBittorrent + + + Options + Alternativer + + + Main + Oppsett + + + Save Path: + Filsti for nedlastinger: + + + Download Limit: + Nedlastingsbegrensning: + + + Upload Limit: + Opplastingsbegrensning: + + + Max Connects: + Maks tilkoblinger: + + + Port range: + Port-område: + + + ... + ... + + + Disable + Deaktiver + + + connections + tilkoblinger + + + + Proxy + Mellomtjener + + + Proxy Settings + Mellomtjener oppsett + + + Server IP: + Tjener IP: + + + 0.0.0.0 + 0.0.0.0 + + + + + + Port: + Port: + + + Proxy server requires authentication + Mellomtjener krever autentisering + + + + + + Authentication + Autentisering + + + User Name: + Brukernavn: + + + + + + Password: + Passord: + + + Enable connection through a proxy server + Aktiver tilkobling gjennom en mellomtjener + + + OK + OK + + + Cancel + Avbryt + + + Scanned Dir: + Gjennomsøkt mappe: + + + Enable directory scan (auto add torrent files inside) + Aktiver mappesøk (legg til torrent filer funnet) + + + Connection Settings + Tilkoblingsoppsett + + + Share ratio: + Delingsforhold: + + + + Activate IP Filtering + Aktiver IP filtrering + + + + Filter Settings + Filteroppsett + + + Start IP + Begynnelses IP + + + End IP + Slutt IP + + + Origin + Opphav + + + Comment + Kommentar + + + Apply + Bruk + + + + IP Filter + IP filter + + + Add Range + Legg til område + + + Remove Range + Fjern område + + + ipfilter.dat Path: + ipfilter.dat filsti: + + + Ask for confirmation on exit + Bekreft ved avslutning + + + Go to systray when minimizing window + Flytt til systemkurven ved minimering + + + Misc + Diverse + + + Localization + Lokalisering + + + + Language: + Språk: + + + Behaviour + Oppførsel + + + OSD + Skjermmeldinger + + + Always display OSD + Vis alltid skjermmeldinger + + + Display OSD only if window is minimized or iconified + Vis skjermmeldinger kun når vinduet er minimert + + + Never display OSD + Vis aldri skjermmeldinger + + + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + maks KiB opplasting. + + + DHT (Trackerless): + DHT (Uten sporingstjener): + + + Disable DHT (Trackerless) support + Deaktiver DHT (Uten sporingstjener) + + + Automatically clear finished downloads + Automatisk fjerning av fullførte nedlastninger + + + Preview program + Program for forhåndsvisning + + + Audio/Video player: + Lyd/video avspiller: + + + DHT configuration + DHT oppsett + + + + DHT port: + DHT port: + + + Language + Språk + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Merk:</b> Du må starte om qBittorrent, før endringene trer i kraft. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Oversetting:</b> Hvis qBittorrent ikke er tilgjengelig i ditt språk, <br/>og du ønsker å oversette programmet, <br/>vennligst kontakt meg (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Spør meg hva jeg ønsker å gjøre hver gang jeg legger til en torrent + + + Default save path + Standard filsti for lagring + + + Systray Messages + Systemkurvmeldinger + + + Always display systray messages + Vis alltid systemkurvmeldinger + + + Display systray messages only when window is hidden + Vis systemkurvmeldingene kun når hovedvinduet er skjult + + + Never display systray messages + Ikke vis systemkurvmeldingene + + + Disable DHT (Trackerless) + Deaktiver DHT (Uten sporingstjener) + + + Disable Peer eXchange (PeX) + Deaktiver Peer eXchange (PeX) + + + Go to systray when closing main window + Flytt til systemkurven ved lukking + + + + Plastique style (KDE like) + + + + + CDE style (Common Desktop Environment like) + + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + + + Start/Stop + + + + + + Open folder + + + + + + Show properties + + + + + Port used for incoming connections: + + + + + Random + + + + + + HTTP + + + + + SOCKS5 + + + + + Affected connections + + + + + Use proxy for connections to trackers + + + + + Use proxy for connections to regular peers + + + + + Use proxy for connections to web seeds + + + + + Use proxy for DHT messages + + + + + Enabled + + + + + Forced + + + + + Disabled + + + + + Preferences + Innstillinger + + + + User interface settings + + + + + Visual style: + + + + + Cleanlooks style (Gnome like) + + + + + Motif style (Unix like) + + + + + Ask for confirmation on exit when download list is not empty + + + + + Display current speed in title bar + + + + + System tray icon + + + + + Disable system tray icon + + + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + + + + + Minimize to tray + + + + + Show notification balloons in tray + + + + + Downloads + + + + + Pre-allocate all files + + + + + When adding a torrent + + + + + Display torrent content and some options + + + + + Do not start download automatically + The torrent will be added to download list in pause state + + + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + + + + + Connection + + + + + Download list: + + + + + Seeding list: + + + + + Download folder: + + + + + Temp folder: + + + + + Automatically download torrents present in this folder: + + + + + Listening port + + + + to + i.e: 1200 to 1300 + til + + + + Enable UPnP port mapping + + + + + Enable NAT-PMP port mapping + + + + + Global bandwidth limiting + + + + + Upload: + + + + + Download: + + + + + Bittorrent features + + + + + Use the same port for DHT and Bittorrent + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + Type: + + + + + + (None) + + + + + + Proxy: + + + + + + + Username: + Brukernavn: + + + + Bittorrent + + + + + UI + + + + + Connections limit + + + + + Global maximum number of connections: + + + + + Maximum number of connections per torrent: + + + + + Maximum number of upload slots per torrent: + + + + + Enable DHT network (decentralized) + + + + + Enable Local Peer Discovery + + + + + Encryption: + + + + + Share ratio settings + + + + + Desired ratio: + + + + + Filter file path: + + + + + transfer lists refresh interval: + + + + + ms + + + + + + RSS + + + + + RSS feeds refresh interval: + + + + + minutes + + + + + Maximum number of articles per feed: + + + + + File system + + + + + Remove finished torrents when their ratio reaches: + + + + + System default + + + + + Start minimized + + + + + Web UI + + + + + Enable Web User Interface + + + + + HTTP Server + + + + + Enable RSS support + + + + + RSS settings + + + + + Enable queueing system + + + + + Maximum active downloads: + + + + + Torrent queueing + + + + + Maximum active torrents: + + + + + Display top toolbar + + + + + Search engine proxy settings + + + + + Bittorrent proxy settings + + + + + Maximum active uploads: + + + + + DownloadingTorrents + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Progress + i.e: % downloaded + + + + + DL Speed + i.e: Download speed + Nedlastingshastighet + + + + UP Speed + i.e: Upload speed + Opplastingshastighet + + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + Delere/Nedlastere + + + + Ratio + + + + + ETA + i.e: Estimated Time of Arrival / Time left + Gjenværende tid + + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 er startet. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' ble lagt til i nedlastingslisten. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ble gjenopptatt (hurtig gjenopptaging) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' finnes allerede i nedlastingslisten. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Klarte ikke å dekode torrentfilen: '%1' + + + This file is either corrupted or this isn't a torrent. + Denne filen er enten ødelagt, eller det er ikke en torrent. + + + Couldn't listen on any of the given ports. + Klarte ikke å lytte på noen av de oppgitte portene. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Laster ned '%1'... + + + + Hide or Show Column + + + + + FeedDownloader + + + RSS Feed downloader + + + + + RSS feed: + + + + + Feed name + + + + + Automatically download torrents from this feed + + + + + Download filters + + + + + Filters: + + + + + Filter settings + + + + + Matches: + + + + + Does not match: + + + + + Destination folder: + + + + + ... + ... + + + + Filter testing + + + + + Torrent title: + + + + + Result: + + + + + Test + + + + + Import... + + + + + Export... + + + + + + Rename filter + + + + + + Remove filter + + + + + Add filter + + + + + FeedDownloaderDlg + + + New filter + + + + + Please choose a name for this filter + + + + + Filter name: + + + + + + + Invalid filter name + + + + + The filter name cannot be left empty. + + + + + + This filter name is already in use. + + + + + Filter testing error + + + + + Please specify a test torrent name. + + + + + matches + + + + + does not match + + + + + Select file to import + + + + + + Filters Files + + + + + Import successful + + + + + Filters import was successful. + + + + + Import failure + + + + + Filters could not be imported due to an I/O error. + + + + + Select destination file + + + + + Overwriting confirmation + + + + + Are you sure you want to overwrite existing file? + + + + + Export successful + + + + + Filters export was successful. + + + + + Export failure + + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + + Unread + + + + + FilterParserThread + + + + + + + + + + + + I/O Error + Input/Output Error + Lese/Skrive feil + + + + + + Couldn't open %1 in read mode. + Klarte ikke å åpne %1 i lesemodus. + + + + + + + + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Ferdig + + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Seeds / Leechers + + + + + Connected peers + + + + DL Speed + i.e: Download speed + Nedlastingshastighet + + + + UP Speed + i.e: Upload speed + Opplastingshastighet + + + Seeds/Leechs + i.e: full/partial sources + Delere/Nedlastere + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + Gjenværende tid + + + Finished + i.e: Torrent has finished downloading + Ferdig + + + None + i.e: No error message + Ingen + + + + Ratio + + + + Leechers + i.e: full/partial sources + Nedlastere + + + + Total uploaded + i.e: Total amount of uploaded data + + + + + Hide or Show Column + + + + + GUI + + + Open Torrent Files + Åpne torrentfiler + + + This file is either corrupted or this isn't a torrent. + Denne filen er enten ødelagt, eller det er ikke en torrent. + + + Are you sure you want to delete all files in download list? + Ønsker du å slette alle filene in nedlastingslisten? + + + + + + + + &Yes + &Ja + + + + + + + + &No + &Nei + + + + Are you sure you want to delete the selected item(s) in download list? + Ønsker du å slette valgt(e) element(er) i nedlastingslisten? + + + + Finished + Ferdig + + + Checking... + Kontrollerer... + + + Connecting... + Kobler til... + + + Downloading... + Laster ned... + + + Download list cleared. + Nedlastingslisten er tømt. + + + All Downloads Paused. + Alle nedlastinger er pauset. + + + All Downloads Resumed. + Alle nedlastinger er gjennopptatt. + + + started. + startet. + + + UP Speed: + Opplastingshastighet: + + + Couldn't create the directory: + Klarte ikke å opprette mappen: + + + + Torrent Files + Torrentfiler + + + already in download list. + <file> already in download list. + ligger allerede i nedlastingslisten. + + + added to download list. + lagt til i nedlastingslisten. + + + resumed. (fast resume) + gjenopptatt. (Hurtig gjenopptaging) + + + Unable to decode torrent file: + Klarte ikke å dekode torrentfilen: + + + removed. + <file> removed. + fjernet. + + + paused. + <file> paused. + er pauset. + + + resumed. + <file> resumed. + er gjenopptatt. + + + Listening on port: + Lytter på port: + + + qBittorrent + qBittorrent + + + + + + + Are you sure? -- qBittorrent + Er du sikker? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Nedlastingshastighet: + + + <b>Connection Status:</b><br>Online + <b>Tilkoblingsstatus:</b><br>Tilkoblet + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Tilkoblingsstatus:</b><br>Blokkert av brannmur?<br><i>Ingen innkommende tilkoblinger...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Tilkoblingsstatus:</b><br>Frakoblet<br><i>Ingen tjenere funnet...</i> + + + has finished downloading. + er ferdig lastet ned. + + + Couldn't listen on any of the given ports. + Klarte ikke å lytte på noen av de oppgitte portene. + + + None + Ingen + + + Empty search pattern + Ingen søketekst + + + Please type a search pattern first + Skriv en tekst å søke etter først + + + No seach engine selected + Ingen søkemotor valgt + + + You must select at least one search engine. + Du må velge minst en søkemotor. + + + Searching... + Søker... + + + Are you sure you want to quit? -- qBittorrent + Ønsker du å avslutte? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Er du sikker på at du ønsker å avslutte qbittorrent? + + + KiB/s + KiB/s + + + Search is finished + Søket er ferdig + + + An error occured during search... + Det oppstod en feil under søket... + + + Search aborted + Søket er avbrutt + + + Search returned no results + Søket ga ingen resultater + + + Search plugin update -- qBittorrent + Oppdatering av søkeprogramtillegg -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Søkeprogramtillegget kan oppdateres, ønsker du å oppdatere det nå? + +Endringer: + + + Sorry, update server is temporarily unavailable. + Oppdateringstjeneren er midlertidig utilgjengelig. + + + Your search plugin is already up to date. + Ditt søkeprogramtillegg er allerede oppdatert. + + + Results + Resultater + + + Name + Navn + + + Size + Størrelse + + + Progress + Fremdrift + + + DL Speed + Nedlastingshastighet + + + UP Speed + Opplastingshastighet + + + Status + Status + + + ETA + Gjenværende tid + + + Seeders + Delere + + + Leechers + Nedlastere + + + Search engine + Søkemotor + + + Stalled + state of a torrent whose DL Speed is 0 + Laster ikke ned + + + Paused + Pauset + + + Preview process already running + Forhåndsvisningen kjører allerede + + + There is already another preview process running. +Please close the other one first. + En annen forhåndsvisning kjører alt. +Vennligst avslutt denne først. + + + Couldn't download + Couldn't download <file> + Klarte ikke å laste ned + + + reason: + Reason why the download failed + årsak: + + + Downloading + Example: Downloading www.example.com/test.torrent + Laster ned + + + Please wait... + Vent litt... + + + Transfers + Overføringer + + + Are you sure you want to quit qBittorrent? + Ønsker du å avslutte qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Ønsker du å slette valgte element(er) i nedlastningslisten, og fra lagringsenheten? + + + + Download finished + Nedlastingen er fullført + + + has finished downloading. + <filename> has finished downloading. + er ferdig lastet ned. + + + Search Engine + Søkemotor + + + I/O Error + Lese/Skrive feil + + + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + + + Connection status: + Tilkoblingsstatus: + + + Offline + Frakoblet + + + No peers found... + Ingen tjenere funnet... + + + Name + i.e: file name + Navn + + + Size + i.e: file size + Størrelse + + + Progress + i.e: % downloaded + Fremgang + + + DL Speed + i.e: Download speed + Nedlastingshastighet + + + UP Speed + i.e: Upload speed + Opplastingshastighet + + + Seeds/Leechs + i.e: full/partial sources + Delere/Nedlastere + + + ETA + i.e: Estimated Time of Arrival / Time left + Gjenværende tid + + + Seeders + i.e: Number of full sources + Delere + + + Leechers + i.e: Number of partial sources + Nedlastere + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 er startet. + + + + + qBittorrent + qBittorrent + + + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Nedlastingshastighet: %1 KiB/s + + + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Opplastingshastighet: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Ferdig + + + Checking... + i.e: Checking already downloaded parts... + Kontrollerer... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Laster ikke ned + + + + Are you sure you want to quit? + Ønsker du å avslutte qBittorrent? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' ble fjernet. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' ble lagt til i nedlastingslisten. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ble gjenopptatt (hurtig gjenopptaging) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' finnes allerede i nedlastingslisten. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Klarte ikke å dekode torrentfilen: '%1' + + + None + i.e: No error message + Ingen + + + Listening on port: %1 + e.g: Listening on port: 1666 + Lytter på port: %1 + + + All downloads were paused. + Alle nedlastinger ble pauset. + + + '%1' paused. + xxx.avi paused. + '%1' pauset. + + + Connecting... + i.e: Connecting to the tracker... + Kobler til... + + + All downloads were resumed. + Alle nedlastinger ble gjenopptatt. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' gjenopptatt. + + + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 er ferdig nedlastet. + + + + I/O Error + i.e: Input/Output Error + Lese/Skrive feil + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Det oppsto en feil ved lesing eller skriving til %1. Disken er mest sannsynelig full, nedlastingen har blitt pauset + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Det har oppstått en feil (full disk?), '%1' er pauset. + + + + Connection Status: + Tilkoblingsstatus: + + + + Online + Tilkoblet + + + Firewalled? + i.e: Behind a firewall/router? + Beskyttet av en brannmur? + + + No incoming connections... + Ingen innkommende tilkoblinger... + + + No search engine selected + Ingen søkemotor valgt + + + Search plugin update + Oppdatering av søkeprogramtillegget + + + Search has finished + Søket er ferdig + + + Results + i.e: Search results + Resultater + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Laster ned '%1'... + + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Det har oppstått en feil (full disk?), '%1' er pauset. + + + + Search + Søk + + + + RSS + + + + + + DHT support [OFF] + + + + + PeX support [ON] + + + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + + + + + + Downloads + + + + + Are you sure you want to delete the selected item(s) in finished list? + + + + + UPnP support [ON] + + + + + Encryption support [ON] + + + + + Encryption support [FORCED] + + + + + Encryption support [OFF] + + + + + Alt+1 + shortcut to switch to first tab + + + + + Alt+2 + shortcut to switch to second tab + + + + + Alt+4 + shortcut to switch to fourth tab + + + + + Url download error + + + + + Couldn't download file at url: %1, reason: %2. + + + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + + + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + + + + + Alt+3 + shortcut to switch to third tab + + + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + + Ctrl+F + shortcut to switch to search tab + + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + + UPnP support [OFF] + + + + + NAT-PMP support [ON] + + + + + NAT-PMP support [OFF] + + + + + DHT support [ON], port: UDP/%1 + + + + + Local Peer Discovery [ON] + + + + + Local Peer Discovery support [OFF] + + + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + + + + + + DL: %1 KiB/s + + + + + + UP: %1 KiB/s + + + + + + Ratio: %1 + + + + + + DHT: %1 nodes + + + + + + No direct connections. This may indicate network configuration problems. + + + + + Uploads + + + + + Options were saved successfully. + Innstillingene ble lagret. + + + + MainWindow + + Log: + Logg: + + + Total DL Speed: + Total nedlastingshastighet: + + + Total UP Speed: + Total opplastingshatighet: + + + &Options + &Valg + + + + &Edit + &Rediger + + + + &File + &Fil + + + + &Help + &Hjelp + + + + Open + Åpne + + + + Exit + Avslutt + + + + Preferences + Innstillinger + + + + About + Om + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slett + + + + Pause All + Paus alle + + + + Start All + Start alle + + + + Documentation + Hjelpetekst + + + Delete All + Slett alle + + + + Torrent Properties + Torrentegenskaper + + + Connection Status + Tilkoblingsstatus + + + Search + Søk + + + Search Pattern: + Søketekst: + + + Status: + Status: + + + Stopped + Stoppet + + + Search Engines + Søkemotorer + + + Results: + Resultater: + + + Stop + Stopp + + + + Download from URL + Last ned fra nettadresse + + + Download + Last ned + + + Clear + Nullstill + + + KiB/s + KiB/s + + + + Create torrent + Lag torrent + + + Update search plugin + Oppdater søkeprogramtillegget + + + Session ratio: + Nedlastingsforhold for økten: + + + Transfers + Overføringer + + + + Preview file + Forhåndsvis filen + + + + Clear log + Nullstill loggen + + + + Delete Permanently + Slett data + + + + Visit website + Besøk hjemmesiden + + + + Report a bug + Send en feilrapport + + + + Set upload limit + + + + + Set download limit + + + + + Set global download limit + + + + + Set global upload limit + + + + + Options + + + + + Decrease priority + + + + + Increase priority + + + + + Console + + + + + PropListDelegate + + False + Nei + + + True + Ja + + + + + Ignored + + + + + + + Normal + Normal (priority) + + + + + + High + High (priority) + + + + + + Maximum + Maximum (priority) + + + + + RSS + + + Search + Søk + + + + + New subscription + + + + + + + Mark items read + + + + + Update all + + + + + RSS feeds + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + Bullet + + + + + Article title + + + + + + Update all feeds + + + + + + Delete + Slett + + + + Feed URL + + + + + + Rename + + + + + + Update + + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + RSS feed downloader + + + + + New folder + + + + Create + Opprett + + + + Refresh RSS streams + + + + 2 + 2 + + + + RSSImp + + + Please type a rss stream url + + + + + Stream URL: + + + + + + Are you sure? -- qBittorrent + Er du sikker? -- qBittorrent + + + + + &Yes + &Ja + + + + + &No + &Nei + + + + Please choose a folder name + + + + + Folder name: + + + + + New folder + + + + + Overwrite attempt + + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + + qBittorrent + qBittorrent + + + + This rss feed is already in the list. + + + + + Are you sure you want to delete these elements from the list? + + + + + Are you sure you want to delete this element from the list? + + + + + Please choose a new name for this RSS feed + + + + + New feed name: + + + + + Name already in use + + + + + This name is already used by another item, please choose another one. + + + + + Date: + + + + + Author: + + + + + Unread + + + + + RssItem + + + No description available + + + + + RssStream + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + + SearchCategories + + + All categories + + + + + Movies + + + + + TV shows + + + + + Music + + + + + Games + + + + + Anime + + + + + Software + + + + + Pictures + + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Navn + + + Size + i.e: file size + Størrelse + + + Seeders + i.e: Number of full sources + Delere + + + Leechers + i.e: Number of partial sources + Nedlastere + + + Search engine + Søkemotor + + + + Empty search pattern + Ingen søketekst + + + + Please type a search pattern first + Skriv en tekst å søke etter først + + + No search engine selected + Ingen søkemotor valgt + + + You must select at least one search engine. + Du må velge minst en søkemotor. + + + + + Results + Resultater + + + + Searching... + Søker... + + + Search plugin update -- qBittorrent + Oppdatering av søkeprogramtillegg -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Søkeprogramtillegget kan oppdateres, ønsker du å oppdatere det nå? + +Endringer: + + + &Yes + &Ja + + + &No + &Nei + + + Search plugin update + Oppdatering av søkeprogramtillegget + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Oppdateringstjeneren er midlertidig utilgjengelig. + + + Your search plugin is already up to date. + Ditt søkeprogramtillegg er allerede oppdatert. + + + + Cut + + + + + Copy + + + + + Paste + + + + + Clear field + + + + + Clear completion history + + + + + Search Engine + Søkemotor + + + + + Search has finished + Søket er ferdig + + + + An error occured during search... + Det oppstod en feil under søket... + + + + Search aborted + Søket er avbrutt + + + + Search returned no results + Søket ga ingen resultater + + + + Results + i.e: Search results + Resultater + + + + + Unknown + + + + + SearchTab + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + Størrelse + + + + Seeders + i.e: Number of full sources + Delere + + + + Leechers + i.e: Number of partial sources + Nedlastere + + + + Search engine + Søkemotor + + + + TrackersAdditionDlg + + + Trackers addition dialog + + + + + List of trackers to add (one per line): + + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Kontakt meg om du skulle ønske å oversette qBittorrent til ditt eget språk. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Jeg ønsker å takke følgende personer, som frivillig har oversatt qBittorrent: + + + Preview impossible + Forhåndsvisning er ikke mulig + + + Sorry, we can't preview this file + Denne filen kan ikke forhåndsvises + + + Name + Navn + + + Size + Størrelse + + + Progress + Fremdrift + + + No URL entered + Ingen nettadresse oppgitt + + + Please type at least one URL. + Angi minst en nettadresse. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontakt meg om du ønsker å oversette qBittorrent til ditt eget språk. + + + + about + + + qBittorrent + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + Jeg ønsker å takke følgende personer, som frivillig har oversatt qBittorrent: + + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontakt meg om du ønsker å oversette qBittorrent til ditt eget språk. + + + + addTorrentDialog + + + Torrent addition dialog + Legg til torrent + + + + Save path: + Filsti for nedlasting: + + + + ... + ... + + + + Torrent size: + + + + + + Unknown + + + + + Free disk space: + + + + + Torrent content: + Torrent innhold: + + + + Download in sequential order (slower but good for previewing) + + + + File name + Filnavn + + + File size + Filstørrelse + + + Selected + Valgt for nedlasting + + + Download in correct order (slower but good for previewing) + Last ned i riktig rekkefølge (tregere, men tilpasset forhåndsvisningen) + + + + Add to download list in paused state + Legg til i nedlastningslisten som pauset + + + + Add + Legg til + + + + Cancel + Avbryt + + + select + velg + + + Unselect + Fjern markering + + + Select + velg + + + + Ignored + + + + + Normal + + + + + High + + + + + Maximum + + + + + Collapse all + + + + + Expand all + + + + + authentication + + + + Tracker authentication + Autentisering for sporingstjeneren + + + + Tracker: + Sporingstjener: + + + + Login + Innlogging + + + + Username: + Brukernavn: + + + + Password: + Passord: + + + + Log in + Logg på + + + + Cancel + Avbryt + + + + bandwidth_dlg + + + Bandwidth allocation + + + + + KiB/s + KiB/s + + + + bittorrent + + + %1 reached the maximum ratio you set. + + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + + + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' ble fjernet. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' pauset. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' gjenopptatt. + + + + '%1' is not a valid magnet URI. + + + + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' finnes allerede i nedlastingslisten. + + + + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' ble gjenopptatt (hurtig gjenopptaging) + + + + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' ble lagt til i nedlastingslisten. + + + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Klarte ikke å dekode torrentfilen: '%1' + + + + This file is either corrupted or this isn't a torrent. + Denne filen er enten ødelagt, eller det er ikke en torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + + Unable to decode %1 torrent file. + + + + + Couldn't listen on any of the given ports. + Klarte ikke å lytte på noen av de oppgitte portene. + + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + + Fast resume data was rejected for torrent %1, checking again... + + + + + Url seed lookup failed for url: %1, message: %2 + + + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Laster ned '%1'... + + + + createTorrentDialog + + Create Torrent file + Lag en torrentfil + + + ... + ... + + + Create + Opprett + + + + Cancel + Avbryt + + + Directory + Mappe + + + + Torrent Creation Tool + Verktøy for å opprette en torrentfil + + + <center>Destination torrent file:</center> + <center>Målfil:</center> + + + <center>Input file or directory:</center> + <center>Inndata eller mappe:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Annonserings-nettadresse:<br>(En per linje)</center> + + + <center>Comment:</center> + <center>Kommentarer:</center> + + + + Torrent file creation + + + + + Add file + + + + + Add folder + + + + + Announce urls (trackers): + + + + + Comment (optional): + + + + + Web seeds urls (optional): + + + + + File or folder to add to the torrent: + + + + + Piece size: + + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + Private (won't be distributed on DHT network if enabled) + + + + + Start seeding after creation + + + + + Create and save... + + + + + Progress: + + + + + createtorrent + + + Select destination torrent file + Velg torrent-målfil + + + + Torrent Files + Torrentfiler + + + Select input directory or file + Velg inndata eller mappe + + + No destination path set + Ingen målsti er angitt + + + Please type a destination path first + Velg en målsti først + + + + No input path set + Ingen filsti for inndata er valgt + + + + Please type an input path first + Velg en filsti for inndata først + + + Input path does not exist + Filstien til inndataene eksisterer ikke + + + Please type a correct input path first + Vennligst skriv en gyldig filsti til inndataene først + + + + + + Torrent creation + Torrentfilen blir opprettet + + + + Torrent was created successfully: + Vellykket opprettelse av torrentfil: + + + Please type a valid input path first + Velg en gyldig filsti for inndata først + + + + Select a folder to add to the torrent + + + + + Please type an announce URL + + + + + Torrent creation was unsuccessful, reason: %1 + + + + + Announce URL: + Tracker URL + + + + + Please type a web seed url + + + + + Web seed URL: + + + + + Select a file to add to the torrent + + + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + + Download Torrents from URLs + Last ned torrenter fra nettadresser + + + + Only one URL per line + Kun en nettadresse per linje + + + + Download + Last ned + + + + Cancel + Avbryt + + + + Download from urls + Last ned fra nettadresser + + + + No URL entered + Ingen nettadresse oppgitt + + + + Please type at least one URL. + Angi minst en nettadresse. + + + + downloading + + + Search + Søk + + + Total DL Speed: + Total nedlastingshastighet: + + + KiB/s + KiB/s + + + Session ratio: + Nedlastingsforhold for økten: + + + Total UP Speed: + Total opplastingshatighet: + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slett + + + Clear + Nullstill + + + + Preview file + Forhåndsvis filen + + + + Set upload limit + + + + + Set download limit + + + + + Delete Permanently + Slett data + + + + Torrent Properties + + + + + Open destination folder + + + + + Name + Navn + + + + Size + Størrelse + + + + Progress + + + + + DLSpeed + + + + + UpSpeed + + + + + Seeds/Leechs + Delere/Nedlastere + + + + Ratio + + + + + ETA + Gjenværende tid + + + + Buy it + + + + + Priority + + + + + Increase priority + + + + + Decrease priority + + + + + Force recheck + + + + + Copy magnet link + + + + + engineSelect + + + Search plugins + + + + + Installed search engines: + + + + + Name + Navn + + + + Url + + + + + Enabled + + + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + + Install a new one + + + + + Check for updates + + + + + Close + + + + + Enable + + + + + Disable + Deaktiver + + + + Uninstall + + + + + engineSelectDlg + + True + Ja + + + False + Nei + + + + Uninstall warning + + + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + + + + + Uninstall success + + + + + Select search plugins + + + + + + qBittorrent search plugins + + + + + + + + + + + + Search plugin install + + + + + + + Yes + + + + + + + + No + + + + + + + + + + + + + + + + + qBittorrent + qBittorrent + + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + + + + + + + + + Search plugin update + Oppdatering av søkeprogramtillegget + + + + + Sorry, update server is temporarily unavailable. + Oppdateringstjeneren er midlertidig utilgjengelig. + + + + All your plugins are already up to date. + + + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + + + + + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + + + + + All selected plugins were uninstalled successfully + + + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + + + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + + + + + Search engine plugin archive could not be read. + + + + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + + + + + New search engine plugin URL + + + + + URL: + + + + + misc + + + B + bytes + B + + + + KiB + kibibytes (1024 bytes) + KiB + + + + MiB + mebibytes (1024 kibibytes) + MiB + + + + GiB + gibibytes (1024 mibibytes) + GiB + + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + min + + + h + hours + timer + + + Unknown + ukjent + + + h + hours + timer + + + d + days + dager + + + + Unknown + Unknown (size) + Ukjent + + + + < 1m + < 1 minute + < 1 min + + + + %1m + e.g: 10minutes + %1min + + + + %1h%2m + e.g: 3hours 5minutes + %1time(r) %2min + + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1dag(er) %2time(r) %3min + + + + options_imp + + Options saved successfully! + Innstillingene ble lagret! + + + Choose Scan Directory + Velg mappe for gjennomsøking + + + Choose save Directory + Velg mappe for lagring + + + Choose ipfilter.dat file + Velg ipfilter.dat fil + + + I/O Error + Lese/Skrive feil + + + Couldn't open: + Klarte ikke å åpne: + + + in read mode. + i lesemodus. + + + Invalid Line + Ugyldig linje + + + Line + Linje + + + is malformed. + er ugyldig. + + + Range Start IP + Områdets start IP + + + Start IP: + Start IP: + + + Incorrect IP + Ugyldig IP + + + This IP is incorrect. + Denne IPen er ugyldig. + + + Range End IP + Områdets slutt IP + + + End IP: + Slutt IP: + + + IP Range Comment + IP område kommentarer + + + Comment: + Kommentar: + + + to + <min port> to <max port> + til + + + Choose your favourite preview program + Velg program for forhåndsvisning + + + Invalid IP + Ugyldig IP + + + This IP is invalid. + Denne IP adressen er ugyldig. + + + Options were saved successfully. + Innstillingene ble lagret. + + + + + Choose scan directory + Velg mappe for gjennomsøking + + + Choose an ipfilter.dat file + Velg en ipfilter.dat fil + + + + + Choose a save directory + Velg mappe for lagring + + + I/O Error + Input/Output Error + Lese/Skrive feil + + + Couldn't open %1 in read mode. + Klarte ikke å åpne %1 i lesemodus. + + + + + Choose an ip filter file + + + + + + Filters + + + + + pluginSourceDlg + + + Plugin source + + + + + Search plugin source: + + + + + Local file + + + + + Web link + + + + + preview + + + Preview selection + Forhåndsvis merkede filer + + + + File preview + Forhåndsvisning av fil + + + + The following files support previewing, <br>please select one of them: + Følgende filer kan forhåndsvises, <br>velg en av de: + + + + Preview + Forhåndsvis + + + + Cancel + Avbryt + + + + previewSelect + + + + Preview impossible + Forhåndsvisning er ikke mulig + + + + + Sorry, we can't preview this file + Denne filen kan ikke forhåndsvises + + + + Name + Navn + + + + Size + Størrelse + + + + Progress + + + + + properties + + + Torrent Properties + Egenskaper for torrent + + + File Name + Filnavn + + + Current Session + Nåværende økt + + + Download state: + Nedlastningstilstand: + + + + OK + OK + + + Finished + Ferdig + + + Queued for checking + I kø for kontrollering + + + Checking files + Kontrollerer filer + + + Connecting to tracker + Kobler til sporingstjener + + + Downloading Metadata + Laster ned metadata + + + Downloading + Laster ned + + + Seeding + Deler + + + Allocating + Tildeler + + + + Unknown + Ukjent + + + Complete: + Ferdig: + + + Partial: + Delvis: + + + + Files contained in current torrent: + Filer i denne torrenten: + + + + Size + Størrelse + + + Selected + Valgte + + + Unselect + Avmarker + + + Select + Marker + + + You can select here precisely which files you want to download in current torrent. + Velg hvilke filer du ønsker å laste ned fra den gjeldende torrenten. + + + Tracker + Sporingstjener + + + + Trackers: + Sporingstjenere: + + + + + None - Unreachable? + Ingen - Utilgjengelig? + + + Errors: + Feil: + + + + Progress + Fremgang + + + Main infos + Hovedinformasjon + + + Number of peers: + Antall nedlastere: + + + + Current tracker: + Nåværende sporingstjener: + + + + Total uploaded: + Totalt opplastet: + + + + Main info + + + + + Torrent information + + + + + Total downloaded: + Totalt nedlastet: + + + + Total failed: + Totalt antall feilet: + + + + Torrent content + Torrentinnhold + + + Options + Innstillinger + + + + Download in correct order (slower but good for previewing) + Last ned i riktig rekkefølge (tregere, men tilpasset forhåndsvisningen) + + + Seeders: + Delere: + + + Leechers: + Nedlastere: + + + Share Ratio: + Delingsforhold: + + + + Save path: + Filsti for nedlastinger: + + + + Creator: + + + + + Torrent hash: + + + + + Comment: + Kommentar: + + + + Current session + + + + + Share ratio: + Delingsforhold: + + + + Trackers + + + + + Priorities: + + + + + Normal: normal priority. Download order is dependent on availability + + + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + + + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + + + + + File name + Filnavn + + + + + Priority + + + + + + qBittorrent + qBittorrent + + + + Trackers list can't be empty. + + + + + Ignored: file is not downloaded at all + + + + + Ignored + + + + + Normal + + + + + Maximum + + + + + High + + + + + Url seeds + + + + + New url seed: + + + + + This url seed is already in the list. + + + + None + i.e: No error message + Ingen + + + + New url seed + New HTTP source + + + + + The following url seeds are available for this torrent: + + + + + Priorities error + + + + + Error, you can't filter all the files in a torrent. + + + + + Downloaded pieces + + + + + Collapse all + + + + + Expand all + + + + + ... + ... + + + + + Choose save path + Velg filsti for nedlasting + + + + Save path creation error + Feil ved oprettelsen av filsti + + + + Could not create the save path + Kunne ikke opprette nedlastingsfilstien + + + + search_engine + + + + Search + Søk + + + Search Engines + Søkemotorer + + + Search Pattern: + Søketekst: + + + Stop + Stopp + + + + Status: + Status: + + + + Stopped + Stoppet + + + Results: + Resultater: + + + + Download + Last ned + + + Clear + Nullstill + + + Update search plugin + Oppdater søkeprogramtillegget + + + + Search engines... + + + + + seeding + + + Search + Søk + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + + + + + Start + Start + + + + Pause + Pause + + + + Delete + Slett + + + + Delete Permanently + Slett data + + + + Torrent Properties + + + + + Preview file + Forhåndsvis filen + + + + Set upload limit + + + + + Open destination folder + + + + + Name + Navn + + + + Size + Størrelse + + + + Upload Speed + + + + + + Connected peers + + + + + + Seeds / Leechers + + + + + Copy magnet link + + + + Leechers + Nedlastere + + + + Ratio + + + + + Buy it + + + + + Force recheck + + + + + Total uploaded + + + + + subDownloadThread + + + Host is unreachable + + + + + File was not found (404) + + + + + Connection was denied + + + + + Url is invalid + + + + + Connection failure + + + + + Connection was timed out + + + + + Incorrect network interface + + + + + Unknown error + + + + + I/O Error + Lese/Skrive feil + + + + Could not resolve proxy + + + + + torrentAdditionDialog + + True + Ja + + + + + Unable to decode torrent file: + Klarte ikke å dekode torrentfilen: + + + This file is either corrupted or this isn't a torrent. + Denne filen er enten ødelagt, eller det er ikke en torrent. + + + + + Choose save path + Velg filsti for nedlasting + + + False + Nei + + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + + Empty save path + Ingen filsti oppgitt + + + + Please enter a save path + Velg en filsti for nedlasting + + + + Save path creation error + Feil ved oprettelsen av filsti + + + + Could not create the save path + Kunne ikke opprette nedlastingsfilstien + + + + Invalid file selection + Ugyldig valg av filer + + + + You must select at least one file in the torrent + Du må velge minst en fil fra torrenten + + + + File name + Filnavn + + + + Size + Størrelse + + + + Progress + + + + + + Priority + + + + diff --git a/src/lang/qbittorrent_nl.qm b/src/lang/qbittorrent_nl.qm new file mode 100644 index 0000000000000000000000000000000000000000..ff1480b5b75e71a1462f345bff824118ab692119 GIT binary patch literal 67809 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 F{vUDM3KIYT literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_nl.ts b/src/lang/qbittorrent_nl.ts new file mode 100644 index 000000000..a091957ad --- /dev/null +++ b/src/lang/qbittorrent_nl.ts @@ -0,0 +1,4826 @@ + + + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + About qBittorrent + Over qBittorrent + + + About + Over + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Een bittorrent client die gebruik maakt van Qt4 en libtorrent, geprogrammeerd in C++.<br> +<br> +Copyright 2006 door Christophe Dumez<br> +<br> <u>Website:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + Author + Auteur + + + qBittorrent Author + qBittorrent Auteur + + + Name: + Naam: + + + Country: + Land: + + + E-mail: + E-mail: + + + Home page: + Website: + + + Christophe Dumez + Christophe Dumez + + + France + Frankrijk + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Met dank aan + + + Translation + Vertaling + + + License + Licentie + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + Verjaardag: + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Een Bittorrent-client geprogrammeerd in C++, gebaseerd op de Qt4 toolkit</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">en libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Homepage:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + Occupation: + Werk: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Student in computer wetenschap + + + Thanks to + Met dank aan + + + + BandwidthAllocationDialog + + Upload limit: + Uploadlimiet: + + + Download limit: + Downloadlimiet: + + + Unlimited + Unlimited (bandwidth) + Ongelimiteerd + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent console + + + General + Algemeen + + + Blocked IPs + Geblokkeerde IP's + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Instellingen -- qBittorrent + + + Options + Instellingen + + + Main + Algemeen + + + Scanned Dir: + Gescande map: + + + ... + ... + + + Save Path: + Opslaan pad: + + + Connection Settings + Verbindingsinstellingen + + + Download Limit: + Downloadlimiet: + + + Upload Limit: + Uploadlimiet: + + + Max Connects: + Maximale aantal verbindingen: + + + Port range: + Poort reeks: + + + Share ratio: + Deelratio: + + + Kb/s + Kb/s + + + Disable + Uitschakelen + + + connections + verbindingen + + + to + naar + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Enable directory scan (auto add torrent files inside) + Mappen scannen inschakelen (torrent bestanden automatisch toevoegen) + + + IP Filter + IP Filter + + + Activate IP Filtering + IP filteren activeren + + + Filter Settings + Filterinstellingen + + + Add Range + Reeks toevoegen + + + Remove Range + Reeks verwijden + + + ipfilter.dat URL or PATH: + ip[filter.dat URL of pad: + + + Start IP + Begin IP + + + End IP + Eind IP + + + Origin + Oorsprong + + + Comment + Commentaar + + + Proxy + Proxy + + + Enable connection through a proxy server + Verbinden via een proxy server inschakelen + + + Proxy Settings + Proxyinstellingen + + + Server IP: + Server IP: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Poort: + + + Authentication + Authenticatie + + + User Name: + Gebruikersnaam: + + + Password: + Wachtwoord: + + + Proxy server requires authentication + Proxy server vereist authenticatie + + + Language + Taal + + + Please choose your preferred language in the following list: + Selecteer uw taal in de onderstaande lijst: + + + Language settings will take effect after restart. + Taalinstellingen zullen van effect worden na herstart. + + + English + Engels + + + French + Frans + + + Simplified Chinese + Chinese + + + Korean + Koreaans + + + Spanish + Spaans + + + Catalan + Catalaans + + + German + Duits + + + OK + OK + + + Cancel + Annuleren + + + Apply + Toepassen + + + ipfilter.dat Path: + ipfilter.dat pad: + + + Clear finished downloads on exit + Verwijder voltooide downloads bij afsluiten + + + Ask for confirmation on exit + Vraag om bevestiging bij afsluiten + + + Go to systray when minimizing window + Ga naar systeemvak bij venster minimaliseren + + + Misc + Overig + + + Localization + Taalinstellingen + + + Language: + Taal: + + + Behaviour + Gedrag + + + OSD + OSD + + + Always display OSD + OSD altijd weergeven + + + Display OSD only if window is minimized or iconified + OSD alleen weergeven indien venster geminimaliseerd of in systeemvak + + + Never display OSD + OSD nooit weergeven + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + DHT (Geen Tracker): + + + Disable DHT (Trackerless) support + Stop DHT (Geen Tracker) ondersteuning + + + Automatically clear finished downloads + Verwijder automatish downloads die gereed zijn + + + Preview program + Kijk vooruit op het programma + + + Audio/Video player: + Audio/Video Speler: + + + Systray Messages + Systeemvak Berichten + + + Always display systray messages + Altijd systeemvak berichten weergeven + + + Display systray messages only when window is hidden + Systeemvak berichten alleen weergeven als het venster verborgen is + + + Never display systray messages + Systeemvak berichten nooit weergeven + + + DHT configuration + DHT configuratie + + + DHT port: + DHT poort: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Let op:</b> Veranderingen worden toegepast na herstarten van qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Vertalers opmerking:</b> Wanneer qBittorrent niet beschikbaar is in uw taal,<br/>en u zou willen vertalen in uw eigen taal,<br/>neem alstublieft contact op met chris@qbittorrent.org. + + + Display a torrent addition dialog everytime I add a torrent + Geef een torrent toevoegen dialoog weer elke keer als ik een torrent toevoeg + + + Default save path + Standaard oplag pad + + + Disable DHT (Trackerless) + DHT (geen tracker) uitschakelen + + + Disable Peer eXchange (PeX) + Peer eXchange (PeX) uitschakelen + + + Go to systray when closing main window + Ga naar systeemvak bij venster sluiten + + + Connection + Verbinding + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (geen tracker) + + + Torrent addition + Torrents toevoegen + + + Main window + Hoofdvenster + + + Systray messages + Systeemvak berichten + + + Directory scan + Map scannen + + + Style (Look 'n Feel) + Stijl (Look 'n Feel) + + + Plastique style (KDE like) + Plastique stijl (zoals KDE) + + + Cleanlooks style (GNOME like) + Cleanlooks stijl (zoals GNOME) + + + Motif style (default Qt style on Unix systems) + Motif stijl (standaard Qt stijl op Unix systemen) + + + CDE style (Common Desktop Environment like) + CDE stijl (zoals Common Desktop Environment) + + + MacOS style (MacOSX only) + MacOS stijl (alleen MacOSX) + + + Exit confirmation when the download list is not empty + Toestemming vragen om af te sluiten als de downloadlijst niet leeg is + + + Disable systray integration + Systeemvak integratie uitschakelen + + + WindowsXP style (Windows XP only) + WindowsXP stijl (alleen Windows XP) + + + Server IP or url: + Server IP of url: + + + Proxy type: + Proxy type: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Beïnvloedde verbindingen + + + Use proxy for connections to trackers + Proxy gebruiken voor verbindingen met tracker + + + Use proxy for connections to regular peers + Proxy gebruiken voor verbindingen met normale peers + + + Use proxy for connections to web seeds + Proxy gebruiken voor verbindingen met web seeds + + + Use proxy for DHT messages + Proxy gebruiken voor DHT berichten + + + Encryption + Encryptie + + + Encryption state: + Encryptie: + + + Enabled + Ingeschakeld + + + Forced + Geforceerd + + + Disabled + Uitgeschakeld + + + Preferences + Voorkeuren + + + General + Algemeen + + + User interface settings + User interface instellingen + + + Visual style: + Visuele stijl: + + + Cleanlooks style (Gnome like) + Cleanlooks stijl (zoals Gnome) + + + Motif style (Unix like) + Motif stijl (zoals Unix) + + + Ask for confirmation on exit when download list is not empty + Toestemming vragen tijdens afsluiten als de downloadlijst niet leeg is + + + Display current speed in title bar + Huidige snelheid weergeven in titelbalk + + + System tray icon + Systeemvakicoon + + + Disable system tray icon + Systeemvakicon uitschakelen + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Sluiten naar systeemvak + + + Minimize to tray + Minimaliseren naar systeemvak + + + Show notification balloons in tray + Notificaties weergeven in systeemvak + + + Media player: + Mediaspeler: + + + Downloads + Downloads + + + Put downloads in this folder: + Downloads in deze map plaatsen: + + + Pre-allocate all files + Schijfruimte vooraf toewijzen voor alle bestanden + + + When adding a torrent + Tijdens torrent toevoegen + + + Display torrent content and some options + Torrentinhoud en enkele opties weergeven + + + Do not start download automatically + The torrent will be added to download list in pause state + Download niet automatisch starten + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Map in de gaten houden + + + UI + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Dubbelklik actie + + + Download list: + Downloadlijst: + + + Start/Stop + Start/Stop + + + Open folder + Open map + + + Show properties + Toon eigenschappen + + + Seeding list: + Seed lijst: + + + Download folder: + Downloadmap: + + + Temp folder: + Tijdelijke map: + + + Automatically download torrents present in this folder: + Automatisch aanwezige torrents in deze map downloaden: + + + Listening port + Luisterpoort + + + to + i.e: 1200 to 1300 + tot + + + Enable UPnP port mapping + UPnP port mapping inschakelen + + + Enable NAT-PMP port mapping + NAT-PMP port mapping inschakelen + + + Global bandwidth limiting + Globaal bandbreedtelimiet + + + Upload: + Upload: + + + Download: + Download: + + + Bittorrent features + + + + Use the same port for DHT and Bittorrent + Gebruik dezelfde poort voor DHT en Bittorrent + + + Spoof µtorrent to avoid ban (requires restart) + Spoof µtorrent om ban te voorkomen (herstart nodig) + + + Type: + Type: + + + (None) + (Geen) + + + Proxy: + Proxy: + + + Username: + Gebruikersnaam: + + + Bittorrent + Bittorrent + + + Connections limit + Verbindingslimiet + + + Global maximum number of connections: + Globaal verbindingslimiet: + + + Maximum number of connections per torrent: + Verbindingslimiet per torrent: + + + Maximum number of upload slots per torrent: + Maximum aantal uploads per torrent: + + + Additional Bittorrent features + Extra Bittorrent mogelijkheden + + + Enable DHT network (decentralized) + DHT (gedecentraliseerd) netwerk inschakelen + + + Enable Peer eXchange (PeX) + Peer eXchange (PeX) inschakelen + + + Enable Local Peer Discovery + Local Peer Discovery inschakelen + + + Encryption: + Encryptie: + + + Share ratio settings + Deel ratio instellingen + + + Desired ratio: + Gewenste ratio: + + + Filter file path: + Filterbestand pad: + + + transfer lists refresh interval: + Overdrachtlijsten vernieuwingsinterval: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + RSS feeds vernieuwingsinterval: + + + minutes + minuten + + + Maximum number of articles per feed: + Maximum aantal artikelen per feed: + + + File system + Bestandssysteem + + + Remove finished torrents when their ratio reaches: + Complete torrents verwijderen bij een ratio van: + + + System default + Systeem standaard + + + Start minimized + Start geminimaliseerd + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Actie bij dubbelklik in overdracht lijsten + + + In download list: + In download lijst: + + + Pause/Start torrent + Pauze/Start torrent + + + Open destination folder + Open doel map + + + Display torrent properties + Geef torrent eigenschappen weer + + + In seeding list: + In seed lijst: + + + Folder scan interval: + Map scan interval: + + + seconds + seconden + + + Spoof Azureus to avoid ban (requires restart) + Spoof Azureus om ban te voorkomen (herstart verplicht) + + + Web UI + Web UI + + + Port used for incoming connections: + Poort voor inkomende verbindingen: + + + Random + Willekeurig + + + Enable Web User Interface + Web Gebruikers Interface inschakelen + + + HTTP Server + HTTP Server + + + Enable RSS support + RSS ondersteuning inschakelen + + + RSS settings + RSS instellingen + + + Torrent queueing + Torrent wachtrij + + + Enable queueing system + Wachtrij inschakelen + + + Maximum active downloads: + Maximum actieve downloads: + + + Maximum active torrents: + Maximum actieve torrents: + + + Display top toolbar + Werkbalk boven weergeven + + + Search engine proxy settings + Zoekmachine proxy instellingen + + + Bittorrent proxy settings + Bittorrent proxy instellingen + + + Maximum active uploads: + Maximum actieve uploads: + + + + DownloadingTorrents + + Name + i.e: file name + Naam + + + Size + i.e: file size + Grootte + + + Progress + i.e: % downloaded + Voortgang + + + DL Speed + i.e: Download speed + DL snelheid + + + UP Speed + i.e: Upload speed + UP snelheid + + + Seeds/Leechers + i.e: full/partial sources + Seeds/Leechers + + + Seeds/Leechs + i.e: full/partial sources + Up-/Downloaders + + + Ratio + Verhouding + + + ETA + i.e: Estimated Time of Arrival / Time left + Geschatte resterende tijd + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 gestart. + + + Be careful, sharing copyrighted material without permission is against the law. + Wees voorzichtig, materiaal met copyright delen zonder toestemming is verboden. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>is geblokkeerd</i> + + + Fast resume data was rejected for torrent %1, checking again... + Snelle vervatting voor torrent %1 mislukt. Bezig met opnieuw controleren... + + + Url seed lookup failed for url: %1, message: %2 + Url seed raadpleging mislukt voor url: %1, bericht: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' toegevoegd aan de downloadlijst. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' hervat. (snelle hervatting) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' staat al in de downloadlijst. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrentbestand kan niet worden gedecodeerd: '%1' + + + This file is either corrupted or this isn't a torrent. + Dit bestand is beschadigd of is geen torrent. + + + Couldn't listen on any of the given ports. + Kan niet luisteren op de aangegeven poorten. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Bezig met downloaden van '%1', even geduld alstublieft... + + + Hide or Show Column + Verberg of Toon Kolom + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping fout, bericht: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping succesvol, bericht: %1 + + + Priority + Prioriteit + + + + FeedDownloader + + RSS Feed downloader + RSS Feed downloader + + + RSS feed: + RSS feed: + + + Feed name + Feed naam + + + Automatically download torrents from this feed + Automatisch torrents downloaden van deze feed + + + Download filters + Download filters + + + Filters: + Filters: + + + Filter settings + Filterinstellingen + + + Matches: + Resultaten: + + + Does not match: + Komt niet overeen: + + + Destination folder: + Doelmap: + + + ... + ... + + + Filter testing + Filter testen + + + Torrent title: + Torrent titel: + + + Result: + Resultaat: + + + Test + Test + + + Import... + Importeer... + + + Export... + Exporteer... + + + Rename filter + Hernoem filter + + + Remove filter + Verwijder filter + + + Add filter + Voeg filter toe + + + + FeedDownloaderDlg + + New filter + Nieuwe filter + + + Please choose a name for this filter + Kies alstublieft een naam voor de filter + + + Filter name: + Filternaam: + + + Invalid filter name + Onjuiste filternaam + + + The filter name cannot be left empty. + De filternaam kan niet leeg blijven. + + + This filter name is already in use. + Deze filternaam is al gebruikt. + + + Filter testing error + Filtertest fout + + + Please specify a test torrent name. + Specificeer een testtorrentnaam. + + + matches + resultaten + + + does not match + komt niet overeen + + + Select file to import + Selecteer bestand om te importeren + + + Filters Files + Filtert bestanden + + + Import successful + Importeren gelukt + + + Filters import was successful. + Filters importeren gelukt. + + + Import failure + Fout tijdens importeren + + + Filters could not be imported due to an I/O error. + Filters konden niet worden geïmporteerd door een I/O fout. + + + Select destination file + Selecteer doelbestand + + + Overwriting confirmation + Overschrijvingsbevestiging + + + Are you sure you want to overwrite existing file? + Weer u zeker dat u het bestaande bestand wil overschrijven? + + + Export successful + Exporteren gelukt + + + Filters export was successful. + Filters exporteren gelukt. + + + Export failure + Fout tijdens exporteren + + + Filters could not be exported due to an I/O error. + Filters konden niet worden geëxporteerd door een I/O fout. + + + + FeedList + + Unread + Ongelezen + + + + FilterParserThread + + I/O Error + Input/Output Error + I/O Fout + + + Couldn't open %1 in read mode. + Kon %1 niet openen om te lezen. + + + %1 is not a valid PeerGuardian P2B file. + %1 is geen geldig PeerGuardian P2B bestand. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Name + i.e: file name + Naam + + + Size + i.e: file size + Grootte + + + Seeds / Leechers + Seeds / Leechers + + + Connected peers + Verbonden peers + + + Progress + i.e: % downloaded + Voortgang + + + DL Speed + i.e: Download speed + DL snelheid + + + UP Speed + i.e: Upload speed + UP snelheid + + + Seeds/Leechs + i.e: full/partial sources + Up-/Downloaders + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + Geschatte resterende tijd + + + None + i.e: No error message + Geen + + + Ratio + Verhouding + + + Leechers + i.e: full/partial sources + Downloaders + + + Total uploaded + i.e: Total amount of uploaded data + Totaal geüpload + + + Hide or Show Column + Verberg of Toon Kolom + + + Incomplete torrent in seeding list + Incomplete torrent in seed lijst + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + De status van torrent '%1' veranderde van 'seeden' naar 'downloaden'. Wilt u het terug naar de download lijst verplaatsen? (anders zal de torrent verwijderd worden) + + + Priority + Prioriteit + + + + GUI + + qBittorrent + qBittorrent + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: Door Christophe Dumez :: Copyright (c) 2006 + + + started. + gestart. + + + qBittorrent + qBittorrent + + + DL Speed: + DL snelheid: + + + kb/s + kb/s + + + UP Speed: + UP snelheid: + + + Open Torrent Files + Open Torrent bestanden + + + Torrent Files + Torrent bestanden + + + Couldn't create the directory: + Kon map niet aanmaken: + + + already in download list. + <file> already in download list. + Staat al in downloadlijst. + + + kb/s + kb/s + + + Unknown + Onbekend + + + added to download list. + Toegevoegd aan downloadlijst. + + + resumed. (fast resume) + Hervat. (snel hervatten) + + + Unable to decode torrent file: + Torrentfile kan niet gedecodeerd worden: + + + This file is either corrupted or this isn't a torrent. + Dit bestand is corrupt of is geen torrent. + + + Are you sure? -- qBittorrent + Weet u het zeker? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Weet u zeker dat u alle bestanden uit de downloadlijst wilt verwijderen? + + + &Yes + &Ja + + + &No + &Nee + + + Download list cleared. + Downloadlijst leeg gemaakt. + + + Are you sure you want to delete the selected item(s) in download list? + Weet u zeker dat u de geselecteerde bestanden uit de downloadlijst wilt verwijderen? + + + removed. + <file> removed. + verwijderd. + + + Listening on port: + Aan het luisteren op poort: + + + paused + gepauzeerd + + + All Downloads Paused. + Alle downloads gepauzeerd. + + + started + gestart + + + All Downloads Resumed. + Alle downloads hervat. + + + paused. + <file> paused. + gepauzeerd. + + + resumed. + <file> resumed. + hervat. + + + <b>Connection Status:</b><br>Online + <b>Verbindingsstatus:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Verbindingsstatus:</b><br>Gefirewalled?<br><i>Geen inkomende verbindingen...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Verbindingsstatus:</b><br>Offline<br><i>Geen peers gevonden...</i> + + + has finished downloading. + is klaar met downloaden. + + + Couldn't listen on any of the given ports. + Kan niet luisteren op de aangegeven poorten. + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL snelheid: + + + /s + <unit>/seconds + /s + + + Finished + Klaar + + + Checking... + Controleren... + + + Connecting... + Verbinding maken... + + + Downloading... + Downloaden... + + + m + minutes + m + + + h + hours + u + + + d + days + d + + + None + Geen + + + Empty search pattern + Leeg zoekpatroon + + + Please type a search pattern first + Type alstublieft eerst een zoekpatroon + + + No seach engine selected + Geen zoekmachine gekozen + + + You must select at least one search engine. + U moet tenminste een zoekmachine kiezen. + + + Searching... + Zoeken... + + + I/O Error + I/O Fout + + + Torrent file URL + Torrent bestand URL + + + Torrent file URL: + Torrent bestand URL: + + + Are you sure you want to quit? -- qBittorrent + Weet u zeker dat u wil afsluiten? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Weet u zeker dat u qbittorrent af wil sluiten? + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Geblokkeerd + + + Search is finished + Zoeken is klaar + + + An error occured during search... + Een fout trad op tijdens zoeken... + + + Search aborted + Zoeken afgebroken + + + Search returned no results + Zoeken gaf geen resultaten + + + Search is Finished + Zoeken is Klaar + + + Search plugin update -- qBittorrent + Zoeken plugin update -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Zoeken plugin kan bijgewerkt worden, wilt u het bijwerken? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Sorry, update server is tijdelijk niet bereikbaar. + + + Your search plugin is already up to date. + Uw zoeken plugin is al bijgewerkt. + + + Results + Resultaten + + + Name + Naam + + + Size + Grootte + + + Progress + Voortgang + + + DL Speed + DL snelheid + + + UP Speed + UP snelheid + + + Status + Status + + + ETA + Geschatte resterende tijd + + + Seeders + Uploaders + + + Leechers + Downloaders + + + Search engine + Zoekmachine + + + Stalled + state of a torrent whose DL Speed is 0 + Stilstand + + + Paused + Gepauzeerd + + + Preview process already running + Vooruitkijk proccess is al bezig + + + There is already another preview process running. +Please close the other one first. + Er is al een ander vooruitkijk proccess actief. +Stop het eerste proccess eerst. + + + + Couldn't download + Couldn't download <file> + Kon niet downloaden + + + reason: + Reason why the download failed + reden: + + + Downloading + Example: Downloading www.example.com/test.torrent + Downloaden + + + Please wait... + Wachten... + + + Transfers + Overdrachten + + + Download finished + Download afgerond + + + has finished downloading. + <filename> has finished downloading. + is klaar met downloaden. + + + Search Engine + Zoekmachine + + + Are you sure you want to quit qBittorrent? + Weet u zeker dat u qBittorrent af wil sluiten? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Weet u zeker dat u de geselecteerde onderdelen in de download lijst en van harde schijf wil verwijderen? + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Verbindingsstatus: + + + Offline + Offline + + + No peers found... + Geen peers gevonden... + + + Name + i.e: file name + Naam + + + Size + i.e: file size + Grootte + + + Progress + i.e: % downloaded + Voortgang + + + DL Speed + i.e: Download speed + DL snelheid + + + UP Speed + i.e: Upload speed + UP snelheid + + + Seeds/Leechs + i.e: full/partial sources + Up-/Downloaders + + + ETA + i.e: Estimated Time of Arrival / Time left + Geschatte resterende tijd + + + Seeders + i.e: Number of full sources + Uploaders + + + Leechers + i.e: Number of partial sources + Downloaders + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 gestart. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + DL snelheid: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + UP snelheid: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Voltooid + + + Checking... + i.e: Checking already downloaded parts... + Controleren... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Stilstaand + + + Are you sure you want to quit? + Weet u zeker dat u wilt afsluiten? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' is verwijderd. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' toegevoegd aan de downloadlijst. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' hervat. (snelle hervatting) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' staat al in de downloadlijst. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrentbestand kan niet worden gedecodeerd: '%1' + + + None + i.e: No error message + Geen + + + Listening on port: %1 + e.g: Listening on port: 1666 + Aan het luisteren op poort: %1 + + + All downloads were paused. + Alle downloads gepauzeerd. + + + '%1' paused. + xxx.avi paused. + '%1' gepauzeerd. + + + Connecting... + i.e: Connecting to the tracker... + Verbinding maken... + + + All downloads were resumed. + Alle downloads hervat. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' hervat. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 is klaar met downloaden. + + + I/O Error + i.e: Input/Output Error + I/O Fout + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Een fout is opgetreden tijdens het lezen of schrijven van %1. De schijf is waarschijnlijk vol, de download is gepauzeerd + + + Connection Status: + Verbindingsstatus: + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Geblokkeerd? + + + No incoming connections... + Geen inkomende verbindingen... + + + No search engine selected + Geen zoekmachine gekozen + + + Search plugin update + Zoekplugin update + + + Search has finished + Zoeken is klaar + + + Results + i.e: Search results + Resultaten + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Bezig met downloaden van '%1', even geduld alstublieft... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Er is een fout opgetreden (schijf vol?), '%1' gepauzeerd. + + + Search + Zoeken + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent is verbonden aan poort: %1 + + + DHT support [ON], port: %1 + DHT ondersteuning [AAN], poort: %1 + + + DHT support [OFF] + DHT ondersteuning [UIT] + + + PeX support [ON] + PeX ondersteuning [AAN] + + + PeX support [OFF] + PeX ondersteuning [UIT] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + De downloadlijst is niet leeg. +Weet u zeker dat u qBittorrent wilt afsluiten? + + + Downloads + Downloads + + + Are you sure you want to delete the selected item(s) in finished list? + Weet u zeker dat u de geselecteerde item(s) wilt verwijderen van de voltooidlijst? + + + UPnP support [ON] + UPnP ondersteuning [AAN] + + + Encryption support [ON] + Encryptie ondersteuning [AAN] + + + Encryption support [FORCED] + Encryptie ondersteuning [GEFORCEERD] + + + Encryption support [OFF] + Encryptie ondersteuning [UIT] + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Een I/O fout trad op voor torrent %1. Reden: %2 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Url download fout + + + Couldn't download file at url: %1, reason: %2. + Kon bestand niet downloaden vanaf url: %1, reden: %2. + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Weet u zeker dat u de geselecteerde item(s) wilt verwijderen van de downloadlijst en de harde schijf? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Weet u zeker dat u de geselecteerde item(s) wilt verwijderen van de voltooidlijst en de harde schijf? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' is permanent verwijderd. + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent is verbonden met poort: TCP/%1 + + + UPnP support [OFF] + UPnP ondersteuning [UIT] + + + NAT-PMP support [ON] + NAT-PMP ondersteuning [AAN] + + + NAT-PMP support [OFF] + NAT-PMP ondersteuning [UIT] + + + DHT support [ON], port: UDP/%1 + DHT ondersteuning [AAN], poort: UDP/%1 + + + Local Peer Discovery [ON] + Local Peer Discovery [AAN] + + + Local Peer Discovery support [OFF] + Local Peer Discovery ondersteuning [UIT] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' is verwijderd omdat de ratio de maximale ingestelde waarde heeft bereikt. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + DL: %1 KiB/s + DL: %1 KiB/s + + + UP: %1 KiB/s + UP: %1 KiB/s + + + Ratio: %1 + Verhouding: %1 + + + DHT: %1 nodes + DHT: %1 nodes + + + No direct connections. This may indicate network configuration problems. + Geen directe verbindingen. Dit kan komen door netwerkconfiguratie problemen. + + + Uploads + Uploads + + + Options were saved successfully. + Opties zijn succesvol opgeslagen. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: By Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Totale DL snelheid: + + + Kb/s + Kb/s + + + Total UP Speed: + Totale UP snelheid: + + + Name + Naam + + + Size + Grootte + + + % DL + % DL + + + DL Speed + DL snelheid + + + UP Speed + UP snelheid + + + Status + Status + + + ETA + Geschatte resterende tijd + + + &File + &Bestand + + + &Options + &Opties + + + &Help + &Help + + + &Edit + &Bewerken + + + Open + Open + + + Exit + Afsluiten + + + Preferences + Voorkeuren + + + About + Over + + + Start + Start + + + Pause + Pauze + + + Delete + Verwijderen + + + Pause All + Pauzeer alles + + + Start All + Start alles + + + Documentation + Documentatie + + + Connexion Status + Verbindingsstatus + + + Delete All + Verwijder alles + + + Torrent Properties + Torrent eigenschappen + + + Connection Status + Verbindingsstatus + + + Downloads + Downloads + + + Search + Zoeken + + + Search Pattern: + Zoekpatroon: + + + Status: + Status: + + + Stopped + Gestopt + + + Search Engines + Zoekmachines + + + Results: + Resultaten: + + + Stop + Stop + + + Seeds + Uploaders + + + Leechers + Downloaders + + + Search Engine + Zoekmachine + + + Download from URL + Download vanaf URL + + + Download + Download + + + Clear + Wissen + + + KiB/s + KiB/s + + + Create torrent + Maak torrent + + + Ratio: + Deelverhouding: + + + Update search plugin + Zoeken plugin bijwerken + + + Session ratio: + Sessie deelverhouding: + + + Transfers + Overdrachten + + + Preview file + Kijk vooruit op bestand + + + Clear log + Wist log + + + Delete Permanently + Permanent verwijderen + + + Visit website + Bezoek website + + + Report a bug + Meld een fout + + + Set upload limit + Uploadlimiet instellen + + + Set download limit + Downloadlimiet instellen + + + Set global download limit + Globale downloadlimiet instellen + + + Set global upload limit + Globale uploadlimiet instellen + + + Options + Instellingen + + + Decrease priority + Prioriteit verlagen + + + Increase priority + Prioriteit verhogen + + + Console + Console + + + + PropListDelegate + + False + Onwaar + + + True + Waar + + + Ignored + Genegeerd + + + Normal + Normal (priority) + Normaal + + + High + High (priority) + Hoog + + + Maximum + Maximum (priority) + Maximum + + + + QTextEdit + + Clear + Wissen + + + + RSS + + Search + Zoeken + + + New subscription + Nieuwe subscriptie + + + Mark items read + Markeer items als gelezen + + + Update all + Update alles + + + 1 + 1 + + + Feed URL + Feed URL + + + Update + Updaten + + + New folder + Nieuwe map + + + RSS feeds + RSS feeds + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(dubbelklik om te downloaden)</span></p></body></html> + + + Update all feeds + Update alle feeds + + + Delete + Verwijderen + + + Rename + Hernoemen + + + Refresh + Vernieuwen + + + Download torrent + Download torrent + + + Open news URL + Open nieuws URL + + + Copy feed URL + Kopieer feed URL + + + RSS feed downloader + RSS feed downloader + + + Create + Maken + + + Delete selected streams + Geselecteerde stream verwijderen + + + Refresh RSS streams + Vernieuw RRS streams + + + Add a new RSS stream + Voeg een nieuwe RSS stream toe + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Nieuws:</b> <i>(dubbel-klik om de link in uw webbrowser te openen)</i> + + + Add RSS stream + RSS stream toevoegen + + + Refresh all streams + Alle streams vernieuwen + + + RSS streams: + RSS streams: + + + 2 + 2 + + + Mark all as read + Alles markeren als gelezen + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Geef alstublieft een rss stream url + + + Stream URL: + Stream URL: + + + Please choose a new name for this stream + Kies een nieuwe naam voor deze stream + + + New stream name: + Nieuwe stream naam: + + + Are you sure? -- qBittorrent + Weet u het zeker? -- qBittorrent + + + &Yes + &Ja + + + &No + &Nee + + + Are you sure you want to delete this stream from the list? + Weet u zeker dat u deze stream van de lijst wilt verwijderen? + + + Description: + Omschrijving: + + + url: + url: + + + Last refresh: + Laatste vernieuwing: + + + Please choose a folder name + Kies een mapnaam + + + Folder name: + Mapnaam: + + + New folder + Nieuwe map + + + Overwrite attempt + Overschrijfpoging + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Kan %1 item niet overschrijven. + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Deze rss feed staat al in de lijst. + + + Are you sure you want to delete these elements from the list? + Weet u zeker dat u deze elementen van de lijst wil verwijderen? + + + Are you sure you want to delete this element from the list? + Weet u zeker dat u dit element van de lijst wil verwijderen? + + + Please choose a new name for this RSS feed + Kies een nieuwe naam voor deze RSS feed + + + New feed name: + Nieuwe feed naam: + + + Name already in use + Naam al in gebruik + + + This name is already used by another item, please choose another one. + Deze naam is al gebruikt door een ander item, kies een andere naam. + + + Date: + Datum: + + + Author: + Auteur: + + + Unread + Ongelezen + + + + RssItem + + No description available + Geen omschrijving beschikbaar + + + + RssStream + + %1 ago + 10min ago + %1 geleden + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + Never + Nooit + + + + SearchCategories + + All categories + Alle categorieën + + + Movies + Films + + + TV shows + TV programma's + + + Music + Muziek + + + Games + Spellen + + + Anime + Anime + + + Software + Software + + + Pictures + Afbeeldingen + + + Books + Boeken + + + + SearchEngine + + Name + i.e: file name + Naam + + + Size + i.e: file size + Grootte + + + Seeders + i.e: Number of full sources + Uploaders + + + Leechers + i.e: Number of partial sources + Downloaders + + + Search engine + Zoekmachine + + + Empty search pattern + Leeg zoekpatroon + + + Please type a search pattern first + Type alstublieft eerst een zoekpatroon + + + No search engine selected + Geen zoekmachine gekozen + + + You must select at least one search engine. + U moet tenminste een zoekmachine kiezen. + + + Results + Resultaten + + + Searching... + Zoeken... + + + Search plugin update -- qBittorrent + Zoeken plugin update -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Zoeken plugin kan bijgewerkt worden, wilt u het bijwerken? + +Changelog: + + + + &Yes + &Ja + + + &No + &Nee + + + Search plugin update + Zoekplugin update + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Sorry, update server is tijdelijk niet bereikbaar. + + + Your search plugin is already up to date. + Uw zoeken plugin is al bijgewerkt. + + + Cut + Knippen + + + Copy + Kopiëren + + + Paste + Plakken + + + Clear field + Veld wissen + + + Clear completion history + Wis aanvulgeschiedenis + + + Search Engine + Zoekmachine + + + Search has finished + Zoeken is klaar + + + An error occured during search... + Een fout trad op tijdens zoeken... + + + Search aborted + Zoeken afgebroken + + + Search returned no results + Zoeken gaf geen resultaten + + + Results + i.e: Search results + Resultaten + + + Search plugin download error + Zoeken plugin download fout + + + Couldn't download search plugin update at url: %1, reason: %2. + Kon zoeken plugin update niet downloaden met url: %1, reden: %2. + + + Unknown + Onbekend + + + + SearchTab + + Name + i.e: file name + Naam + + + Size + i.e: file size + Grootte + + + Seeders + i.e: Number of full sources + Uploaders + + + Leechers + i.e: Number of partial sources + Downloaders + + + Search engine + Zoekmachine + + + + TrackersAdditionDlg + + Trackers addition dialog + Trackers toevoegen dialoog + + + List of trackers to add (one per line): + Lijst van toe te voegen trackers (een per regel): + + + + Ui + + qBittorrent + qBittorrent + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Ik wil sourceforge.net graag bedanken voor het hosten van het qBittorrent project. + + + I would like to thank the following people who volonteered to translate qBittorrent: + Ik wil de volgende mensen graag bedanken die qBittorrent hebben vertaald: + + + Please contact me if you would like to translate qBittorrent to your own language. + Neem contact met me op als u qBittorrent naar uw eigen taal wilt vertalen. + + + I would like to thank the following people who volunteered to translate qBittorrent: + Ik wil de volgende mensen graag bedanken die qBittorrent hebben vertaald: + + + Preview impossible + Vooruitkijken onmogelijk + + + Sorry, we can't preview this file + Sorry, we kunnen dit bestand niet vooruit bekijken + + + Name + Naam + + + Size + Grootte + + + Progress + Voortgang + + + No URL entered + Geen URL ingevoerd + + + Please type at least one URL. + Typ op zijn minst 1 URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Neem contact met me op als u qBittorrent naar uw eigen taal wilt vertalen. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Ik wil de volgende mensen graag bedanken die qBittorrent hebben vertaald: + + + Please contact me if you would like to translate qBittorrent into your own language. + Neem contact met me op als u qBittorrent naar uw eigen taal wilt vertalen. + + + + addTorrentDialog + + Torrent addition dialog + Torrent toevoegen dialoog + + + Save path: + Opslag pad: + + + ... + ... + + + Torrent size: + Torrent grootte: + + + Unknown + Onbekend + + + Free disk space: + Vrije schijfruimte: + + + Torrent content: + Torrent inhoud: + + + Download in sequential order (slower but good for previewing) + Download in sequentiële volgorde (langzamer maar goed om voorbeeld weer te geven) + + + File name + Bestandsnaam + + + File size + Bestandsgrootte + + + Selected + Geselecteerd + + + Download in correct order (slower but good for previewing) + Download in juiste volgorde (langzamer maar goed voor vooruitblikken) + + + Add to download list in paused state + Aan download lijst toevoegen in pauze stand + + + Add + Toevoegen + + + Cancel + Annuleren + + + Unselect + Deselecteren + + + Select + Selecteren + + + Ignored + Genegeerd + + + Normal + Normaal + + + High + Hoog + + + Maximum + Maximum + + + Collapse all + Alles inklappen + + + Expand all + Alles uitklappen + + + + authentication + + Tracker authentication + Tracker authenticatie + + + Tracker: + Tracker: + + + Login + Login + + + Username: + Gebruikersnaam: + + + Password: + Wachtwoord: + + + Log in + Log in + + + Cancel + Annuleren + + + + bandwidth_dlg + + Bandwidth allocation + Bandbreedte instellen + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 heeft de maximum ingestelde verhouding bereikt. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' is permanent verwijderd. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' is verwijderd. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' gepauzeerd. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' hervat. + + + '%1' is not a valid magnet URI. + '%1' is geen juiste magnet URI. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' staat al in de downloadlijst. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' hervat. (snelle hervatting) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' toegevoegd aan de downloadlijst. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrentbestand kan niet worden gedecodeerd: '%1' + + + This file is either corrupted or this isn't a torrent. + Dit bestand is beschadigd of is geen torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>is geblokkeerd door de IP filter</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>is verbannen door onjuiste stukjes</i> + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Recursieve download van bestand %1 in torrent %2 + + + Unable to decode %1 torrent file. + Kon torrentbestand %1 niet decoderen. + + + Couldn't listen on any of the given ports. + Kan niet luisteren op de aangegeven poorten. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping fout, bericht: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping succesvol, bericht: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Snelle vervatting voor torrent %1 mislukt. Bezig opnieuw te controleren... + + + Url seed lookup failed for url: %1, message: %2 + Url seed raadpleging mislukt voor url: %1, bericht: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Bezig met downloaden van '%1', even geduld alstublieft... + + + + createTorrentDialog + + Create Torrent file + Torrent bestand maken + + + ... + ... + + + Create + Maken + + + Cancel + Annuleren + + + Directory + Map + + + Torrent Creation Tool + Hulpprogramma voor torrent maken + + + <center>Destination torrent file:</center> + <center>Torrent doelbestand:</center> + + + <center>Input file or directory:</center> + <center>Bron bestand of map:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Announce url:<br>(Een per regel)</center> + + + <center>Comment:</center> + <center>Opmerkingen:</center> + + + Torrent file creation + Torrentbestand maken + + + Input files or directories: + Bronbestanden of mappen: + + + Announce urls (trackers): + Announce urls (trackers): + + + Comment (optional): + Commentaar (optioneel): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privé (wordt niet verdeeld op trackerloze netwerken / DHT wanneer ingeschakeld) + + + Destination torrent file: + Bestemming torrentbestand: + + + Web seeds urls (optional): + Web seeds urls (optioneel): + + + File or folder to add to the torrent: + Bestand of map om toe te voegen aan de torrent: + + + Add a file + Bestand toevoegen + + + Add a folder + Map toevoegen + + + Add file + Voeg bestand toe + + + Add folder + Voeg map toe + + + Piece size: + Stukgrootte: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + Privé (wordt niet verdeeld op het DHT netwerk indien ingeschakeld) + + + Start seeding after creation + Begin met delen na creatie + + + Create and save... + Aanmaken en opslaan... + + + Progress: + Voortgang: + + + + createtorrent + + Select destination torrent file + Kies torrent doelbestand + + + Torrent Files + Torrent bestanden + + + Select input directory or file + Kies bron map of bestand + + + No destination path set + Geen doel pad gekozen + + + Please type a destination path first + Geef alstublieft eerst een doel pad + + + No input path set + Geen bron pad gekozen + + + Please type an input path first + Geef alstublieft eerst een doel pad + + + Input path does not exist + Bron pad bestaat niet + + + Please type a correct input path first + Geef alstublieft eerst een geldig bron pad + + + Torrent creation + Torrent maken + + + Torrent was created successfully: + Torrent was succesvol gemaakt: + + + Please type a valid input path first + Geef alstublieft eerst een geldig invoer pad + + + Select a folder to add to the torrent + Selecteer een map om toe te voegen aan de torrent + + + Select files to add to the torrent + Selecteer bestanden om toe te voegen aan de torrent + + + Please type an announce URL + Type een announce URL + + + Torrent creation was unsuccessful, reason: %1 + Fout tijdens het maken van torrent, reden: %1 + + + Announce URL: + Tracker URL + Announce URL: + + + Please type a web seed url + Type een web seed url + + + Web seed URL: + Web seed URL: + + + Select a file to add to the torrent + Selecteer een bestand om toe te voegen aan de torrent + + + No tracker path set + Geen tracker pad gekozen + + + Please set at least one tracker + Kies op zijn minst één tracker + + + Created torrent file is invalid. It won't be added to download list. + Gecreëerd torrent bestand is onjuist. Het wordt niet toegevoegd aan de downloadlijst. + + + + downloadFromURL + + Download Torrents from URLs + Download Torrents via URLs + + + Only one URL per line + 1 url per lijn + + + Download + Download + + + Cancel + Annuleren + + + Download from urls + Download uit urls + + + No URL entered + Geen URL ingevoerd + + + Please type at least one URL. + Typ op zijn minst één URL. + + + + downloading + + Search + Zoeken + + + Total DL Speed: + Totale DL snelheid: + + + KiB/s + KiB/s + + + Session ratio: + Sessie deelverhouding: + + + Total UP Speed: + Totale UP snelheid: + + + Log + Log + + + IP filter + IP filter + + + Start + Start + + + Pause + Pauze + + + Delete + Verwijderen + + + Clear + Wissen + + + Preview file + Kijk vooruit op bestand + + + Set upload limit + Uploadlimiet instellen + + + Set download limit + Downloadlimiet instellen + + + Delete Permanently + Permanent verwijderen + + + Torrent Properties + Torrent eigenschappen + + + Open destination folder + Open doel map + + + Name + Naam + + + Size + Grootte + + + Progress + Voortgang + + + DLSpeed + DLSnelheid + + + UpSpeed + UpSnelheid + + + Seeds/Leechs + Up-/Downloaders + + + Ratio + Verhouding + + + ETA + Geschatte resterende tijd + + + Buy it + Koop het + + + Priority + Prioriteit + + + Increase priority + Prioriteit verhogen + + + Decrease priority + Prioriteit verlagen + + + Force recheck + Forceer hercontrole + + + Copy magnet link + Kopieer magnet link + + + + engineSelect + + Search plugins + Zoekplugins + + + Installed search engines: + Geïnstalleerde zoekplugins: + + + Name + Naam + + + Url + Url + + + Enabled + Ingeschakeld + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + U kan hier nieuwe zoekplugins krijgen: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Installeer een nieuwe + + + Check for updates + Controleer op updates + + + Close + Sluiten + + + Enable + Inschakelen + + + Disable + Uitschakelen + + + Uninstall + Deïnstalleren + + + + engineSelectDlg + + True + Waar + + + False + Onwaar + + + Uninstall warning + Deïnstallatie waarschuwing + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Niet alle plugins konden worden gedeïnstalleerd omdat ze bij qBittorrent horen. +Alleen de door u toegevoegde plugins kunnen worden gedeïnstalleerd. +De plugins zijn uitgeschakeld. + + + Uninstall success + Deïnstallatie succesvol + + + All selected plugins were uninstalled successfuly + Alle gekozen plugins zijn succesvol gedeïnstalleerd + + + Select search plugins + Kies zoekplugins + + + qBittorrent search plugins + qBittorrent zoekplugins + + + Search plugin install + Zoekplugins installatie + + + Yes + Ja + + + No + Nee + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Een nieuwere versie van %1 zoekmachineplugin is al geïnstalleerd. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + %1 zoekmachineplugin is succesvol vernieuwd. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + %1 zoekmachineplugin is succesvol geïnstalleerd. + + + Search plugin update + Zoekplugin update + + + Sorry, update server is temporarily unavailable. + Sorry, updateserver is tijdelijk niet bereikbaar. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + %1 zoekplugin is succesvol vernieuwd. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Sorry, %1 zoekplugin update mislukt. + + + All your plugins are already up to date. + Uw plugins zijn al het nieuwst. + + + All selected plugins were uninstalled successfully + Alle gekozen plugins zijn succesvol gedeïnstalleerd + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 zoekmachineplugin kon niet worden vernieuwd. Oude versie wordt behouden. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 zoekmachineplugin kon niet worden geïnstalleerd. + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 zoekmachineplugin is succesvol vernieuwd. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 zoekmachineplugin is succesvol geïnstalleerd. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + %1 zoekplugin is succesvol vernieuwd. + + + Search engine plugin archive could not be read. + Zoekmachineplugin bestand kon niet worden gelezen. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + %1 zoekplugin installatie mislukt. + + + New search engine plugin URL + Nieuwe zoekmachineplugin URL + + + URL: + URL: + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + u + + + d + days + d + + + Unknown + Onbekend + + + h + hours + u + + + d + days + d + + + Unknown + Unknown (size) + Onbekend + + + < 1m + < 1 minute + < 1m + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1u%2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2u%3m + + + + options_imp + + Options saved successfully! + Opties succesvol opgeslagen! + + + Choose Scan Directory + Kies scanmap + + + Choose ipfilter.dat file + Kies ipfilter.dat bestand + + + Choose save Directory + Kies opslaan map + + + I/O Error + I/O Fout + + + Couldn't open: + Kon niet openen: + + + in read mode. + in lees stand. + + + Invalid Line + Ongeldige regel + + + Line + Regel + + + is malformed. + is onjuist geformuleerd. + + + Range Start IP + Reeks Begin IP + + + Start IP: + Begin IP: + + + Incorrect IP + Incorrect IP + + + This IP is incorrect. + Dit IP is incorrect. + + + Range End IP + Reeks Einde IP + + + End IP: + Einde IP: + + + IP Range Comment + IP Reeks Opmerkingen + + + Comment: + Opmerkingen: + + + to + <min port> to <max port> + naar + + + Choose your favourite preview program + Kies uw favoriete vooruitblik programma + + + Invalid IP + Ongeldig IP + + + This IP is invalid. + Dit IP is ongeldig. + + + Options were saved successfully. + Opties zijn succesvol opgeslagen. + + + Choose scan directory + Kies scanmap + + + Choose an ipfilter.dat file + Kies een ipfilter.dat bestand + + + Choose a save directory + Kies een opslagmap + + + I/O Error + Input/Output Error + I/O Fout + + + Couldn't open %1 in read mode. + Kon %1 niet openen om te lezen. + + + Choose an ip filter file + Kies een ip filter bestand + + + Filters + Filters + + + + pluginSourceDlg + + Plugin source + Pluginbron + + + Search plugin source: + Zoekpluginbron: + + + Local file + Lokaal bestand + + + Web link + Weblink + + + + preview + + Preview selection + Vooruitblik selectie + + + File preview + Bestand vooruitblik + + + The following files support previewing, <br>please select one of them: + De volgende bestanden ondersteunen vooruitkijken. +selecteer alstublieft een er van: + + + Preview + Vooruitblik + + + Cancel + Annuleren + + + + previewSelect + + Preview impossible + Vooruitkijken onmogelijk + + + Sorry, we can't preview this file + Sorry, we kunnen dit bestand niet vooruit bekijken + + + Name + Naam + + + Size + Grootte + + + Progress + Voortgang + + + + properties + + Torrent Properties + Torrent eigenschappen + + + OK + OK + + + Main Infos + Algemene informatie + + + Download state: + Download status: + + + Number of Peers: + Aantal peers: + + + Current Session + Huidige sessie + + + Total Uploaded: + Totaal geupload: + + + Total Downloaded: + Totaal gedownload: + + + Total Failed: + Totaal mislukt: + + + File Name + Bestandsnaam + + + Tracker + Tracker + + + Trackers: + Trackers: + + + Current Tracker: + Huidige tracker: + + + Errors: + Fouten: + + + Torrent Content + Torrent inhoud + + + Files contained in current torrent: + Bestanden in de huidige torrent: + + + Unselect + Deselecteer + + + Select + Selecteer + + + You can select here precisely which files you want to download in current torrent. + U kan hier precies selecteren welke bestanden uit de huidige torrent u wilt downloaden. + + + Size + Grootte + + + Selected + Geselecteerd + + + Finished + Klaar + + + Queued for checking + Wachtend voor controle + + + Checking files + Controleren van bestanden + + + Connecting to tracker + Verbinding maken met tracker + + + Downloading Metadata + Downloaden van metadata + + + Downloading + Downloaden + + + Seeding + Seeden + + + Allocating + Locatie toekennen + + + None - Unreachable? + Geen - Onbereikbaar? + + + Unknown + Onbekend + + + Complete: + Klaar: + + + Partial: + Gedeeltelijk: + + + False + Onwaar + + + True + Waar + + + Progress + Voortgang + + + Main infos + Hoofdinformatie + + + Number of peers: + Aantal peers: + + + Current tracker: + Huidige tracker: + + + Total uploaded: + Totaal geüpload: + + + Main info + Hoofdinformatie + + + Torrent information + Torrentinformatie + + + Total downloaded: + Totaal gedownload: + + + Total failed: + Totaal gefaald: + + + Torrent content + Torrent inhoud + + + Options + Instellingen + + + Download in correct order (slower but good for previewing) + Download in juiste volgorde (langzamer maar goed voor vooruitblikken) + + + Share Ratio: + Deel Ratio: + + + Seeders: + Uploaders: + + + Leechers: + Downloaders: + + + Save path: + Opslag pad: + + + Torrent infos + Torrent informatie + + + Creator: + Maker: + + + Torrent hash: + Torrent hash: + + + Comment: + Opmerkingen: + + + Current session + Huidige sessie + + + Share ratio: + Deelratio: + + + Trackers + Trackers + + + New tracker + Nieuwe tracker + + + New tracker url: + Nieuwe tracker url: + + + Priorities: + Prioriteiten: + + + Normal: normal priority. Download order is dependent on availability + Normaal: normale prioriteit. Downloadvolgorde is afhankelijk van beschikbaarheid + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Hoog: hoger dan normale prioriteit. Stukken worden geprefereerd over stukken met dezelfde beschikbaarheid maar niet over stukken met lagere beschikbaarheid + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximum: maximale prioriteit, beschikbaarheid doet er niet toe, het stuk wordt geprefereerd over elk ander stuk met lagere prioriteit + + + File name + Bestandsnaam + + + Priority + Prioriteit + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Trackerlijst kan niet leeg zijn. + + + Ignored: file is not downloaded at all + Genegeerd: bestand wordt niet gedownload + + + Ignored + Genegeerd + + + Normal + Normaal + + + Maximum + Maximum + + + High + Hoog + + + Url seeds + Url seeds + + + New url seed: + Nieuwe url seed: + + + This url seed is already in the list. + Deze url seed staat al in de lijst. + + + None + i.e: No error message + Geen + + + New url seed + New HTTP source + Nieuwe url seed + + + The following url seeds are available for this torrent: + De volgende url seeds zijn beschikbaar voor deze torrent: + + + Priorities error + Prioriteitsfout + + + Error, you can't filter all the files in a torrent. + Fout: je kan niet alle bestanden filteren in een torrent. + + + Downloaded pieces + Gedownloade stukjes + + + Collapse all + Alles inklappen + + + Expand all + Alles uitklappen + + + ... + ... + + + Choose save path + Kies opslagpad + + + Save path creation error + Opslagpad aanmaakfout + + + Could not create the save path + Kon het opslagpad niet aanmaken + + + + search_engine + + Search + Zoeken + + + Search Engines + Zoekmachines + + + Search Pattern: + Zoekpatroon: + + + Stop + Stop + + + Status: + Status: + + + Stopped + Gestopt + + + Results: + Resultaten: + + + Download + Download + + + Clear + Wissen + + + Update search plugin + Zoeken plugin bijwerken + + + Search engines... + Zoekmachines... + + + + seeding + + Search + Zoeken + + + The following torrents are finished and shared: + De volgende torrents zijn klaar en worden gedeeld: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Let op:</u> Het is belangrijk om het netwerk in stand te houden door uw torrents te blijven delen nadat ze klaar zijn. + + + Start + Start + + + Pause + Pauze + + + Delete + Verwijderen + + + Delete Permanently + Permanent verwijderen + + + Torrent Properties + Torrent eigenschappen + + + Preview file + Kijk vooruit op bestand + + + Set upload limit + Uploadlimiet instellen + + + Open destination folder + Open doel map + + + Name + Naam + + + Size + Grootte + + + Upload Speed + Upload Snelheid + + + Connected peers + Verbonden peers + + + Seeds / Leechers + Seeds / Leechers + + + Copy magnet link + Kopieer magnet link + + + Leechers + Downloaders + + + Ratio + Verhouding + + + Buy it + Koop het + + + Total uploaded + Totaal geüpload + + + Priority + Prioriteit + + + Increase priority + Prioriteit verhogen + + + Decrease priority + Prioriteit verlagen + + + Force recheck + Forceer hercontrole + + + + subDownloadThread + + Host is unreachable + Host is onbereikbaar + + + File was not found (404) + Bestand niet gevonden (404) + + + Connection was denied + Verbinding niet toegestaan + + + Url is invalid + Url is ongeldig + + + I/O Error + I/O Fout + + + Connection forbidden (403) + Verbinding verboden (403) + + + Connection was not authorized (401) + Verbinding niet geauthoriseerd (401) + + + Content has moved (301) + Inhoud is verplaatst (301) + + + Connection failure + Verbindingsfout + + + Connection was timed out + Verbinding verlopen + + + Incorrect network interface + Verkeerde netwerkinterface + + + Unknown error + Onbekende fout + + + Could not resolve proxy + Kon proxy niet herleiden + + + + torrentAdditionDialog + + True + Waar + + + Unable to decode torrent file: + Torrentfile kan niet gedecodeerd worden: + + + This file is either corrupted or this isn't a torrent. + Dit bestand is corrupt of is geen torrent. + + + Choose save path + Kies opslag pad + + + False + Onwaar + + + Unknown + Onbekend + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 extra is nodig om te downloaden) + + + Empty save path + Leeg opslag pad + + + Please enter a save path + Geef alstublieft een opslag pad + + + Save path creation error + Opslag pad aanmaak fout + + + Could not create the save path + Kon het opslag pad niet aanmaken + + + Invalid file selection + Ongeldige bestand selectie + + + You must select at least one file in the torrent + U moet tenminste een bestand in de torrent selecteren + + + File name + Bestandsnaam + + + Size + Grootte + + + Progress + Voortgang + + + Priority + Prioriteit + + + diff --git a/src/lang/qbittorrent_pl.qm b/src/lang/qbittorrent_pl.qm new file mode 100644 index 0000000000000000000000000000000000000000..02b7abb8a028390279180de43e922a7c0657776c GIT binary patch literal 49880 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_pl.ts b/src/lang/qbittorrent_pl.ts new file mode 100644 index 000000000..9df7aeeec --- /dev/null +++ b/src/lang/qbittorrent_pl.ts @@ -0,0 +1,4939 @@ + + + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + About qBittorrent + O qBittorrent + + + About + O programie + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + Author + Autor + + + Name: + Nazwa: + + + Country: + Kraj: + + + E-mail: + E-mail: + + + Home page: + Strona domowa: + + + Christophe Dumez + Christophe Dumez + + + France + Francja + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Podziękowania dla + + + Translation + Lokalizacja + + + License + Licencja + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Klient sieci bittorrent, wykorzystuje biblioteki Qt4 i libtorrent, implementacja w C++.<br>(new line)<br>(new line) +Wszystkie prawa zastrżeżone © 2006 Christophe Dumez<br>(new line) +<br> <u>Strona domowa:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + Autor qBittorrent + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + Urodzony: + + + Occupation: + Zawód: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Student informatyki + + + Thanks to + Podziękowania dla + + + + BandwidthAllocationDialog + + Upload limit: + Limit wysyłania: + + + Download limit: + Limit pobierania: + + + Unlimited + Unlimited (bandwidth) + Bez limitu (przepustowość łącza) + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent konsola + + + General + Główne + + + Blocked IPs + Zablokowane IP + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opcje -- qBittorrent + + + Options + Opcje + + + Main + Główne + + + Save Path: + Katalog docelowy: + + + Download Limit: + Limit pobierania: + + + Upload Limit: + Limit wysyłania: + + + Max Connects: + Maksymalnie połączeń: + + + Port range: + Zakres portu: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Wyłączony + + + connections + połączeń + + + to + do + + + Proxy + Proxy + + + Proxy Settings + Ustawienia Proxy + + + Server IP: + IP serwera: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Port: + + + Proxy server requires authentication + Serwer proxy wymaga autentykacji + + + Authentication + Autentykacja + + + User Name: + Użytkownik: + + + Password: + Hasło: + + + Enable connection through a proxy server + Włącz połączenie przez serwer proxy + + + Language + Język + + + Please choose your preferred language in the following list: + Proszę wybrać preferowany język z listy: + + + Language settings will take effect after restart. + Język zostanie zmieniony przy ponownym uruchomieniu aplikacji. + + + English + Angielski + + + French + Francuski + + + Simplified Chinese + Uproszczony Chiński + + + OK + OK + + + Cancel + Anuluj + + + Scanned Dir: + Przeszukany katalog: + + + Enable directory scan (auto add torrent files inside) + Włącz aktualizację katalogu (automatyczne dodawanie plików torrent) + + + Korean + Korean + + + Spanish + Hiszpański + + + German + Niemiecki + + + Connection Settings + Ustawienia połączenia + + + Share ratio: + Współczynnik udostępniania: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Włącz filtrowanie IP + + + Filter Settings + Ustawienia filtru + + + ipfilter.dat URL or PATH: + ipfilter.dat URL lub ścieżka: + + + Start IP + Początkowe IP + + + End IP + Końcowe IP + + + Origin + Pochodzenie + + + Comment + Komentarz + + + Apply + Zastosuj + + + IP Filter + Filtr IP + + + Add Range + Dodaj zakres + + + Remove Range + Usuń zakres + + + Catalan + Catalan + + + ipfilter.dat Path: + ipfilter.dat ścieżka: + + + Clear finished downloads on exit + Usuń z listy zakończone torrenty przy wychodzeniu + + + Ask for confirmation on exit + Potwierdzenie wyjścia z programu + + + Go to systray when minimizing window + Minimalizuj okno do tray-a + + + Misc + Różne + + + Localization + Lokalizacja + + + Language: + Język: + + + Behaviour + Zachowanie + + + OSD + OSD + + + Always display OSD + Zawsze wyświetlaj OSD + + + Display OSD only if window is minimized or iconified + Wyświetlaj OSD tylko jeżeli okno jest zminimalizowane + + + Never display OSD + Nigdy nie wyświetlaj OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + DHT (Trackerless): + + + Disable DHT (Trackerless) support + Wyłącz obsługę DHT (trackerless) + + + Automatically clear finished downloads + Automatycznie usuń zakończone + + + Preview program + Otwórz za pomocą + + + Audio/Video player: + Odtwarzacz multimedialny: + + + DHT configuration + Konfiguracja DHT + + + DHT port: + Port DHT: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Uwaga:</b> Zmiany zostaną zastosowane przy następnym uruchomieniu aplikacji. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Informacja dla tłumaczy:</b> Jeżeli qBittorent nie jest dostępny w Twoim języku, <br/> a jesteś zainteresowany tłumaczeniem, <br/> skontaktuj się ze mną (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Wyświetl dodatkowe informacje podczas dodawania nowego pliku torrent + + + Default save path + Domyślny katalog zapisu + + + Systray Messages + Wiadomości w pasku zadań + + + Always display systray messages + Zawsze wyświetlaj wiadomości w pasku zadań + + + Display systray messages only when window is hidden + Wyświetlaj wiadomości w pasku zadań gdy okno aplikacji jest zminimalizowane + + + Never display systray messages + Nigdy nie wyświetlaj wiadomości w pasku zadań + + + Disable DHT (Trackerless) + Wyłącz DHT (Trackerless) + + + Disable Peer eXchange (PeX) + Wyłącz Peer eXchange (PeX) + + + Go to systray when closing main window + Minimalizuj do paska systemowego przy zamykaniu okna aplikacji + + + Connection + Połączenie + + + Peer eXchange (PeX) + Wymiana Peerów (PeX) + + + DHT (trackerless) + DHT (beztrackerowy) + + + Torrent addition + Dołączony torrent + + + Main window + Główne okno + + + Systray messages + Wiadomości w tacce systemowej + + + Directory scan + Skan katalogu + + + Style (Look 'n Feel) + Styl (Look 'n Feel) + + + Plastique style (KDE like) + Styl Plastique (jak KDE) + + + Cleanlooks style (GNOME like) + Styl Cleanlooks (jak GNOME) + + + Motif style (default Qt style on Unix systems) + Styl Motif (domyślny Qt w systemach Unix) + + + CDE style (Common Desktop Environment like) + Styl CDE (jak Common Desktop Environment) + + + MacOS style (MacOSX only) + Styl MacOS (tylko MacOSX) + + + Exit confirmation when the download list is not empty + Potwierdź wyjście gdy lista pobierania nie jest pusta + + + Disable systray integration + Wyłącz integrację z tacką systemową + + + WindowsXP style (Windows XP only) + Styl WindowsXP (tylko Windows XP) + + + Server IP or url: + IP serwera lub url: + + + Proxy type: + Typ Proxy: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Wymuszone połączenia + + + Use proxy for connections to trackers + Użyj proxy do połączenia z trackerami + + + Use proxy for connections to regular peers + Użyj proxy do połączenia z peerami + + + Use proxy for connections to web seeds + Użyj proxy do połączenia z seedami web + + + Use proxy for DHT messages + Użyj proxy do wiadomości DHT + + + Encryption + Szyfrowanie + + + Encryption state: + Stan szyfrowania: + + + Enabled + Włączone + + + Forced + Wymuszone + + + Disabled + Wyłączone + + + Preferences + Preferencje + + + General + Główne + + + User interface settings + Ustawienia interfejsu użytkownika + + + Visual style: + Styl wizualny: + + + Cleanlooks style (Gnome like) + Styl Cleanlooks (jak Gnome) + + + Motif style (Unix like) + Styl Motif (jak Unix) + + + Ask for confirmation on exit when download list is not empty + Pytaj o potwierdzenie wyjścia jeśli lista pobierania nie jest pusta + + + Display current speed in title bar + Pokaż aktualną prędkość na pasku tytułu + + + System tray icon + Ikona w trayu + + + Disable system tray icon + Wyłącz ikonę w trayu + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Zamknij do traya + + + Minimize to tray + Minimalizuj do traya + + + Show notification balloons in tray + Pokaż balony powiadomień w trayu + + + Media player: + Odtwarzacz mediów: + + + Downloads + Pobierania + + + Put downloads in this folder: + Umieść pobierania w tym folderze: + + + Pre-allocate all files + Rezerwuj miejsce na dysku + + + When adding a torrent + Gdy dodajesz torrent + + + Display torrent content and some options + Pokaż zawartość torrenta i kilka opcji + + + Do not start download automatically + The torrent will be added to download list in pause state + Nie uruchamiaj automatycznie pobierań + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Folder obserwacji + + + UI + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + Download list: + + + + Start/Stop + + + + Open folder + + + + Show properties + + + + Seeding list: + + + + Download folder: + + + + Temp folder: + + + + Automatically download torrents present in this folder: + Automatycznie pobierz torrenty umieszczone w tym folderze: + + + Listening port + Port nasłuchu + + + to + i.e: 1200 to 1300 + do + + + Enable UPnP port mapping + Włącz mapowanie portu UPnP + + + Enable NAT-PMP port mapping + Włącz mapowanie portu NAT-PMP + + + Global bandwidth limiting + Globalne ograniczenie przepustowości łącza + + + Upload: + Wysyłanie: + + + Download: + Pobieranie: + + + Bittorrent features + + + + Use the same port for DHT and Bittorrent + + + + Spoof µtorrent to avoid ban (requires restart) + + + + Type: + Typ: + + + (None) + (Nic) + + + Proxy: + Proxy: + + + Username: + Nazwa użytkownika: + + + Bittorrent + Bittorrent + + + Connections limit + Limit połączeń + + + Global maximum number of connections: + Maksymalna ilość połączeń: + + + Maximum number of connections per torrent: + Maksymalna ilość połączeń na torrent: + + + Maximum number of upload slots per torrent: + Maksymalna ilość slotów wysyłania na torrent: + + + Additional Bittorrent features + Dodatkowe cechy Bittorrenta + + + Enable DHT network (decentralized) + Włącz sieć DHT (rozproszona) + + + Enable Peer eXchange (PeX) + Włącz Peer eXchange (PeX) + + + Enable Local Peer Discovery + Włącz Local Peer Discovery + + + Encryption: + Szyfrowanie: + + + Share ratio settings + Ustawienia wskaźnika Share ratio + + + Desired ratio: + Pożądane ratio: + + + Filter file path: + Filtr ścieżki pliku: + + + transfer lists refresh interval: + okres odświeżania listy transferu: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Okres odświeżania nagłówków RSS: + + + minutes + minut + + + Maximum number of articles per feed: + Maksymalna ilość wiadomości w nagłówku: + + + File system + System pliku + + + Remove finished torrents when their ratio reaches: + Usuń zakończone torrenty gdy ratio osiągnie: + + + System default + Domyślne systemu + + + Start minimized + Uruchom zminimalizowany + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Podwójne kliknięcie na liście transferu + + + In download list: + Na liście pobierania: + + + Pause/Start torrent + Pauza/Uruchom torrent + + + Open destination folder + Otwórz folder pobierań + + + Display torrent properties + Wyświetl właściwości torrenta + + + In seeding list: + Na liście udostępniania: + + + Folder scan interval: + Okres skanu foldera: + + + seconds + sekund + + + Spoof Azureus to avoid ban (requires restart) + Podrabianie Azureusa pozwala ominąć blokadę (wymagany restart) + + + Web UI + Web UI + + + Port used for incoming connections: + + + + Random + + + + Enable Web User Interface + Włącz interfejs Web + + + HTTP Server + Serwer HTTP + + + Enable RSS support + Włącz obsługę RSS + + + RSS settings + Ustawienia RSS + + + Enable queueing system + Włącz kolejkowanie + + + Maximum active downloads: + Maksymalna ilość aktywnych pobierań: + + + Torrent queueing + Kolejkowanie torrentów + + + Maximum active torrents: + Maksymalna ilość aktywnych torrentów: + + + Display top toolbar + Pokaż górny pasek narzędzi + + + Search engine proxy settings + + + + Bittorrent proxy settings + + + + Maximum active uploads: + + + + + DownloadingTorrents + + Name + i.e: file name + Nazwa + + + Size + i.e: file size + Rozmiar + + + Progress + i.e: % downloaded + Postęp + + + DL Speed + i.e: Download speed + Prędkość DL + + + UP Speed + i.e: Upload speed + Prędkość UP + + + Seeds/Leechers + i.e: full/partial sources + + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Ratio + Ratio + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 uruchomiony. + + + Be careful, sharing copyrighted material without permission is against the law. + Bądź ostrożny, wymiana plików chronionych prawami autorskimi jest niezgodna z prawem. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <kolor czcionki='red'>%1</czcionka> <i>był zablokowany</i> + + + Fast resume data was rejected for torrent %1, checking again... + Szybkie wznowienie danych zostało odrzucone przez torrent %1, sprawdzam ponownie... + + + Url seed lookup failed for url: %1, message: %2 + Błąd wyszukiwania url seeda dla url:%1, wiadomość: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' dodany do listy pobierania. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wznowiony. (szybkie wznawianie) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' jest już na liście pobierania. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Problem z odczytem pliku torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Plik jest uszkodzony lub nie jest plikiem torrent. + + + Couldn't listen on any of the given ports. + Nie można nasłuchiwać na żadnym z podanych portów. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Pobieranie '%1', proszę czekać... + + + Hide or Show Column + Pokaż lub ukryj kolumny + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Błąd mapowania portu, wiadomość %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Udane mapowanie portu, wiadomość %1 + + + Priority + Priorytet + + + + FeedDownloader + + RSS Feed downloader + + + + RSS feed: + + + + Feed name + + + + Automatically download torrents from this feed + + + + Download filters + + + + Filters: + + + + Filter settings + + + + Matches: + + + + Does not match: + + + + Destination folder: + + + + ... + ... + + + Filter testing + + + + Torrent title: + + + + Result: + + + + Test + + + + Import... + + + + Export... + + + + Rename filter + + + + Remove filter + + + + Add filter + + + + + FeedDownloaderDlg + + New filter + + + + Please choose a name for this filter + + + + Filter name: + + + + Invalid filter name + + + + The filter name cannot be left empty. + + + + This filter name is already in use. + + + + Filter testing error + + + + Please specify a test torrent name. + + + + matches + + + + does not match + + + + Select file to import + + + + Filters Files + + + + Import successful + + + + Filters import was successful. + + + + Import failure + + + + Filters could not be imported due to an I/O error. + + + + Select destination file + + + + Overwriting confirmation + + + + Are you sure you want to overwrite existing file? + + + + Export successful + + + + Filters export was successful. + + + + Export failure + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + Unread + + + + + FilterParserThread + + I/O Error + Input/Output Error + Błąd We/Wy + + + Couldn't open %1 in read mode. + Nie można otworzyć %1 w trybie odczytu. + + + %1 is not a valid PeerGuardian P2B file. + %1 nie jest poprawnym plikiem PeerGuardian. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Zakończono + + + Name + i.e: file name + Nazwa + + + Size + i.e: file size + Rozmiar + + + Seeds / Leechers + + + + Connected peers + + + + Progress + i.e: % downloaded + Postęp + + + DL Speed + i.e: Download speed + Prędkość DL + + + UP Speed + i.e: Upload speed + Prędkość UP + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Status + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Zakończono + + + None + i.e: No error message + Brak + + + Ratio + Ratio + + + Leechers + i.e: full/partial sources + Leechers + + + Total uploaded + i.e: Total amount of uploaded data + + + + Hide or Show Column + Ukryj lub pokaż kolumny + + + Incomplete torrent in seeding list + Niekompletny torrent na liście udostępniania + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Wydaje się, że stan '%1' torrenta zmienił się z udostępniającego na pobierający. Czy chcesz przesunąć go na listę pobierania? (w innym przypadku torrent zostanie usunięty) + + + Priority + Priorytet + + + + GUI + + started. + uruchomiony. + + + DL Speed: + Prędkość DL: + + + kb/s + kb/s + + + UP Speed: + Prędkość UP: + + + Open Torrent Files + Otwórz pliki Torrent + + + Torrent Files + Pliki Torrent + + + Couldn't create the directory: + Nie można zalożyć katalogu: + + + already in download list. + <file> already in download list. + jest już na liście pobierania. + + + kb/s + kb/s + + + Unknown + Nieznany + + + added to download list. + dodany do listy pobierania. + + + resumed. (fast resume) + wznowiony. (szybkie wznawianie) + + + Unable to decode torrent file: + Problem z odkodowaniem pliku torrent: + + + This file is either corrupted or this isn't a torrent. + Plik jest uszkodzony lub nie jest plikiem torrent. + + + Are you sure you want to delete all files in download list? + Czy chcesz usunać wszystkie pliki z listy pobierania? + + + &Yes + &Tak + + + &No + &Nie + + + Download list cleared. + List pobierania wyczyszczona. + + + Are you sure you want to delete the selected item(s) in download list? + Czy chcesz usunąć wybrane elementy z listy pobierania? + + + removed. + <file> removed. + usunięty. + + + Listening on port: + Nasłuchuje na porcie: + + + paused + wstrzymany + + + All Downloads Paused. + Wszystkie Pobierania Wsztrzymane. + + + started + uruchomiony + + + All Downloads Resumed. + Wszystkie Pobierania Wzniowione. + + + paused. + <file> paused. + wstrzymany. + + + resumed. + <file> resumed. + wznowiony. + + + Finished + Ukończone + + + Checking... + Sprawdzanie.... + + + Connecting... + Łączenie... + + + Downloading... + Ściąganie... + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Jesteś pewny? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Prędkość DL: + + + :: By Christophe Dumez :: Copyright (c) 2006 + :: Christophe Dumez :: Wszelkie Prawa Zastrżeżone (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Status Połączenia:</b><br>Połączony + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Status Połączenia:</b><br>Zablokowane?<br><i>Brak połączeń przychodzących...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Status Połączenia:</b><br>Rozłączony<br><i>Nie znaleziono peer-ów...</i> + + + /s + <unit>/seconds + /s + + + has finished downloading. + zakończył sciąganie. + + + Couldn't listen on any of the given ports. + Nie można nasłuchiwać na żadnym z podanych portów. + + + None + Brak + + + Empty search pattern + Pusty wzorzec wyszukiwania + + + Please type a search pattern first + Proszę podać wzorzec wyszukiwania + + + No seach engine selected + Nie wybrano wyszukiwarki + + + You must select at least one search engine. + Musisz wybrać przynajmniej jedną wyszukiwarkę. + + + Searching... + Wyszukiwanie... + + + Could not create search plugin. + Nie można utworzyć wtyczki wyszukiwarki. + + + Stopped + Zatrzymany + + + I/O Error + Błąd We/Wy + + + Couldn't create temporary file on hard drive. + Nie można utworzyć pliku tymczasowego na dysku. + + + Torrent file URL + Adres pliku torrent + + + Downloading using HTTP: + Pobieranie (HTTP): + + + Torrent file URL: + Adres pliku torrent: + + + Are you sure you want to quit? -- qBittorrent + Czy chcesz wyjść z programu? -- qBittorent + + + Are you sure you want to quit qbittorrent? + Czy chcesz wyjść z programu? + + + Timed out + Limit czasu odpowiedzi + + + Error during search... + Błąd podczas wyszukiwania... + + + Failed to download: + Błąd pobierania: + + + A http download failed, reason: + Błąd pobierania, powód: + + + KiB/s + KiB/s + + + KiB/s + (sp)KiB/s + + + A http download failed, reason: + Błąd pobierania HTTP, powód: + + + Stalled + Zablokowany + + + Search is finished + Wyszukiwanie zakończone + + + An error occured during search... + Wystąpił błąd podczas wyszukiwania... + + + Search aborted + Wyszukiwanie przerwane + + + Search returned no results + Nic nie znaleziono + + + Search is Finished + Wyszukiwanie jest zakończone + + + Search plugin update -- qBittorrent + Aktualizacja wtyczki wyszukującej -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Dostępna jest nowa wersja wtyczki wyszukiwania, czy chcesz zaktualizować? Zmiany: + + + Sorry, update server is temporarily unavailable. + Przepraszamy, serwer aktualizacji jest tymczasowo niedostepny. + + + Your search plugin is already up to date. + Posiadasz najnowszą wersję wtyczki wyszukiwania. + + + Results + Wyniki + + + Name + Nazwa + + + Size + Rozmiar + + + Progress + Postęp + + + DL Speed + Prędkość DL + + + UP Speed + Prędkość UP + + + Status + Status + + + ETA + ETA + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Wyszukiwarka + + + Stalled + state of a torrent whose DL Speed is 0 + Zablokowany + + + Paused + Zatrzymany + + + Preview process already running + Podgląd jest już uruchomiony + + + There is already another preview process running. +Please close the other one first. + Podgląd jest już uruchomiony. +Zamknij najpierw okno podglądu. + + + Couldn't download + Couldn't download <file> + Nie można pobrać + + + reason: + Reason why the download failed + powód: + + + Downloading + Example: Downloading www.example.com/test.torrent + Pobieranie + + + Please wait... + Proszę czekać... + + + Transfers + Prędkość + + + Are you sure you want to quit qBittorrent? + Czy na pewno chcesz zakończyć aplikację qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Czy na pewno chcesz usunąć wybrany element z listy i z dysku? + + + Download finished + Pobieranie zakończone + + + has finished downloading. + <filename> has finished downloading. + zakończył sciąganie. + + + Search Engine + Wyszukiwarka + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorent %1 + + + Connection status: + Status połączenia: + + + Offline + Niepołączony + + + No peers found... + Nie znaleziono peerów... + + + Name + i.e: file name + Nazwa + + + Size + i.e: file size + Rozmiar + + + Progress + i.e: % downloaded + Postęp + + + DL Speed + i.e: Download speed + Prędkość DL + + + UP Speed + i.e: Upload speed + Prędkość UP + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 uruchomiony. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Prędkość DL: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Prędkość UP: %1 KiB/ + + + Finished + i.e: Torrent has finished downloading + Zakończono + + + Checking... + i.e: Checking already downloaded parts... + Sprawdzanie.... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Zablokowany + + + Are you sure you want to quit? + Czy na pewno chcesz zakończyć aplikację? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' został usunięty. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' dodany do listy pobierania. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wznowiony. (szybkie wznawianie) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' jest już na liście pobierania. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Problem z odczytem pliku torrent: '%1' + + + None + i.e: No error message + Brak + + + Listening on port: %1 + e.g: Listening on port: 1666 + Nasłuchuje na porcie: %1 + + + All downloads were paused. + Wszystkie zadania pobierania wstrzymane. + + + '%1' paused. + xxx.avi paused. + '%1' wstrzymany. + + + Connecting... + i.e: Connecting to the tracker... + Łączenie... + + + All downloads were resumed. + Wszystkie zadania pobierania wzniowione. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' wznowiony. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 został pobrany. + + + I/O Error + i.e: Input/Output Error + Błąd We/Wy + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Wystąpił błąd podczas próby odczytu lub zapisu %1. Prawdopodobnie brak miejsca na dysku, zadania pobierania zostały wstrzymane + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Wystąpił błąd (brak miejsca?), '%1' wstrzymany. + + + Connection Status: + Status połączenia: + + + Online + Połączony + + + Firewalled? + i.e: Behind a firewall/router? + Zablokowany? + + + No incoming connections... + Brak połączeń przychodzących... + + + No search engine selected + Nie wybrano wyszukiwarki + + + Search plugin update + Aktualizacja wtyczki wyszukiwania + + + Search has finished + Wyszukiwanie zakończone + + + Results + i.e: Search results + Wyniki + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Pobieranie '%1', proszę czekać... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Wystąpił błąd (brak miejsca?), '%1' wstrzymany. + + + Search + Szukaj + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent jest podłączony do portu: %1 + + + DHT support [ON], port: %1 + Wsparcie DHT [WŁ], port: %1 + + + DHT support [OFF] + Wsparcie DHT [WYŁ] + + + PeX support [ON] + Wsparcie PeX [WŁ] + + + PeX support [OFF] + Wsparcie pEx [WYŁ] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Lista pobierania nie jest pusta. +Czy napewno zamknąć qBittorrent? + + + Downloads + Pobieranie + + + Are you sure you want to delete the selected item(s) in finished list and in hard drive? + Czy napewno usunąć wybrane pozycje z listy zakończonych z twardego dysku? + + + Are you sure you want to delete the selected item(s) in finished list? + Czy napewno usunąć wybrane pozycje z listy zakończonych? + + + UPnP support [ON] + Wsparcie UPnP [WŁ] + + + Be careful, sharing copyrighted material without permission is against the law. + Bądź ostrożny, wymiana plików chronionych prawami autorskimi jest niezgodna z prawem. + + + Encryption support [ON] + Wsparcie szyfrowania [WŁ] + + + Encryption support [FORCED] + Wsparcie szyfrowania [WYMUSZONE] + + + Encryption support [OFF] + Wsparcie szyfrowania [WYŁ] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <kolor czcionki='red'>%1</czcionka> <i>był zablokowany</i> + + + Ratio + Ratio + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Błąd pobierania URL + + + Couldn't download file at url: %1, reason: %2. + Nie można pobrać pliku z url: %1, powód: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Szybkie wznowienie danych zostało odrzucone przez torrent %1, sprawdzam ponownie... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Czy chcesz usunąć wybrane elementy z listy pobierania i z twardego dysku? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Czy chcesz usunąć wybrane elementy z listy ukończonych i z twardego dysku? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' został całkowicie usunięty. + + + Url seed lookup failed for url: %1, message: %2 + Błąd wyszukiwania url seeda dla url:%1, wiadomość: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + UPnP support [OFF] + Obsługa UPnP [WYŁ] + + + NAT-PMP support [ON] + Obsługa NAT-PMP [WŁ] + + + NAT-PMP support [OFF] + Obsługa NAT-PMP [WYŁ] + + + DHT support [ON], port: UDP/%1 + + + + Local Peer Discovery [ON] + Local Peer Discovery [WŁ] + + + Local Peer Discovery support [OFF] + Obsługa Local Peer Discovery [WYŁ] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' został usunięty ponieważ ratio osiągnęło ustawioną wartość. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + DL: %1 KiB/s + DL: %1 KiB/s + + + UP: %1 KiB/s + UP: %1 KiB/s + + + Ratio: %1 + Ratio: %1 + + + DHT: %1 nodes + DHT: %1 węzły + + + No direct connections. This may indicate network configuration problems. + Brak bezposrednich połączeń. Może to oznaczać problem z konfiguracją sieci. + + + Uploads + Wysyłane + + + Options were saved successfully. + Ustawienia zapisane. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Całkowita prędkość DL: + + + Kb/s + Kb/s + + + Total UP Speed: + Całkowita prędkość UP: + + + Name + Nazwa + + + Size + Rozmiar + + + % DL + % DL + + + DL Speed + Prędkość DL + + + UP Speed + Prędkość UP + + + Status + Status + + + ETA + ETA + + + &Options + &Opcje + + + &Edit + &Edycja + + + &File + &Plik + + + &Help + &Pomoc + + + Open + Otwórz + + + Exit + Zakończ + + + Preferences + Preferencje + + + About + O programie + + + Start + Start + + + Pause + Wstrzymaj + + + Delete + Skasuj + + + Pause All + Wstrzymaj wszystko + + + Start All + Rozpocznij wszystko + + + Documentation + Dokumentacja + + + Connexion Status + Status połączenia + + + Delete All + Skasuj wszystko + + + Torrent Properties + Właściwości Torrenta + + + Connection Status + Status połączenia + + + Downloads + Ściąganie...Pobieranie + + + Search + Szukaj + + + Search Pattern: + Wzorzec wyszukiwania: + + + Status: + Status: + + + Stopped + Zatrzymany + + + Search Engines + Wyszukiwarki + + + Results: + Rezultat: + + + Stop + Stop + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Wyszukiwarka + + + Download from URL + Pobierz z adresu URL + + + Download + Pobierz + + + Clear + Wyczyść + + + KiB/s + KiB/s + + + Create torrent + Utwórz torrenta + + + Ratio: + Ratio: + + + Update search plugin + Aktualizacja wtyczki wyszukiwania + + + Session ratio: + Ratio sesji: + + + Transfers + Prędkość + + + Preview file + Podgląd pliku + + + Clear log + Wyczyść logi + + + Delete Permanently + Usuń całkowicie + + + Visit website + Odwiedź stronę + + + Report a bug + Zgłoś błąd + + + Set upload limit + Ustaw limit wysyłania + + + Set download limit + Ustaw limit pobierania + + + Log + Log + + + IP filter + Filtr IP + + + Set global download limit + Ustaw ogólny limit pobierania + + + Set global upload limit + Ustaw ogólny limit wysyłania + + + Options + Opcje + + + Decrease priority + Zmniejsz priorytet + + + Increase priority + Zwiększ priorytet + + + Console + Konsola + + + + PropListDelegate + + False + Nie + + + True + Tak + + + Ignored + Ignorowany + + + Normal + Normal (priority) + Normalny + + + High + High (priority) + Wysoki + + + Maximum + Maximum (priority) + Maksymalny + + + + QTextEdit + + Clear + Wyczyść + + + + RSS + + Search + Szukaj + + + New subscription + + + + Mark items read + + + + Update all + + + + Feed URL + + + + Update + + + + New folder + + + + RSS feeds + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + Bullet + + + + Article title + + + + Update all feeds + + + + Delete + Skasuj + + + Rename + Zmień nazwę + + + Refresh + Odśwież + + + Download torrent + + + + Open news URL + + + + Copy feed URL + + + + RSS feed downloader + + + + Create + Utwórz + + + Delete selected streams + Usuń wybrane strumienie + + + Refresh RSS streams + Odśwież strumień RSS + + + Add a new RSS stream + Dodaj nowy strumień RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>News:</b> <i>(kliknij dwa razy aby otworzyć link w przeglądarce)</i> + + + Add RSS stream + Dodaj strumień RSS + + + Refresh all streams + Odśwież wszystkie strumienie + + + RSS streams: + Strumienie RSS: + + + 2 + 2 + + + Mark all as read + Zaznacz wszystko do odczytu + + + + RSSImp + + Please type a rss stream url + Sprecyzuj typ url strumienia rss + + + Stream URL: + Strumień URL: + + + Please choose a new name for this stream + Wybierz nową nazwę dla tego strumienia + + + New stream name: + Nowa nazwa strumienia: + + + Are you sure? -- qBittorrent + Jesteś pewny? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Jesteś pewien że chcesz usunąć ten strumień z listy? + + + &Yes + &Tak + + + &No + &Nie + + + no refresh + nie odświeżaj + + + no description available + żaden opis niedostępny + + + Are you sure you want to delete this stream from the list? + Jesteś pewien że chcesz usunąć ten strumień z listy? + + + Description: + Opis: + + + url: + url: + + + Last refresh: + Ostatnie odświeżanie: + + + Please choose a folder name + + + + Folder name: + + + + New folder + + + + Overwrite attempt + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Ten kanał informacyjny rss feed już jest na liście. + + + Are you sure you want to delete these elements from the list? + + + + Are you sure you want to delete this element from the list? + + + + Please choose a new name for this RSS feed + + + + New feed name: + + + + Name already in use + + + + This name is already used by another item, please choose another one. + + + + Date: + Data: + + + Author: + Autor: + + + Unread + + + + + RssItem + + No description available + Opis niedostępny + + + + RssStream + + %1 ago + 10min ago + %1 temu + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + Never + Nigdy + + + + SearchCategories + + All categories + + + + Movies + + + + TV shows + + + + Music + + + + Games + + + + Anime + + + + Software + + + + Pictures + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Nazwa + + + Size + i.e: file size + Rozmiar + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Wyszukiwarka + + + Empty search pattern + Pusty wzorzec wyszukiwania + + + Please type a search pattern first + Proszę podać wzorzec wyszukiwania + + + No search engine selected + Nie wybrano wyszukiwarki + + + You must select at least one search engine. + Musisz wybrać przynajmniej jedną wyszukiwarkę. + + + Results + Wyniki + + + Searching... + Wyszukiwanie... + + + Search plugin update -- qBittorrent + Aktualizacja wtyczki wyszukującej -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Dostępna jest nowa wersja wtyczki wyszukiwania, czy chcesz ją zaktualizować? + +Zmiany: + + + + + &Yes + &Tak + + + &No + &Nie + + + Search plugin update + Aktualizacja wtyczki wyszukiwania + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Przepraszamy, serwer aktualizacji jest tymczasowo niedostępny. + + + Your search plugin is already up to date. + Posiadasz najnowszą wersję wtyczki wyszukiwania. + + + Cut + + + + Copy + + + + Paste + + + + Clear field + + + + Clear completion history + + + + Search Engine + Wyszukiwarka + + + Search has finished + Wyszukiwanie zakończone + + + An error occured during search... + Wystąpił błąd podczas wyszukiwania... + + + Search aborted + Wyszukiwanie przerwane + + + Search returned no results + Nic nie znaleziono + + + Results + i.e: Search results + Wyniki + + + Search plugin download error + Błąd pobierania wtyczki wyszukiwarki + + + Couldn't download search plugin update at url: %1, reason: %2. + Nie można pobrać aktualizacji wtyczki wyszukiwarki z url: %1, powód: %2. + + + Unknown + Nieznany + + + + SearchTab + + Name + i.e: file name + Nazwa + + + Size + i.e: file size + Rozmiar + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Wyszukiwarka + + + + TrackersAdditionDlg + + Trackers addition dialog + Dodatkowy dialog trackerów + + + List of trackers to add (one per line): + Lista trackerów do dodania (jeden na linię): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + Chciałbym podziękować następującym osobom, który wspomogli lokalizację qBittorrent-a: + + + Please contact me if you would like to translate qBittorrent to your own language. + Proszę o kontakt, jeżeli chcesz dokonać lokalizacji aplikacji. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + Chciałbym podziękować serwisowi sourceforge.net za hosting dla projektu qBittorrent. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Chciałbym podziękować następującym osobom, który wspomogli lokalizację qBittorrent-a: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Podziękowania dla serwisu sourceforge.net za utrzymanie projektu qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Dziękuje także Jeffery Fernandez (developer@jefferyfernandez.id.au) za jego wielką pomoć w przygotowaniu pakietów RPM.</li></ul> + + + Preview impossible + Nie ma możliwość podglądu + + + Sorry, we can't preview this file + Przepraszamy, podgląd pliku jest niedostępny + + + Name + Nazwa + + + Size + Rozmiar + + + Progress + Postęp + + + No URL entered + Nie wprowadzono adresu URL + + + Please type at least one URL. + Proszę podać przynajmniej jeden adres URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Proszę o kontakt, jeżeli chcesz pomóc w tłumaczeniu qBittorrent. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Chciałbym podziękować następującym osobom, które wspomogły lokalizację qBittorrenta: + + + Please contact me if you would like to translate qBittorrent into your own language. + Proszę o kontakt, jeżeli chcesz pomóc w tłumaczeniu qBittorrent. + + + + addTorrentDialog + + Torrent addition dialog + Dodatkowe informacje o pliku torrent + + + Save path: + Katalog docelowy: + + + ... + ... + + + Torrent size: + + + + Unknown + Nieznany + + + Free disk space: + + + + Torrent content: + Zawartość torrenta: + + + Download in sequential order (slower but good for previewing) + + + + File name + Nazwa pliku + + + File size + Wielkość pliku + + + Selected + Zaznaczony + + + Download in correct order (slower but good for previewing) + Pobierz w ustalonej kolejności (wolniejsze ale lepsze przy korzystaniu z opcji podglądu) + + + Add to download list in paused state + Dodaj tylko do listy pobierania (bez rozpoczynania pobierania) + + + Add + Dodaj + + + Cancel + Anuluj + + + select + Zaznacz + + + Unselect + Odznacz + + + Select + Wybierz + + + Ignored + Ignorowany + + + Normal + Normalny + + + High + Wysoki + + + Maximum + Maksymalny + + + Collapse all + + + + Expand all + + + + + authentication + + Tracker authentication + Autoryzacja do tracker-a + + + Tracker: + Tracker: + + + Login + Login + + + Username: + Nazwa użytkownika: + + + Password: + Hasło: + + + Log in + Zaloguj + + + Cancel + Anuluj + + + + bandwidth_dlg + + Bandwidth allocation + Przepustowość łącza + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 osiagnął ustawione przez ciebie ratio. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' został całkowicie usunięty. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' został usunięty. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' wstrzymany. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' wznowiony. + + + '%1' is not a valid magnet URI. + + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' jest już na liście pobierania. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' wznowiony. (szybkie wznawianie) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' dodany do listy pobierania. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Problem z odczytem pliku torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Plik jest uszkodzony lub nie jest plikiem torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>był zablokowany dzięki filtrowi IP</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>był zablokowany dzięki uszkodzonym częściom</i> + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + Unable to decode %1 torrent file. + + + + Couldn't listen on any of the given ports. + Nie można nasłuchiwać na żadnym z podanych portów. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Błąd mapowania portu, wiadomość %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Udane mapowanie portu, wiadomość %1 + + + Fast resume data was rejected for torrent %1, checking again... + Szybkie wznowienie danych zostało odrzucone przez torrent %1, sprawdzam ponownie... + + + Url seed lookup failed for url: %1, message: %2 + Błąd wyszukiwania url seeda dla url:%1, wiadomość: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Pobieranie '%1', proszę czekać... + + + + createTorrentDialog + + Create Torrent file + Utwórz plik Torrent + + + Destination torrent file: + Docelowy plik torrent: + + + Input file or directory: + Katalog lub plik źródłowy: + + + Comment: + Komentarz: + + + ... + ... + + + Create + Utwórz + + + Cancel + Anuluj + + + Announce url (Tracker): + Adres publikacji (Tracker): + + + Directory + Katalog + + + Torrent Creation Tool + Kreator plików Torrent + + + <center>Destination torrent file:</center> + <center>Docelowy plik torrent:</center> + + + <center>Input file or directory:</center> + <center>Plik lub katalog źródłowy:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Adres publikacji:<br>(Jeden w linii)</center> + + + <center>Comment:</center> + <center>Komentarz:</center> + + + Torrent file creation + Tworzenie pliku torrent + + + Input files or directories: + Wejściowe pliki lub katalogi: + + + Announce urls (trackers): + Zapowiedziane url (trackery): + + + Comment (optional): + Komentarz (opcja): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Prywatny (nie będzie rozprowadzany w sieci beztrackerowej / jeżeli DHT włączone) + + + Web seeds urls (optional): + Web seeds urls (opcjonalnie): + + + File or folder to add to the torrent: + Plik lub folder dodany do torrenta: + + + Add a file + Dodaj plik + + + Add a folder + Dodaj folder + + + Add file + + + + Add folder + + + + Piece size: + Rozmiar części: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + Prywatny (gdy włączony nie będzie rozprowadzany w sieci DHT) + + + Start seeding after creation + Uruchom seedowanie po utworzeniu + + + Create and save... + Tworzenie i zapisywanie... + + + Progress: + Postęp: + + + + createtorrent + + Select destination torrent file + Wybierz plik docelowy + + + Torrent Files + Pliki Torrent + + + Select input directory or file + Wybierz katalog lub plik źródłowy + + + No destination path set + Katalog docelowy nie ustawiony + + + Please type a destination path first + Proszę podać katalog docelowy + + + No input path set + Katalog źródłowy nie zdefiniowany + + + Please type an input path first + Proszę podać katalog żródłowy + + + Input path does not exist + Katalog źródłowy nie istnieje + + + Please type a correct input path first + Proszę podać poprawną ścieżkę źródłową + + + Torrent creation + Tworzenie torrenta + + + Torrent was created successfully: + Utworzono plik torrent: + + + Please type a valid input path first + Prosze podać prawidłowy katalog źródłowy + + + Select a folder to add to the torrent + Wybież folder który dodasz do torrenta + + + Select files to add to the torrent + Wybież plik który dodasz do torrenta + + + Please type an announce URL + Sprecyzuj adres URL trackera + + + Torrent creation was unsuccessful, reason: %1 + Nie udało się stworzyć torrenta , powód: %1 + + + Announce URL: + Tracker URL + Adres URL trackera: + + + Please type a web seed url + Sprecyzuj typ web seed url + + + Web seed URL: + Web seed URL: + + + Select a file to add to the torrent + Wybierz plik który chcesz dodać do torrenta + + + No tracker path set + Nie ustawiono ścieżki trackera + + + Please set at least one tracker + Ustaw przynajmniej jeden tracker + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + Download Torrents from URLs + Pobierz Torrenty z adresów URL + + + Only one URL per line + W linii możesz podać tylko jeden adres URL + + + Download + Pobierz + + + Cancel + Anuluj + + + Download from urls + Pobierz z adresów + + + No URL entered + Nie wprowadzono adresu URL + + + Please type at least one URL. + Proszę podać przynajmniej jeden adres URL. + + + + downloading + + Search + Szukaj + + + Total DL Speed: + Całkowita prędkość DL: + + + KiB/s + KiB/s + + + Session ratio: + Ratio sesji: + + + Total UP Speed: + Całkowita prędkość UP: + + + Log + Log + + + IP filter + Filtr IP + + + Start + Start + + + Pause + Wstrzymaj + + + Delete + Skasuj + + + Clear + Wyczyść + + + Preview file + Podgląd pliku + + + Set upload limit + Ustaw limit wysyłania + + + Set download limit + Ustaw limit pobierania + + + Delete Permanently + Usuń całkowicie + + + Torrent Properties + Właściwości Torrenta + + + Open destination folder + Otwórz folder pobierań + + + Name + Nazwa + + + Size + Rozmiar + + + Progress + Postęp + + + DLSpeed + Prędkość pobierania + + + UpSpeed + Prędkość wysyłania + + + Seeds/Leechs + Seeds/Leechs + + + Ratio + Ratio + + + ETA + ETA + + + Buy it + Kup to + + + Priority + Priorytet + + + Increase priority + Zwiększ priorytet + + + Decrease priority + Zmniejsz priorytet + + + Force recheck + + + + Copy magnet link + + + + + engineSelect + + Search plugins + Wtyczki wyszukiwania + + + Installed search engines: + Zainstalowane silniki wyszukiwania: + + + Name + Nazwa + + + Url + Url + + + Enabled + Włączone + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Tutaj możesz pobrać nowe silniki wtyczek wyszukiwania: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Zainstaluj nową + + + Check for updates + Sprawdź aktualizację + + + Close + Zamknij + + + Enable + Włącz + + + Disable + Wyłącz + + + Uninstall + Odinstaluj + + + + engineSelectDlg + + True + Tak + + + False + Nie + + + Uninstall warning + Ostrzeżenie deinstalacji + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Niektóre wtyczki nie mogą zostać usunięte, ponieważ są częścią qBittorenta. +Tylko te, które dodałeś możesz usunąć. +Jednak tamte wtyczki były wyłączone. + + + Uninstall success + Deinstalacja zakończona + + + All selected plugins were uninstalled successfuly + Wszystkie wybrane wtyczki zostały usunięte + + + Select search plugins + Wybierz wtyczkę wyszukiwania + + + qBittorrent search plugins + wtyczka wyszukiwania qbittorrent + + + Search plugin install + Instalacja wtyczki wyszukiwania + + + Yes + + + + No + + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Obecnie posiadasz zainstalowanych więcej silników wtyczek wyszukiwania %1. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Wtyczka silnika wyszukiwania %1 zaktualizowana poprawnie. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Wtyczka silnika wyszukiwania %1 zainstalowana poprawnie. + + + Search plugin update + Aktualizacja wtyczki wyszukiwania + + + Sorry, update server is temporarily unavailable. + Sorry, czasowo niedostępny serwer aktualizacji. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Aktualizacja wtyczki wyszukiwania %1 zakończona powodzeniem. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Sorry, błąd aktualizacji wtyczki wyszukiwania %1. + + + All your plugins are already up to date. + Wszystkie twoje wtyczki są aktualne. + + + All selected plugins were uninstalled successfully + Wszystkie wybrane wtyczki zostały zainstalowane + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Nie można zaktualizować wtyczki silnika wyszukiwarki %1, pozostaje stara wersja. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Wtyczka silnika wyszukiwarki %1 nie może być zainstalowana. + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Pomyślnie zaktualizowano wtyczkę silnika wyszukiwarki %1. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Pomyślnie zainstalowano wtyczkę silnika wyszukiwarki %1. + + + Search engine plugin archive could not be read. + Nie można odczytać archiwum wtyczki silnika wyszukiwarki. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Błąd instalacji wtyczki silnika %1. + + + New search engine plugin URL + URL nowej wtyczki silnika wyszukiwarki + + + URL: + URL: + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Unknown + Nieznany + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Nieznany + + + < 1m + < 1 minute + < 1m + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + Opcje zapisane! + + + Choose Scan Directory + Wybierz katalog przeszukiwania + + + Choose save Directory + Wybierz katalog zapisu + + + Choose ipfilter.dat file + Wybierz plik ipfilter.dat + + + I/O Error + Błąd We/Wy + + + Couldn't open: + Nie można otworzyć: + + + in read mode. + w trybie odczytu. + + + Invalid Line + Błędny wiersz + + + Line + Wiersz + + + is malformed. + is malformed. + + + Range Start IP + Zakres początkowy IP + + + Start IP: + Początkowe IP: + + + Incorrect IP + Niepoprawne IP + + + This IP is incorrect. + To jest nieprawidłowe IP. + + + Range End IP + Końcowy zakres IP + + + End IP: + Końcowe IP: + + + IP Range Comment + Komentarz zakresu IP + + + Comment: + Komentarz: + + + to + <min port> to <max port> + do + + + Choose your favourite preview program + Wybierz program którym zawsze chcesz otwierać dany typ plików + + + Invalid IP + Niepoprawny adres IP + + + This IP is invalid. + Ten adres IP jest niepoprawny. + + + Options were saved successfully. + Ustawienia zapisane. + + + Choose scan directory + Wybierz katalog przeszukiwania + + + Choose an ipfilter.dat file + Wybierz plik ipfilter.dat + + + Choose a save directory + Wybierz katalog docelowy + + + I/O Error + Input/Output Error + Błąd We/Wy + + + Couldn't open %1 in read mode. + Nie można otworzyć %1 w trybie odczytu. + + + Choose an ip filter file + Wybierz plik ip filter + + + Filters (*.dat *.p2p *.p2b) + Filtry (*.dat *.p2p *.p2b) + + + Filters + Filtry + + + + pluginSourceDlg + + Plugin source + Źródło wtyczki + + + Search plugin source: + Szukaj źródła wtyczki: + + + Local file + Plik lokalny + + + Web link + Adres strony + + + + preview + + Preview selection + Podgląd wybranego + + + File preview + Podgląd pliku + + + The following files support previewing, <br>please select one of them: + Istnieje możliwość podglądu następujących typów plików, <br> proszę wybrać jeden z nich: + + + Preview + Podgląd + + + Cancel + Anuluj + + + + previewSelect + + Preview impossible + Nie ma możliwości podglądu + + + Sorry, we can't preview this file + Przepraszamy, podgląd pliku jest niedostępny + + + Name + Nazwa + + + Size + Rozmiar + + + Progress + Postęp + + + + properties + + Torrent Properties + Właściwości Torrenta + + + Main Infos + Główne informacje + + + File Name + Nazwa pliku + + + Current Session + Aktualna sesja + + + Total Uploaded: + Wysłano ogółem: + + + Total Downloaded: + Sciągnieto ogółem: + + + Download state: + Status sciągania: + + + Current Tracker: + Aktualny Tracker: + + + Number of Peers: + Liczba peer-ów: + + + Torrent Content + Zawartość Torrent-a + + + OK + OK + + + Total Failed: + Błędnych ogółem: + + + Finished + Zakończono + + + Queued for checking + Oczekuje na sprawdzenie + + + Checking files + Sprawdzanie plików + + + Connecting to tracker + Łączenie do tracker-a + + + Downloading Metadata + Pobieranie meta-danych + + + Downloading + Pobieranie + + + Seeding + Seedowanie + + + Allocating + Uzyskiwanie + + + Unknown + Nieznany + + + Complete: + Ukończone: + + + Partial: + Częściowo: + + + Files contained in current torrent: + Pliki w torrencie: + + + Size + Rozmiar + + + Selected + Zaznaczony + + + Unselect + Odznacz + + + Select + Zaznacz + + + You can select here precisely which files you want to download in current torrent. + Możesz określić, które pliki chcesz pobrać z danego torrent-a. + + + False + Nie + + + True + Tak + + + Tracker + Tracker + + + Trackers: + Trackery: + + + None - Unreachable? + Brak - Nieosiągalny? + + + Errors: + Błędy: + + + Progress + Postęp + + + Main infos + Główne informacje + + + Number of peers: + Liczna peer-ów: + + + Current tracker: + Aktualny tracker: + + + Total uploaded: + Ogółem wysłanych: + + + Main info + + + + Torrent information + + + + Total downloaded: + Ogółem pobranych: + + + Total failed: + Ogółem błędnych: + + + Torrent content + Zawartość torrenta + + + Options + Opcje + + + Download in correct order (slower but good for previewing) + Pobierz w ustalonej kolejności (wolniejsze ale lepsze przy korzystaniu z opcji podglądu) + + + Share Ratio: + Ratio: + + + Seeders: + Seeders: + + + Leechers: + Leechers: + + + Save path: + Katalog zapisu: + + + Torrent infos + Informacja o torrencie + + + Creator: + Kreator: + + + Torrent hash: + Torrent hash: + + + Comment: + Komentarz: + + + Current session + Bieżąca sesja + + + Share ratio: + Współczynnik udostępniania: + + + Trackers + Trackery + + + New tracker + Nowy tracker + + + New tracker url: + URL nowego trackera: + + + Priorities: + Pierwszeństwa: + + + Normal: normal priority. Download order is dependent on availability + Normalny: normalny priorytet. Kolejność pobierania zależy od dostępności + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Wysoki: wysoki priorytet. Części są ważniejsze od tych z taką samą dostępnością, lecz nie od części z niższą dostępnością + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maksymalny: maksymalny priorytet. Dostępność jest zlekceważona, części są ważniejsze od tych z niższym priorytetem + + + File name + Nazwa pliku + + + Priority + Priorytet + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Lista trackerów nie może być pusta. + + + Ignored: file is not downloaded at all + Ignorowany: plik nie jest pobierany + + + Ignored + Ignorowany + + + Normal + Normalny + + + Maximum + Maksymalny + + + High + Wysoki + + + Url seeds + Url seeda + + + New url seed: + Nowy url seeda: + + + This url seed is already in the list. + Ten url seeda już jest na liście. + + + Hard-coded url seeds cannot be deleted. + Nie można usunąć ustalony url seeda. + + + None + i.e: No error message + Brak + + + New url seed + New HTTP source + Nowy url seeda + + + The following url seeds are available for this torrent: + Dla tego torrenta dostępne są następujące url seeda: + + + Priorities error + Błąd priorytetu + + + Error, you can't filter all the files in a torrent. + Błąd, nie można filtrować wszystkich plików torrencie. + + + Downloaded pieces + Pobrane części + + + Collapse all + + + + Expand all + + + + ... + ... + + + Choose save path + Wybierz katalog docelowy + + + Save path creation error + Błąd tworzenia katalogu docelowego + + + Could not create the save path + Nie można założyć katalogu docelowego + + + + search_engine + + Search + Szukaj + + + Search Engines + Wyszukiwarki + + + Search Pattern: + Wzorzec wyszukiwania: + + + Stop + Stop + + + Status: + Status: + + + Stopped + Zatrzymany + + + Results: + Rezultat: + + + Download + Pobierz + + + Clear + Wyczyść + + + Update search plugin + Aktualizacja wtyczki wyszukiwania + + + Search engines... + Wyszukaj silniki wyszukiwania... + + + Close tab + Zamknij zakładkę + + + + seeding + + Search + Szukaj + + + The following torrents are finished and shared: + Pobrane i udostępniane torrenty: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Notka:</u> Ważne abyś zostawił pobrany torrent do współdzielenia w sieci dla jej dobrego działania. + + + Start + Start + + + Pause + Wstrzymaj + + + Delete + Skasuj + + + Delete Permanently + Usuń całkowicie + + + Torrent Properties + Właściwości Torrenta + + + Preview file + Podgląd pliku + + + Set upload limit + Ustaw limit wysyłania + + + Open destination folder + Otwórz folder pobierań + + + Name + Nazwa + + + Size + Rozmiar + + + Upload Speed + Prędkość wysyłania + + + Connected peers + + + + Seeds / Leechers + + + + Copy magnet link + + + + Leechers + Leechers + + + Ratio + Ratio + + + Buy it + Kup to + + + Total uploaded + + + + Priority + Priorytet + + + Increase priority + Zwiększ priorytet + + + Decrease priority + Zmniejsz priorytet + + + Force recheck + + + + + subDownloadThread + + Host is unreachable + Host jest niedostępny + + + File was not found (404) + Nie znaleziono pliku (404) + + + Connection was denied + Połączenie odrzucone + + + Url is invalid + Błędny URL + + + I/O Error + Błąd We/Wy + + + Connection forbidden (403) + Niedozwolone połączenie (403) + + + Connection was not authorized (401) + Nieautoryzowane połączenie (401) + + + Content has moved (301) + Zawatrość została przeniesiona (301) + + + Connection failure + Brak połączenia + + + Connection was timed out + Upłynął czas połączenia + + + Incorrect network interface + Niepoprawny interfejs sieci + + + Unknown error + Nieznany błąd + + + Could not resolve proxy + Nie można określić proxy + + + + torrentAdditionDialog + + True + Tak + + + Unable to decode torrent file: + Problem z odkodowaniem pliku torrent: + + + This file is either corrupted or this isn't a torrent. + Plik jest uszkodzony lub nie jest plikiem torrent. + + + Choose save path + Wybierz katalog docelowy + + + False + Nie + + + Unknown + Nieznany + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + Empty save path + Niepoprawny katalog docelowy + + + Please enter a save path + Podaj katalog docelowy + + + Save path creation error + Błąd tworzenia katalogu docelowego + + + Could not create the save path + Nie można założyć katalogu docelowego + + + Invalid file selection + Wybrano niepoprawny plik + + + You must select at least one file in the torrent + Musisz wybrać przynajmniej jeden plik z pliku torrent + + + File name + Nazwa pliku + + + Size + Rozmiar + + + Progress + Postęp + + + Priority + Priorytet + + + diff --git a/src/lang/qbittorrent_pt.qm b/src/lang/qbittorrent_pt.qm new file mode 100644 index 0000000000000000000000000000000000000000..937345335390b891eb987ce81c09a9e4bd4fde0f GIT binary patch literal 69373 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_pt.ts b/src/lang/qbittorrent_pt.ts new file mode 100644 index 000000000..92e9a701b --- /dev/null +++ b/src/lang/qbittorrent_pt.ts @@ -0,0 +1,4807 @@ + + + + + AboutDlg + + About qBittorrent + Sobre qBittorrent + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + About + Sobre + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Um cliente bittorrent usando Qt4 e libtorrent, programado em C++.<br> +<br> +Copyright ©2006 por Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + Author + Autor + + + Name: + Nome: + + + Country: + País: + + + Birthday: + Aniversário: + + + Occupation: + Profissão: + + + E-mail: + E-mail: + + + Home page: + Site: + + + Christophe Dumez + Christophe Dumez + + + France + França + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Estudante em Ciências da Computação + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dcrhis.eu + + + Thanks To + Agradecimentos + + + Translation + Tradução + + + License + Licença + + + Thanks to + Agradecimentos para + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Um cliente Bittorrent programado em C++, baseado no toolkit Qt4</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Limite de upload: + + + Download limit: + Limite de download: + + + Unlimited + Unlimited (bandwidth) + Ilimitado (banda) + Ilimitado + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent console + + + General + Gerais + + + Blocked IPs + IPs bloqueados + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opções -- qBittorrent + + + Options + Opções + + + Main + Principal + + + Save Path: + Salvar em: + + + Download Limit: + Limite de Download: + + + Upload Limit: + Limite de Upload: + + + Max Connects: + Conexões Máximas: + + + Port range: + Range da porta: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Desabilitar + + + connections + conexões + + + Proxy + Proxy + + + Proxy Settings + Configurações de Proxy + + + Server IP: + Ip do servidor: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Porta: + + + Proxy server requires authentication + Servidor proxy requer autenticação + + + Authentication + Autenticação + + + User Name: + Usuário: + + + Password: + Senha: + + + Enable connection through a proxy server + Habilitar conexão por um servidor proxy + + + OK + OK + + + Cancel + Cancelar + + + Scanned Dir: + Diretório varrido: + + + Enable directory scan (auto add torrent files inside) + Habilitar varredura de diretório (adicionar automaticamente arquivos torrent) + + + Connection Settings + Configurações de Conexão + + + Share ratio: + Taxa de Compartilhamento: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP máx. + + + Activate IP Filtering + Ativar filtragem de IP + + + Filter Settings + Configurações do Filtro + + + Start IP + Iniciar IP + + + End IP + Finalizar IP + + + Origin + Origem + + + Comment + Comentário + + + Apply + Aplicar + + + IP Filter + Filtro de IP + + + Add Range + Adicionar a escala + + + Remove Range + Remover a escala + + + ipfilter.dat Path: + Caminho do ipfilter.dat: + + + Clear finished downloads on exit + Limpar downloads concluídos ao sair + + + Ask for confirmation on exit + Confirmar antes de sair + + + Go to systray when minimizing window + Ir para systray quando minimizado + + + Misc + Miscelânea + + + Localization + Localização + + + Language: + Língua: + + + Behaviour + Comportamento + + + OSD + OSD + + + Always display OSD + Sempre mostrar OSD + + + Display OSD only if window is minimized or iconified + Mostrar OSD somente se a janela estiver minimizada ou em ícone + + + Never display OSD + Nunca mostrar OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP máx. + + + Automatically clear finished downloads + Limpar automaticamente downloads concluídos + + + Preview program + Previsualizar programa + + + Audio/Video player: + Tocador de Áudio/Vídeo: + + + Systray Messages + Mensagens do Systray + + + Always display systray messages + Sempre mostrar mensagens no systray + + + Display systray messages only when window is hidden + Mostrar mensagens do systray somente quando a janela estiver escondida + + + Never display systray messages + Nunca mostrar mensagens do systray + + + DHT configuration + Configuração DHT + + + DHT port: + Porta DHT: + + + Language + Línguagem + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Atenção:</b> Mudanças somente serão aplicadas depois que o qBittorrent for reiniciado. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Atenção tradutores:</b> se o qBittorrent não está disponível no seu idioma, <br/>e você gostaria de traduzir na sua língua nativa, <br/> por favor entre em contato comigo (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Mostrar diálogo de adição de torrent sempre que adiciono um novo torrent + + + Default save path + Caminho padrão de salvamento + + + Disable DHT (Trackerless) + Desabilitar DHT (Traqueamento) + + + Disable Peer eXchange (PeX) + Desabilitar Peer eXchange (PeX) + + + Go to systray when closing main window + Ir para o systray quando fechar janela principal + + + Connection + Conexão + + + Peer eXchange (PeX) + Troca de Pares (PeX) + + + DHT (trackerless) + DHT (trackerless) + + + Torrent addition + Adição de Torrent + + + Main window + Janela principal + + + Systray messages + Mensagens de Systray + + + Directory scan + Varredura de diretório + + + Style (Look 'n Feel) + Estilo (Aparência) + + + Plastique style (KDE like) + Estilo Plastique (tipo KDE) + + + Cleanlooks style (GNOME like) + Estilo Cleanlooks (tipo GNOME) + + + Motif style (default Qt style on Unix systems) + Estilo Motif (Estilo padrão do Qt no Unix) + + + CDE style (Common Desktop Environment like) + Estilo CDE (Tipo ambiente Desktop comum) + + + MacOS style (MacOSX only) + Estilo MacOS (somente para MacOSX) + + + Exit confirmation when the download list is not empty + Confirmar sair quando a lista de downloads não estiver vazia + + + Disable systray integration + Desabilitar integração com systray + + + WindowsXP style (Windows XP only) + Estilo WindowsXP (somente Windows XP) + + + Server IP or url: + Ip do servidor ou a Url: + + + Proxy type: + Tipo de Proxy: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Conexões afetadas + + + Use proxy for connections to trackers + Usar proxy para conexões em trackers + + + Use proxy for connections to regular peers + Usar proxy para conexões em pares regulares + + + Use proxy for connections to web seeds + Usar proxy para conexões em pares da web + + + Use proxy for DHT messages + Usar proxy para mensagens DHT + + + Encryption + Encriptação + + + Encryption state: + Estado da encriptação: + + + Enabled + Habilitado + + + Forced + Forçado + + + Disabled + Desabilitado + + + Preferences + Preferências + + + General + Gerais + + + Network + Network + + + User interface settings + Configurações visuais de usuário + + + Visual style: + Estilo visual: + + + Cleanlooks style (Gnome like) + Estilo Cleanlooks (Gnome) + + + Motif style (Unix like) + Estilo Motif (Unix) + + + Ask for confirmation on exit when download list is not empty + Pedir confirmação ao sair quando a lista de downloads não está vazia + + + Display current speed in title bar + Exibir velocidade atual na barra de titulo + + + System tray icon + Ícone do sistema + + + Disable system tray icon + Desabilitar ícone do sistema + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + ex.: O icone da bandeja estará visivel quando a janela principal for fechada. + Fechar na bandeja + + + Minimize to tray + Minimizar para a bandeja + + + Show notification balloons in tray + Mostrar balões de notificação no systray + + + Media player: + Tocador de media: + + + Downloads + Downloads + + + Put downloads in this folder: + Colocar downloads nesta pasta: + + + Pre-allocate all files + Pré-alocar todos arquivos + + + When adding a torrent + Adicionando um torrent + + + Display torrent content and some options + Mostrar conteúdo torrent e as opções + + + Do not start download automatically + The torrent will be added to download list in pause state + O torrent será adicionado a lista de download pausado + Não iniciar downloads automáticamente + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + qBittorrent varrerá o diretório e automaticamente iniciará os downloads dessa pasta + Varredura de pasta + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Duplo clique na lista de transferência +qBittorrent irá procurar no diretório e baixará automaticamente torrents present + + + Download list: + Lista de downloads: + + + Seeding list: + Lista de compartilhamento: + + + Download folder: + Pasta de Download: + + + Temp folder: + Pasta temporária: + + + Automatically download torrents present in this folder: + Baixar automaticamente torrents presentes nesta pasta: + + + Listening port + Escutando porta + + + to + i.e: 1200 to 1300 + a + + + Enable UPnP port mapping + Habilitar mapeamento de porta UPnP + + + Enable NAT-PMP port mapping + Habilitar mapeamento de porta NAT-PMP + + + Global bandwidth limiting + Limite global de banda + + + Upload: + Upload: + + + Download: + Download: + + + Bittorrent features + Características Bittorrent + + + Use the same port for DHT and Bittorrent + Usar a mesma porta para o DHT e o Bittorrent + + + Type: + Tipo: + + + (None) + (Nenhum) + + + Proxy: + Proxy: + + + Username: + Usuário: + + + Bittorrent + Bittorrent + + + Connections limit + Limites de conexão + + + Global maximum number of connections: + Número máximo global de conexões: + + + Maximum number of connections per torrent: + Número máximo global de conexões por torrent: + + + Maximum number of upload slots per torrent: + Número máximo de slots de upload por torrent: + + + Additional Bittorrent features + Características Bittorrent adicionais + + + Enable DHT network (decentralized) + Habilitar DHT (decentralizado) + + + Enable Peer eXchange (PeX) + Habilitar Peer eXchange (PeX) + + + Enable Local Peer Discovery + Habilitar Peer Discovery Local + + + Encryption: + Encriptação: + + + Share ratio settings + Configurações de taxa de compartilhamento + + + Desired ratio: + Taxa designada: + + + Filter file path: + Caminho do arquivo do filtro: + + + transfer lists refresh interval: + Intervalo de atualização da lista de transferência: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Intervalo de atualização dos RSS feeds: + + + minutes + minutos + + + Maximum number of articles per feed: + Número máximo de artigos por feed: + + + File system + Sistema de arquivo + + + Remove finished torrents when their ratio reaches: + Remover torrents finalizados quando sua taxa atingir: + + + System default + Padrão do Sistema + + + Start minimized + Iniciar minimizado + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Ação no duplo clique na lista de transferência + + + In download list: + Na lista de download: + + + Pause/Start torrent + Pausar/Iniciar torrent + + + Open destination folder + Abrir pasta de destino + + + Display torrent properties + Mostrar propriedades do torrent + + + In seeding list: + Na lista de compartilhamento: + + + Folder scan interval: + Intervalo de escaneamento de pasta: + + + seconds + segundos + + + Spoof Azureus to avoid ban (requires restart) + Parar Azureus para evitar ser banido + + + Web UI + Caminho web + + + Enable Web User Interface + Habilitar interface de usuário web + + + HTTP Server + Servidor web + + + Enable RSS support + Habilitar suporte RSS + + + RSS settings + Configurações RSS + + + Enable queueing system + Habilitar sistema de espera + + + Maximum active downloads: + Downloads máximos ativos: + + + Torrent queueing + Torrent em espera + + + Maximum active torrents: + Downloads máximos ativos: + + + Display top toolbar + Exibir barra acima + + + Search engine proxy settings + Configurações de proxy de barra de busca + + + Bittorrent proxy settings + Configurações de proxy do Bittorrent + + + Maximum active uploads: + Uploads máximos ativos: + + + Spoof µtorrent to avoid ban (requires restart) + Spoof para evitar a proibição μtorrent (requer reinicialização) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Ação executada quando der duplo clique num item de transferência (baixando/subindo) + Ação no duplo clique + + + Start/Stop + Inicia/Para + + + Open folder + Abrir pasta + + + Show properties + Mostra propriedades + + + Port used for incoming connections: + Porta usada para conexões de entrada: + + + Random + Aleatório + + + UI + UI + + + + DownloadingTorrents + + Name + i.e: file name + ex.: nome do arquivo + Nome + + + Size + i.e: file size + ex.: Tamanho do arquivo + Tamanho + + + Progress + i.e: % downloaded + ex.: % baixado + Progresso + + + DL Speed + i.e: Download speed + ex: Velocidade de download ativo + Velocidade de download + + + UP Speed + i.e: Upload speed + ex: Velocidade de upload ativo + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Ratio + Taxa + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + Be careful, sharing copyrighted material without permission is against the law. + Esteja ciente, compartilhar material protejido sem permissão é contra a lei. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado</i> + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Este arquivo encontra-se corrompido ou não é um torrent. + + + Couldn't listen on any of the given ports. + Não foi possível escutar pelas portas dadas. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + Hide or Show Column + Esconder ou mostrar coluna + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falha no mapeamento de porta, mensagem: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Portas mapeadas com sucesso, mensagem: %1 + + + Priority + Prioridade + + + Seeds/Leechers + i.e: full/partial sources + ex: Fontes completas/parciais + Seeds/Leechers + + + + FeedDownloader + + RSS Feed downloader + Baixador de conteúdo RSS + + + RSS feed: + RSS feed: + + + Feed name + Nome do Feed + + + Automatically download torrents from this feed + Baixar automaticamente torrents deste feed + + + Download filters + Baixar filtros + + + Filters: + Filtros: + + + Filter settings + Configurações de filtro + + + Matches: + Correspondem: + + + Does not match: + Não correspondem: + + + Destination folder: + Pasta de destino: + + + ... + ... + + + Filter testing + Teste de filtro + + + Torrent title: + Título do torrent: + + + Result: + Resultado: + + + Test + Teste + + + Import... + Importar... + + + Export... + Exportar... + + + Rename filter + Renomear filtro + + + Remove filter + Remover filtro + + + Add filter + Adicionar filtro + + + + FeedDownloaderDlg + + New filter + Novo filtro + + + Please choose a name for this filter + Por favor escolha um nome para este filtro + + + Filter name: + Nome do filtro: + + + Invalid filter name + Nome inválido para o filtro + + + The filter name cannot be left empty. + O nome do filtro não pode ser vazio. + + + This filter name is already in use. + Este nome de filtro já está sendo usado. + + + Filter testing error + Erro ao testar o filtro + + + Please specify a test torrent name. + Por favor especifique um nome para o torrent. + + + matches + assemelha + + + does not match + não assemelha + + + Select file to import + Selecione arquivo a importar + + + Filters Files + Arquivos de filtro + + + Import successful + Importado com sucesso + + + Filters import was successful. + Filtros importados com sucesso. + + + Import failure + Falha ao importar + + + Filters could not be imported due to an I/O error. + Filtros não podem ser importados por um erro de entrada e saída. + + + Select destination file + Seleciona arquivo de destino + + + Overwriting confirmation + Confirma sobescrever + + + Are you sure you want to overwrite existing file? + Tem certeza que deseja sobescrever o arquivo existente ? + + + Export successful + Exportado com sucesso + + + Filters export was successful. + A exportação foi executada com sucesso. + + + Export failure + Falha na exportação + + + Filters could not be exported due to an I/O error. + Os filtros não puderam ser exportados por um erro de entrada e saída. + + + + FeedList + + Unread + Não lido + + + + FilterParserThread + + I/O Error + Input/Output Error + Erro de entrada e saída + + + Couldn't open %1 in read mode. + Não posso abrir %1 no modo de leitura. + + + %1 is not a valid PeerGuardian P2B file. + %1 não é um arquivo P2B válido de PeerGuardian. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Concluído + + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeds / Leechers + Seeds / Leechers + + + Connected peers + Peers conectados + + + Progress + i.e: % downloaded + Progresso + + + DL Speed + i.e: Download speed + Velocidade de download + + + UP Speed + i.e: Upload speed + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Estado + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Concluído + + + None + i.e: No error message + Nenhum + + + Ratio + Taxa + + + Leechers + i.e: full/partial sources + Compartilhadores parciais + + + Total uploaded + i.e: Total amount of uploaded data + Total uploaded + +ex.: Quantidade total de dados transferidos + + + Hide or Show Column + Esconder ou mostrar coluna + + + Incomplete torrent in seeding list + Torrent incompleto na lista de compartilhamento + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Parece que o estado do torrent '%1' foi mudado de 'compartilhando' para 'baixando'. Deseja movê-lo de volta para lista de download? (Ou então este torrent será simplesmente removido) + + + Priority + Prioridade + + + + GUI + + Open Torrent Files + Abrir Arquivos Torrent + + + Unknown + Desconhecido + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um torrent. + + + Are you sure you want to delete all files in download list? + Tem certeza que deseja apagar todos os arquivos na lista de downloads? + + + &Yes + &Sim + + + &No + &Não + + + Are you sure you want to delete the selected item(s) in download list? + Tem certeza que deseja apagar o(s) arquivo(s) selecionado(s) na lista de downloads? + + + paused + pausado + + + started + iniciado + + + Finished + Concluído + + + Checking... + Checando... + + + Connecting... + Conectando... + + + Downloading... + Baixando... + + + Download list cleared. + Lista de downloads limpa. + + + All Downloads Paused. + Todos os downloads pausados. + + + All Downloads Resumed. + Todos os downloads reiniciados. + + + DL Speed: + Velocidade de DL: + + + started. + iniciado. + + + UP Speed: + Velocidade de UP: + + + Couldn't create the directory: + Não pode criar o diretório: + + + Torrent Files + Arquivos Torrent + + + already in download list. + <file> already in download list. + já está na lista de downloads. + + + added to download list. + adicionado à lista de downloads. + + + resumed. (fast resume) + reiniciado. (reinicialização rápida) + + + Unable to decode torrent file: + Incapaz de decodificar o arquivo torrent: + + + removed. + <file> removed. + removido. + + + paused. + <file> paused. + pausado. + + + resumed. + <file> resumed. + reiniciado. + + + Listening on port: + Escutando na escuta: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Tem certeza? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Velocidade de Download: + + + <b>Connection Status:</b><br>Online + <b>Status da conexão:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Status da conexão:</b><br>Firewall ativado?<br><i>Não foi possível estabelecer uma conexão...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Status da conexão:</b><br/>Offline<br/><i>Peers não encontrados...</i> + + + has finished downloading. + download finalizado. + + + Couldn't listen on any of the given ports. + Não foi possível escutar pelas portas dadas. + + + None + Nenhum + + + Empty search pattern + Padrão de busca vazio + + + Please type a search pattern first + Por favor digite um padrão de busca primeiro + + + No seach engine selected + Nenhum mecanismo de busca selecionado + + + You must select at least one search engine. + Você deve selecionar pelo menos um mecanismo de busca. + + + Searching... + Buscando... + + + Could not create search plugin. + Não foi possível criar plugin de busca. + + + Stopped + Parado + + + Torrent file URL + URL do arquivo torrent + + + Torrent file URL: + URL do arquivo torrent: + + + Are you sure you want to quit? -- qBittorrent + Tem certeza que deseja sair? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Tem certeza que deseja fechar o qBittorrent? + + + Timed out + Tempo finalizado + + + Error during search... + Erro durante a busca... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Parado + + + Search is finished + Busca finalizada + + + An error occured during search... + Um erro ocorreu durante a busca... + + + Search aborted + Busca abortada + + + Search returned no results + A busca não retornou resultados + + + Search is Finished + Busca finalizada + + + Search plugin update -- qBittorrent + Atualização do plugin de busca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin de busca pode ser atualizado, deseja atualizá-lo? + +Registro de mudanças: + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + Your search plugin is already up to date. + Seu plugin de busca já está atualizado. + + + Results + Resultados + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Estado + + + ETA + ETA + + + Leechers (People that have parts of the files) + Leechers (Pessoas que têm partes de arquivos) + + + Search engine + Mecanismo de busca + + + Stalled + state of a torrent whose DL Speed is 0 + Parado + + + Paused + Pausado + + + Preview process already running + Processo de pré-visualização já está rodando + + + There is already another preview process running. +Please close the other one first. + Há um outro processo de pré-visualização rodando. +Por favor feche o outro primeiro. + + + Downloading + Example: Downloading www.example.com/test.torrent + Baixando + + + Transfers + Transferências + + + Download finished + Download finalizado + + + has finished downloading. + <filename> has finished downloading. + download finalizado. + + + Search Engine + Mecanismo de Busca + + + Are you sure you want to quit qBittorrent? + Você tem certeza que quer sair do qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Você tem certeza que quer deletar o(s) arquivo(s) selecionado(s) da lista de download e do seu disco rígido? + + + I/O Error + Erro de Entrada/Saída + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Estado da conexão: + + + Offline + Offline + + + No peers found... + Peers não encontrados... + + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Progress + i.e: % downloaded + Progresso + + + DL Speed + i.e: Download speed + Velocidade de download + + + UP Speed + i.e: Upload speed + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Velocidade de download: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Velocidade de Upload: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Concluído + + + Checking... + i.e: Checking already downloaded parts... + Checando... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Parado + + + Are you sure you want to quit? + Você tem certeza que quer sair? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' foi deletado. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + None + i.e: No error message + Nenhum + + + Listening on port: %1 + e.g: Listening on port: 1666 + Escutando a porta: %1 + + + All downloads were paused. + Todos os downloads pausados. + + + '%1' paused. + xxx.avi paused. + '%1' pausado. + + + Connecting... + i.e: Connecting to the tracker... + Conectando... + + + All downloads were resumed. + Todos os downloads foram resumidos. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' resumido. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 download finalizado. + + + I/O Error + i.e: Input/Output Error + Erro de Entrada/Saída + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Ocorreu um erro quando tentava ler ou escrever %1. Provavelmente o seu disco está cheio, o download foi pausado + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Ocorreu um erro (disco cheio?), '%1' pausado. + + + Connection Status: + Estado da conexão: + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Sob firewall? + + + No incoming connections... + Sem conexão... + + + No search engine selected + Nenhum mecanismo de busca selecionado + + + Search plugin update + Atualização de plugin de busca + + + Search has finished + Busca finalizada + + + Results + i.e: Search results + Resultados + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Ocorreu um erro (disco cheio?), '%1' pausado. + + + Search + Busca + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Erro de I/O no torrent %1. +Motivo: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent escuta a porta: %1 + + + DHT support [ON], port: %1 + Suporte DHT [Ligado], porta: %1 + + + DHT support [OFF] + Suporte DHT [Desligado] + + + PeX support [ON] + Suporte PeX [Ligado] + + + PeX support [OFF] + Suporte PeX [Desligado] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + A lista de download não está vazia. +Deseja mesmo sair do qBittorrent? + + + Downloads + Downloads + + + Are you sure you want to delete the selected item(s) in finished list? + Quer mesmo deletar os ítems selecionados na lista de finalizados? + + + UPnP support [ON] + Suporte UPnP [Ligado] + + + Be careful, sharing copyrighted material without permission is against the law. + Esteja ciente, compartilhar material protejido sem permissão é contra a lei. + + + Encryption support [ON] + Suporte a encriptação [Ligado] + + + Encryption support [FORCED] + Suporte a encriptação [FORÇADO] + + + Encryption support [OFF] + Suporte a encriptação [Desligado] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado</i> + + + Ratio + Taxa + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Erro no download da URL + + + Couldn't download file at url: %1, reason: %2. + Não pude baixar arquivo em: %1, motivo: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Quer mesmo deletar o(s) arquivo(s) selecionado(s) da lista e do seu HD ? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Quer mesmo deletar o(s) arquivo(s) selecionado(s) da lista finalizada e do seu HD ? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' foi removido permanentemente. + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent está limitado a porta: TCP/%1 + + + UPnP support [OFF] + Suporte UPnP [desligado] + + + NAT-PMP support [ON] + Suporte NAT-PMP [ligado] + + + NAT-PMP support [OFF] + Suporte NAT-PMP [desligado] + + + DHT support [ON], port: UDP/%1 + Suporte DHT [ON], porta: UDP/%1 + + + Local Peer Discovery [ON] + Peer discovery [ligado] + + + Local Peer Discovery support [OFF] + Peer discovery [desligado] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' foi removido sua taxa atingiu o valor máximo que você configurou. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Down: %2Kb/s, Up: %3kb/s) + + + DL: %1 KiB/s + DL: %1 Kbps + + + UP: %1 KiB/s + UP: %1 Kpbs + + + Ratio: %1 + Taxa: %1 + + + DHT: %1 nodes + DHT: %1 nos + + + No direct connections. This may indicate network configuration problems. + Sem conexões diretas. Talvez tenha algo errado em sua configuração. + + + Uploads + Uploads + + + Options were saved successfully. + Opções salvas com sucesso. + + + + MainWindow + + Log: + Registro: + + + Total DL Speed: + Velocidade total de Download: + + + Total UP Speed: + Velocidade total de Upload: + + + Name + Nome + + + Size + Tamanho + + + % DL + % Download + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Estado + + + ETA + ETA + + + &Options + &Opções + + + &Edit + &Editar + + + &File + &Arquivo + + + &Help + &Ajuda + + + Open + Abrir + + + Exit + Sair + + + Preferences + Preferências + + + About + Sobre + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Pause All + Pausar todos + + + Start All + Iniciar todos + + + Documentation + Documentação + + + Delete All + Apagar todos + + + Torrent Properties + Propriedades do Torrent + + + Connection Status + Estado da conexão + + + Downloads + Downloads + + + Search + Busca + + + Search Pattern: + Padrão de busca: + + + Status: + Estado: + + + Stopped + Parado + + + Search Engines + Mecanismos de Busca + + + Results: + Resultados: + + + Stop + Parar + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Mecanismo de Busca + + + Download from URL + Baixar da URL + + + Download + Download + + + Clear + Limpar + + + KiB/s + KiB/s + + + Create torrent + Criar torrent + + + Ratio: + Taxa: + + + Update search plugin + Atualizar plugin de busca + + + Session ratio: + Taxa da sessão: + + + Transfers + Transferências + + + Preview file + Arquivo de pré-visualização + + + Clear log + Limpar log + + + Delete Permanently + Apagar permanentemente + + + Visit website + Visitar site + + + Report a bug + Reportar um bug + + + Set upload limit + Setar limite de upload + + + Set download limit + Setar limite de download + + + Log + Log + + + IP filter + Filtro IP + + + Set global download limit + Setar limite global de download + + + Set global upload limit + Setar limite global de upload + + + Options + Opções + + + Decrease priority + Diminuir prioridade + + + Increase priority + Aumentar prioridade + + + Console + Console + + + + PropListDelegate + + False + Falso + + + True + Verdadeiro + + + Ignored + Ignorado + + + Normal + Normal (priority) + Normal + + + High + High (priority) + Alta + + + Maximum + Maximum (priority) + Máxima + + + + QTextEdit + + Clear + Limpar + + + + RSS + + Search + Busca + + + Delete + Apagar + + + Rename + Renomear + + + Refresh + Atualizar + + + Create + Criar + + + Delete selected streams + Deletar streams selecionadas + + + Refresh RSS streams + Atualizar RSS streams + + + Add a new RSS stream + Adicionar um novo stream de RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Info:</b> <i>(clique-duplo para abrir o link no seu browser)</i> + + + Add RSS stream + Adicionar stream RSS + + + Refresh all streams + Atualizar todos streams + + + RSS streams: + streams RSS: + + + 2 + 2 + + + Mark all as read + Marcar todos como lido + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(duplo-clique para baixar)</span></p></body></html> + + + Download torrent + Baixar torrent + + + Open news URL + Abrir novas URL + + + Copy feed URL + Copiar URL do feed + + + RSS feed downloader + Baixador de RSS feed + + + New subscription + Nova inscrição + + + Mark items read + Marcar ítems lidos + + + Update all + Atualizar todos + + + Update all feeds + Atualizar todos feeds + + + RSS feeds + RSS feeds + + + Update + Atualiza + + + New folder + Nova pasta + + + 1 + 1 + + + Feed URL + URL do feed + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Digite uma url de stream rss + + + Stream URL: + Stream URL: + + + Please choose a new name for this stream + Escolha um novo nome para esse stream + + + New stream name: + Novo nome do stream: + + + Are you sure? -- qBittorrent + Tem certeza? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Quer mesmo deletar este stream da lista ? + + + &Yes + &Sim + + + &No + &Não + + + Are you sure you want to delete this stream from the list? + Quer mesmo deletar este stream da lista ? + + + Description: + Descrição: + + + url: + url: + + + Last refresh: + Última atualização: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Este rss feed já está na lista. + + + Date: + Data: + + + Author: + Autor: + + + Please choose a folder name + Por favor escolha um nome de pasta + + + Folder name: + Nome da pasta: + + + New folder + Nova pasta + + + Are you sure you want to delete these elements from the list? + Está certo de que deseja deletar esses elementos da lista ? + + + Are you sure you want to delete this element from the list? + Deseja realmente deletar esse ítem da lista? + + + Please choose a new name for this RSS feed + Por favor escolha um novo nome para este feed RSS + + + New feed name: + Novo nome do feed: + + + Name already in use + Novo já está em uso + + + This name is already used by another item, please choose another one. + Este nome já está sendo usado por outro ítem, por favor escolha outro. + + + Overwrite attempt + Atenção sobescrevendo + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Você não pode sobescrever o ítem %1. + + + Unread + Não lido + + + + RssItem + + No description available + Nenhuma descrição disponível + + + + RssStream + + %1 ago + 10min ago + %1 atrás + + + Never + Nunca + + + Automatically downloading %1 torrent from %2 RSS feed... + Baixando automaticamente o torrent %1 do RSS feed %2... + + + + SearchCategories + + All categories + Todas categorias + + + Movies + Filmes + + + TV shows + Shows de TV + + + Music + Música + + + Games + Jogos + + + Anime + Anime + + + Software + Programa + + + Pictures + Imagens + + + Books + Livros + + + + SearchEngine + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeders + i.e: Number of full sources + Semeadores + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Mecanismo de busca + + + Empty search pattern + Padrão de busca vazio + + + Please type a search pattern first + Por favor digite um padrão de busca primeiro + + + No search engine selected + Nenhum mecanismo de busca selecionado + + + You must select at least one search engine. + Você deve selecionar pelo menos um mecanismo de busca. + + + Results + Resultados + + + Searching... + Buscando... + + + Search plugin update -- qBittorrent + Atualização do plugin de busca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin de busca pode ser atualizado, deseja atualizá-lo? + +Log de mudanças: + + + &Yes + &Sim + + + &No + &Não + + + Search plugin update + Atualização de plugin de busca + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + Your search plugin is already up to date. + Seu plugin de busca já está atualizado. + + + Cut + Corta + + + Copy + Copia + + + Paste + Cola + + + Clear field + Limpa campo + + + Clear completion history + Limpar lista dos completados + + + Search Engine + Mecanismo de Busca + + + Search has finished + Busca finalizada + + + An error occured during search... + Um erro ocorreu durante a busca... + + + Search aborted + Busca abortada + + + Search returned no results + A busca não retornou resultados + + + Results + i.e: Search results + Resultados + + + Search plugin download error + Erro no download do plugin de busca + + + Couldn't download search plugin update at url: %1, reason: %2. + Não pude baixar a atualização do plugin de busca na url: %1, motivo: %2. + + + Unknown + Desconhecido + + + + SearchTab + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeders + i.e: Number of full sources + Compartilhadores completos + + + Leechers + i.e: Number of partial sources + Compartilhadores parciais + + + Search engine + Mecanismo de busca + + + + SobreDlg + + About qBittorrent + Sobre qBittorrent + + + About + Sobre + + + Author + Autor + + + Name: + Nome: + + + Country: + País: + + + E-mail: + E-mail: + + + Home page: + Site: + + + Christophe Dumez + Christophe Dumez + + + France + França + + + Thanks To + Agradecimentos + + + Translation + Tradução + + + License + Licença + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dcrhis.eu + + + Birthday: + Aniversário: + + + Occupation: + Profissão: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Estudante em Ciências da Computação + + + + TrackersAdditionDlg + + Trackers addition dialog + Diálogo de adição de Trackers + + + List of trackers to add (one per line): + Lista Trackers para adicionar (um por linha): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Contate-me se você gostaria de traduzir o qBittorrent para seu idioma. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Gostaria de agradecer às seguintes pessoas por voluntariamente terem traduzido o qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Gostaria de agradecer ao sourceforge.net pela hospedagem do projeto.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Gostaria também de agradecer a Jeffery Fernandez (developer@jefferyfernandez.id.au), nosso RPM packager, pelo seu grande trabalho.</li></ul> + + + Preview impossible + Impossível a pré-visualização + + + Sorry, we can't preview this file + Sinto muito, mas não podemos ter uma pré-visualização desse arquivo + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + No URL entered + Nenhuma URL inserida + + + Please type at least one URL. + Por favor digite uma URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contate-me se você deseja traduzir o qBittorrent no seu idioma. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Gostaria de agradecer às seguintes pessoas por voluntariamente terem traduzido o qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contate-me se você deseja traduzir o qBittorrent no seu idioma. + + + + addTorrentDialog + + Torrent addition dialog + Dialogo de adicionar torrent + + + Save path: + Caminho de salvamento: + + + ... + ... + + + Torrent content: + Conteúdo do torrent: + + + File name + Nome do arquivo + + + File size + Tamanho do arquivo + + + Selected + Selecionado + + + Download in correct order (slower but good for previewing) + Baixar em ordem (lento mas bom para pré-visualizar) + + + Add to download list in paused state + Adicionar a lista de download em pausa + + + Add + Adicionar + + + Cancel + Cancelar + + + Unselect + Deselecionar + + + Select + Selecionar + + + Ignored + Ignorado + + + Normal + Normal + + + High + Alto + + + Maximum + Máximo + + + Collapse all + Fechar todos + + + Expand all + Expandir todos + + + Torrent size: + Tamanho do torrent: + + + Unknown + Desconhecido + + + Free disk space: + Espaço livre em disco: + + + Download in sequential order (slower but good for previewing) + Baixar em ordem de sequência (mais lento porém melhor para visualizar) + + + + authentication + + Tracker authentication + Autenticação de tracker + + + Tracker: + Tracker: + + + Login + Login + + + Username: + Usuário: + + + Password: + Senha: + + + Log in + Logar + + + Cancel + Cancelar + + + + bandwidth_dlg + + Bandwidth allocation + Alocação de banda + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 atingiu a taxa máxima que você configurou. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' foi removido permanentemente. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' foi deletado. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' pausado. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' resumido. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado pelo seu filtro de IP</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>foi banido por corromper partes</i> + + + Couldn't listen on any of the given ports. + Não foi possível escutar nenhuma das portas informadas. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falha no mapeamento de porta, mensagem: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Portas mapeadas com sucesso, mensagem: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + '%1' is not a valid magnet URI. + '%1' não é um URI magnético válido. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Download recursivo do arquivo %1 embutido no torrent %2 + + + Unable to decode %1 torrent file. + Impossível decodificar %1 do arquivo torrent. + + + + createTorrentDialog + + Create Torrent file + Criar arquivo torrent + + + Destination torrent file: + Arquivo torrent de destino: + + + Input file or directory: + Entre com arquivo ou diretório: + + + Comment: + Comentário: + + + ... + ... + + + Create + Criar + + + Cancel + Cancelar + + + Announce url (Tracker): + Anunciar url (Rastreador): + + + Directory + Diretório + + + Torrent Creation Tool + Ferramenta de Criação de Torrent + + + <center>Destination torrent file:</center> + <center>Arquivo torrent de destino:</center> + + + <center>Input file or directory:</center> + <center>Arquivo ou diretório:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Divulgar url:<br>(Um por linha)</center> + + + <center>Comment:</center> + <center>Comentário:</center> + + + Torrent file creation + Criando arquivo Torrent + + + Input files or directories: + Insira arquivos ou diretórios: + + + Announce urls (trackers): + Urls (trackers): + + + Comment (optional): + Comentário (opcional): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privado (Não pode ser distribuido na rede trackerless / se DHT habilitado) + + + Web seeds urls (optional): + Urls de compartilhadores web (opcional): + + + File or folder to add to the torrent: + Arquivo ou pasta para adicionar ao torrent: + + + Add a file + Adicionar um arquivo + + + Add a folder + Adicionar uma pasta + + + Piece size: + Tamanho: + + + 32 KiB + 32kb + + + 64 KiB + 64kb + + + 128 KiB + 128kb + + + 256 KiB + 256kb + + + 512 KiB + 512kb + + + 1 MiB + 1mb + + + 2 MiB + 2mb + + + 4 MiB + 4mb + + + Private (won't be distributed on DHT network if enabled) + Privado (não distribuir em DHT se habilitado) + + + Start seeding after creation + Iniciar compartilhamento depois de criar + + + Create and save... + Criar e salvar... + + + Progress: + Progresso: + + + Add file + Adicionar arquivo + + + Add folder + Adicionar pasta + + + + createtorrent + + Select destination torrent file + Selecione o arquivo torrent de destino + + + Torrent Files + Arquivos Torrent + + + Select input directory or file + Selecione o diretório ou arquivo de entrada + + + No destination path set + Nenhum caminho de destino selecionado + + + Please type a destination path first + Digite primeiro um caminho de destino + + + No input path set + Nenhum caminho de entrada selecionado + + + Please type an input path first + Digite primeiro um caminho de entrada + + + Input path does not exist + Caminho de entrada não existe + + + Please type a correct input path first + Digite primeiro um caminho de entrada correto + + + Torrent creation + Criação de torrent + + + Torrent was created successfully: + Torrent foi criado com sucesso: + + + Please type a valid input path first + Por favor insira um caminho válido primeiro + + + Select a folder to add to the torrent + Selecione uma pasta para adicionar ao torrent + + + Select files to add to the torrent + Selecione arquivos para adicionar ao torrent + + + Please type an announce URL + Digite uma url anunciada + + + Torrent creation was unsuccessful, reason: %1 + A criação do torrent não foi possível, motivo: %1 + + + Announce URL: + Tracker URL + Url anunciada: + + + Please type a web seed url + Digite uma url de compartilhador web + + + Web seed URL: + Url de compartilhador web: + + + Select a file to add to the torrent + Selecione um arquivo para adicionar ao torrent + + + No tracker path set + Nenhum tracker setado + + + Please set at least one tracker + Por favor, adicione ao menos um tracker + + + Created torrent file is invalid. It won't be added to download list. + Torrent criado é inválido. Não será adicionado a lista de download. + + + + downloadFromURL + + Download Torrents from URLs + Baixar torrents de URLs + + + Only one URL per line + Somente uma URL por linha + + + Download + Baixar + + + Cancel + Cancelar + + + Download from urls + Baixar de URLs + + + No URL entered + Nenhuma URL inserida + + + Please type at least one URL. + Por favor digite uma URL. + + + + downloading + + Search + Busca + + + Total DL Speed: + Velocidade total de Download: + + + KiB/s + Kb/s + + + Session ratio: + Taxa da sessão: + + + Total UP Speed: + Velocidade total de Upload: + + + Log + Log + + + IP filter + Filtro IP + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Clear + Limpar + + + Preview file + Arquivo de pré-visualização + + + Set upload limit + Setar limite de upload + + + Set download limit + Setar limite de download + + + Delete Permanently + Apagar permanentemente + + + Torrent Properties + Propriedades do Torrent + + + Open destination folder + Abrir pasta de destino + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + DLSpeed + Velocidade de download + + + UpSpeed + Velocidade de upload + + + Seeds/Leechs + Compartilhadores + + + Ratio + Taxa + + + ETA + ETA + + + Buy it + Compre isso + + + Priority + Prioridade + + + Increase priority + Aumentar prioridade + + + Decrease priority + Diminuir prioridade + + + Force recheck + Forçar re-checagem + + + Copy magnet link + Copiar link magnético + + + + engineSelect + + Search plugins + Plugins de busca + + + Installed search engines: + Plugins de busca instalados: + + + Name + Nome + + + Url + Url + + + Enabled + Habilitado + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Você pode encontrar novos plugins de busca aqui: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Instalar um novo + + + Check for updates + Verificar atualizações + + + Close + Fechar + + + Enable + Habilitar + + + Disable + Desabilitar + + + Uninstall + Desinstalar + + + + engineSelectDlg + + True + Verdadeiro + + + False + Falso + + + Uninstall warning + Aviso de desinstalação + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Muitos plugins não podem ser desinstalados por serem padrão do qBittorrent. + Apenas aqueles que você instalou podem ser desinstalados. +Portanto os plugins foram desabilitados. + + + Uninstall success + Desinstalado com sucesso + + + Select search plugins + Selecionar plugins de busca + + + qBittorrent search plugins + Plugins de busca qBittorrent + + + Search plugin install + Instalação de plugin de busca + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Uma versão mais recente de plugin de busca %1 já está instalado. + + + Search plugin update + Atualização de plugin de busca + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + All your plugins are already up to date. + Todos os plugins já estão atuais. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 esse aí não pôde ser atualizado, vai ficar o véio. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Plugin de busca %1 não pode ser instalado. + + + All selected plugins were uninstalled successfully + Plugins selecionados desinstalados com sucesso + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Plugin de busca %1 atualizado com sucesso. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Plugin de busca %1 instalado com sucesso. + + + Search engine plugin archive could not be read. + Arquivo de plugin de busca não pode ser lido. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Sinto muito mas a instalação do plugin de busca %1 falhou. + + + New search engine plugin URL + Url de novo plugin de busca + + + URL: + Url: + + + Yes + Sim + + + No + Não + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + Kib + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + Unknown + Desconhecido + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Desconhecido + + + < 1m + < 1 minute + < 1 minuto + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + Opções salvas com sucesso! + + + Choose Scan Directory + Escolha diretório para varrer + + + Choose save Directory + Escolha diretório onde salvar + + + Choose ipfilter.dat file + Escolha arquivo ipfilter.dat + + + I/O Error + Erro de Entrada ou Saída + + + Couldn't open: + Impossível abrir: + + + in read mode. + em modo de leitura. + + + Invalid Line + Linha inválida + + + Line + Linha + + + is malformed. + está corrompido. + + + Range Start IP + IP do começo da escala + + + Start IP: + Iniciar IP: + + + Incorrect IP + IP incorreto + + + This IP is incorrect. + Este IP está incorreto. + + + Range End IP + IP do fim da escala + + + End IP: + Finalizar IP: + + + IP Range Comment + Comentário Range de IP + + + Comment: + Comentário: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + Selecione seu programa preferido para pré-visualizar + + + Invalid IP + IP inválido + + + This IP is invalid. + Este IP é inválido. + + + Options were saved successfully. + Opções salvas com sucesso. + + + Choose scan directory + Selecione diretório para varredura + + + Choose an ipfilter.dat file + Selecione um arquivo ipfilter.dat + + + Choose a save directory + Selecione um diretório de salvamento + + + I/O Error + Input/Output Error + Erro de Entrada/Saída + + + Couldn't open %1 in read mode. + Não posso abrir %1 no modo de leitura. + + + Choose an ip filter file + Escolha um arquivo de filtro de ip + + + Filters + Filtros + + + + pluginSourceDlg + + Plugin source + Fonte do plugin + + + Search plugin source: + Busca de plugin de busca: + + + Local file + Arquivo local + + + Web link + Link da net + + + + preview + + Preview selection + Seleção de pré-visualização + + + File preview + Pré-visualização de arquivo + + + The following files support previewing, <br>please select one of them: + Os seguintes arquivos suportam pré-visualização, <br>por favor selecione um deles: + + + Preview + Pré-visualização + + + Cancel + Cancelar + + + + previewSelect + + Preview impossible + Pré-visualização impossível + + + Sorry, we can't preview this file + Arquivo sem possível pré-visualização + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + + properties + + Torrent Properties + Propriedades do Torrent + + + Main Infos + Informações principais + + + File Name + Nome do Arquivo + + + Current Session + Sessão atual + + + Total Uploaded: + Total Enviado: + + + Total Downloaded: + Total Baixado: + + + Download state: + Estado do download: + + + Current Tracker: + Rastreador atual: + + + Number of Peers: + Número de Peers: + + + Torrent Content + Conteúdo do Torrent + + + OK + OK + + + Total Failed: + Falharam: + + + Finished + Concluído + + + Queued for checking + Na fila para checagem + + + Checking files + Checando arquivos + + + Connecting to tracker + Conectando-se ao rastreador + + + Downloading Metadata + Baixando Metadados + + + Downloading + Baixando + + + Seeding + Enviando + + + Allocating + Alocando + + + Unknown + Desconhecido + + + Complete: + Completo: + + + Partial: + Parcial: + + + Files contained in current torrent: + Arquivos contidos no torrent atual: + + + Size + Tamanho + + + Selected + Selecionado + + + Unselect + Desfazer seleção + + + Select + Selecionar + + + You can select here precisely which files you want to download in current torrent. + Você pode selecionar aqui precisamente quais arquivos você quer baixar no torrent atual. + + + False + Falso + + + True + Verdadeiro + + + Tracker + Rastreador + + + Trackers: + Rastreadores: + + + None - Unreachable? + Nenhum - Inatingível? + + + Errors: + Erros: + + + Progress + Progresso + + + Main infos + Informações principais + + + Current tracker: + Rastreador atual: + + + Total uploaded: + Total de Upload: + + + Main info + Início da informação + + + Torrent information + Informação do Torrent + + + Total downloaded: + Total baixado: + + + Total failed: + Total falhado: + + + Torrent content + Conteúdo torrent + + + Options + Opções + + + Download in correct order (slower but good for previewing) + Baixar em ordem correta (lento mas bom para pré-visualizar) + + + Share Ratio: + Taxa de compartilhamento: + + + Seeders: + Enviando: + + + Leechers: + Leechers: + + + Save path: + Caminho de salvamento: + + + Torrent infos + Infos do Torrent + + + Creator: + Criador: + + + Torrent hash: + Mistura do Torrent: + + + Comment: + Comentário: + + + Current session + Sessão atual + + + Share ratio: + Taxa de Compartilhamento: + + + Trackers + Rastreadores + + + New tracker + Novo rastreador + + + New tracker url: + Novo url de rastreador: + + + Priorities: + Prioridades: + + + Normal: normal priority. Download order is dependent on availability + Normal: prioridade normal. Ordem de download é dependente da disponibilidade + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Alta: Maior que a prioridade normal. As partes são preferidas sobre partes com a mesma disponibilidade, mas não em excesso das com disponibilidade mais baixa + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Máxima: prioridade máxima, disponibilidade é desconsiderada, a parte é preferida mais que outra parte com prioridade baixa + + + File name + Nome do arquivo + + + Priority + Prioridade + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Lista de rastreadores não pode estar vazia. + + + Ignored: file is not downloaded at all + Ignorado: arquivo não foi baixado completamente + + + Ignored + Ignorado + + + Normal + Normal + + + Maximum + Máxima + + + High + Alta + + + Url seeds + Url de compartilhadores + + + New url seed: + Nova url de compartilhador: + + + This url seed is already in the list. + Essa url de compartilhador já está na lista. + + + Hard-coded url seeds cannot be deleted. + Url de compartilhador no código-fonte não pode ser deletada. + + + None + i.e: No error message + Nenhum + + + New url seed + New HTTP source + Nova url de compartilhador + + + The following url seeds are available for this torrent: + As urls a seguir estão disponíveis para este torrent: + + + Priorities error + Erro de prioridades + + + Error, you can't filter all the files in a torrent. + Erro, você não pode filtrar todos arquivos no torrent. + + + Downloaded pieces + Partes baixadas + + + Collapse all + Fechar todos + + + Expand all + Expandir todos + + + ... + ... + + + Choose save path + Escolha um caminho de salvamento + + + Save path creation error + Erro ao criar caminho de salvamento + + + Could not create the save path + Não foi possível criar caminho de salvamento + + + + search_engine + + Search + Busca + + + Search Engines + Mecanismos de Busca + + + Search Pattern: + Padrão de busca: + + + Stop + Parar + + + Status: + Estado: + + + Stopped + Parado + + + Results: + Resultados: + + + Download + Download + + + Clear + Limpar + + + Update search plugin + Atualizar plugin de busca + + + Search engines... + Máquinas de busca... + + + Close tab + Fechar aba + + + + seeding + + Search + Busca + + + The following torrents are finished and shared: + Os torrents a seguir terminaram e compartilham: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Info:</u> É importante que você mantenha compartilhando seus torrents terminados para o bem estar da rede. + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Delete Permanently + Apagar permanentemente + + + Torrent Properties + Propriedades do Torrent + + + Preview file + Arquivo de pré-visualização + + + Set upload limit + Setar limite de upload + + + Open destination folder + Abrir pasta de destino + + + Name + Nome + + + Size + Tamanho + + + Upload Speed + Velocidade de upload + + + Connected peers + Peers conectados + + + Seeds / Leechers + Seeds / Leechers + + + Leechers + Compartilhadores + + + Ratio + Taxa + + + Buy it + Compre isso + + + Total uploaded + Total uploaded + + + Priority + Prioridade + + + Force recheck + Forçar re-checagem + + + Copy magnet link + Copiar link magnético + + + + subDownloadThread + + Host is unreachable + O host é inalcançável + + + File was not found (404) + Arquivo não encontrado (404) + + + Connection was denied + Conexão foi negada + + + Url is invalid + Url é inválida + + + Connection forbidden (403) + Conexão proibida (403) + + + Connection was not authorized (401) + Conexão não foi autorizada (401) + + + Content has moved (301) + Conteúdo foi movido (301) + + + Connection failure + Conexão falhou + + + Connection was timed out + Conexão esgotou o tempo + + + Incorrect network interface + Relação da rede incorreta + + + Unknown error + Erro desconhecido + + + Could not resolve proxy + Não pude resolver proxy + + + I/O Error + Erro de entrada e saída + + + + torrentAdditionDialog + + True + Verdadeiro + + + Unable to decode torrent file: + Incapaz de decodificar o arquivo torrent: + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um arquivo torrent. + + + Choose save path + Escolha um caminho de salvamento + + + False + Falso + + + Empty save path + Caminho de salvamento vazio + + + Please enter a save path + Por favor digite um caminho de salvamento + + + Save path creation error + Erro ao criar caminho de salvamento + + + Could not create the save path + Não foi possível criar caminho de salvamento + + + Invalid file selection + Seleção de arquivo inválida + + + You must select at least one file in the torrent + Você deve selecionar um arquivo no torrent + + + File name + Nome do arquivo + + + Size + Tamanho + + + Progress + Progresso + + + Priority + Prioridade + + + Unknown + Desconhecido + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + ex: (100MiB depois de baixar o torrent) + (%1 depois de baixar o torrent) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 mais é requerido para baixar) + + + diff --git a/src/lang/qbittorrent_pt_BR.qm b/src/lang/qbittorrent_pt_BR.qm new file mode 100644 index 0000000000000000000000000000000000000000..937345335390b891eb987ce81c09a9e4bd4fde0f GIT binary patch literal 69373 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_pt_BR.ts b/src/lang/qbittorrent_pt_BR.ts new file mode 100644 index 000000000..92e9a701b --- /dev/null +++ b/src/lang/qbittorrent_pt_BR.ts @@ -0,0 +1,4807 @@ + + + + + AboutDlg + + About qBittorrent + Sobre qBittorrent + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + About + Sobre + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Um cliente bittorrent usando Qt4 e libtorrent, programado em C++.<br> +<br> +Copyright ©2006 por Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + Author + Autor + + + Name: + Nome: + + + Country: + País: + + + Birthday: + Aniversário: + + + Occupation: + Profissão: + + + E-mail: + E-mail: + + + Home page: + Site: + + + Christophe Dumez + Christophe Dumez + + + France + França + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Estudante em Ciências da Computação + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dcrhis.eu + + + Thanks To + Agradecimentos + + + Translation + Tradução + + + License + Licença + + + Thanks to + Agradecimentos para + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Um cliente Bittorrent programado em C++, baseado no toolkit Qt4</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Limite de upload: + + + Download limit: + Limite de download: + + + Unlimited + Unlimited (bandwidth) + Ilimitado (banda) + Ilimitado + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent console + + + General + Gerais + + + Blocked IPs + IPs bloqueados + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opções -- qBittorrent + + + Options + Opções + + + Main + Principal + + + Save Path: + Salvar em: + + + Download Limit: + Limite de Download: + + + Upload Limit: + Limite de Upload: + + + Max Connects: + Conexões Máximas: + + + Port range: + Range da porta: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Desabilitar + + + connections + conexões + + + Proxy + Proxy + + + Proxy Settings + Configurações de Proxy + + + Server IP: + Ip do servidor: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Porta: + + + Proxy server requires authentication + Servidor proxy requer autenticação + + + Authentication + Autenticação + + + User Name: + Usuário: + + + Password: + Senha: + + + Enable connection through a proxy server + Habilitar conexão por um servidor proxy + + + OK + OK + + + Cancel + Cancelar + + + Scanned Dir: + Diretório varrido: + + + Enable directory scan (auto add torrent files inside) + Habilitar varredura de diretório (adicionar automaticamente arquivos torrent) + + + Connection Settings + Configurações de Conexão + + + Share ratio: + Taxa de Compartilhamento: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP máx. + + + Activate IP Filtering + Ativar filtragem de IP + + + Filter Settings + Configurações do Filtro + + + Start IP + Iniciar IP + + + End IP + Finalizar IP + + + Origin + Origem + + + Comment + Comentário + + + Apply + Aplicar + + + IP Filter + Filtro de IP + + + Add Range + Adicionar a escala + + + Remove Range + Remover a escala + + + ipfilter.dat Path: + Caminho do ipfilter.dat: + + + Clear finished downloads on exit + Limpar downloads concluídos ao sair + + + Ask for confirmation on exit + Confirmar antes de sair + + + Go to systray when minimizing window + Ir para systray quando minimizado + + + Misc + Miscelânea + + + Localization + Localização + + + Language: + Língua: + + + Behaviour + Comportamento + + + OSD + OSD + + + Always display OSD + Sempre mostrar OSD + + + Display OSD only if window is minimized or iconified + Mostrar OSD somente se a janela estiver minimizada ou em ícone + + + Never display OSD + Nunca mostrar OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP máx. + + + Automatically clear finished downloads + Limpar automaticamente downloads concluídos + + + Preview program + Previsualizar programa + + + Audio/Video player: + Tocador de Áudio/Vídeo: + + + Systray Messages + Mensagens do Systray + + + Always display systray messages + Sempre mostrar mensagens no systray + + + Display systray messages only when window is hidden + Mostrar mensagens do systray somente quando a janela estiver escondida + + + Never display systray messages + Nunca mostrar mensagens do systray + + + DHT configuration + Configuração DHT + + + DHT port: + Porta DHT: + + + Language + Línguagem + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Atenção:</b> Mudanças somente serão aplicadas depois que o qBittorrent for reiniciado. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Atenção tradutores:</b> se o qBittorrent não está disponível no seu idioma, <br/>e você gostaria de traduzir na sua língua nativa, <br/> por favor entre em contato comigo (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Mostrar diálogo de adição de torrent sempre que adiciono um novo torrent + + + Default save path + Caminho padrão de salvamento + + + Disable DHT (Trackerless) + Desabilitar DHT (Traqueamento) + + + Disable Peer eXchange (PeX) + Desabilitar Peer eXchange (PeX) + + + Go to systray when closing main window + Ir para o systray quando fechar janela principal + + + Connection + Conexão + + + Peer eXchange (PeX) + Troca de Pares (PeX) + + + DHT (trackerless) + DHT (trackerless) + + + Torrent addition + Adição de Torrent + + + Main window + Janela principal + + + Systray messages + Mensagens de Systray + + + Directory scan + Varredura de diretório + + + Style (Look 'n Feel) + Estilo (Aparência) + + + Plastique style (KDE like) + Estilo Plastique (tipo KDE) + + + Cleanlooks style (GNOME like) + Estilo Cleanlooks (tipo GNOME) + + + Motif style (default Qt style on Unix systems) + Estilo Motif (Estilo padrão do Qt no Unix) + + + CDE style (Common Desktop Environment like) + Estilo CDE (Tipo ambiente Desktop comum) + + + MacOS style (MacOSX only) + Estilo MacOS (somente para MacOSX) + + + Exit confirmation when the download list is not empty + Confirmar sair quando a lista de downloads não estiver vazia + + + Disable systray integration + Desabilitar integração com systray + + + WindowsXP style (Windows XP only) + Estilo WindowsXP (somente Windows XP) + + + Server IP or url: + Ip do servidor ou a Url: + + + Proxy type: + Tipo de Proxy: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Conexões afetadas + + + Use proxy for connections to trackers + Usar proxy para conexões em trackers + + + Use proxy for connections to regular peers + Usar proxy para conexões em pares regulares + + + Use proxy for connections to web seeds + Usar proxy para conexões em pares da web + + + Use proxy for DHT messages + Usar proxy para mensagens DHT + + + Encryption + Encriptação + + + Encryption state: + Estado da encriptação: + + + Enabled + Habilitado + + + Forced + Forçado + + + Disabled + Desabilitado + + + Preferences + Preferências + + + General + Gerais + + + Network + Network + + + User interface settings + Configurações visuais de usuário + + + Visual style: + Estilo visual: + + + Cleanlooks style (Gnome like) + Estilo Cleanlooks (Gnome) + + + Motif style (Unix like) + Estilo Motif (Unix) + + + Ask for confirmation on exit when download list is not empty + Pedir confirmação ao sair quando a lista de downloads não está vazia + + + Display current speed in title bar + Exibir velocidade atual na barra de titulo + + + System tray icon + Ícone do sistema + + + Disable system tray icon + Desabilitar ícone do sistema + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + ex.: O icone da bandeja estará visivel quando a janela principal for fechada. + Fechar na bandeja + + + Minimize to tray + Minimizar para a bandeja + + + Show notification balloons in tray + Mostrar balões de notificação no systray + + + Media player: + Tocador de media: + + + Downloads + Downloads + + + Put downloads in this folder: + Colocar downloads nesta pasta: + + + Pre-allocate all files + Pré-alocar todos arquivos + + + When adding a torrent + Adicionando um torrent + + + Display torrent content and some options + Mostrar conteúdo torrent e as opções + + + Do not start download automatically + The torrent will be added to download list in pause state + O torrent será adicionado a lista de download pausado + Não iniciar downloads automáticamente + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + qBittorrent varrerá o diretório e automaticamente iniciará os downloads dessa pasta + Varredura de pasta + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Duplo clique na lista de transferência +qBittorrent irá procurar no diretório e baixará automaticamente torrents present + + + Download list: + Lista de downloads: + + + Seeding list: + Lista de compartilhamento: + + + Download folder: + Pasta de Download: + + + Temp folder: + Pasta temporária: + + + Automatically download torrents present in this folder: + Baixar automaticamente torrents presentes nesta pasta: + + + Listening port + Escutando porta + + + to + i.e: 1200 to 1300 + a + + + Enable UPnP port mapping + Habilitar mapeamento de porta UPnP + + + Enable NAT-PMP port mapping + Habilitar mapeamento de porta NAT-PMP + + + Global bandwidth limiting + Limite global de banda + + + Upload: + Upload: + + + Download: + Download: + + + Bittorrent features + Características Bittorrent + + + Use the same port for DHT and Bittorrent + Usar a mesma porta para o DHT e o Bittorrent + + + Type: + Tipo: + + + (None) + (Nenhum) + + + Proxy: + Proxy: + + + Username: + Usuário: + + + Bittorrent + Bittorrent + + + Connections limit + Limites de conexão + + + Global maximum number of connections: + Número máximo global de conexões: + + + Maximum number of connections per torrent: + Número máximo global de conexões por torrent: + + + Maximum number of upload slots per torrent: + Número máximo de slots de upload por torrent: + + + Additional Bittorrent features + Características Bittorrent adicionais + + + Enable DHT network (decentralized) + Habilitar DHT (decentralizado) + + + Enable Peer eXchange (PeX) + Habilitar Peer eXchange (PeX) + + + Enable Local Peer Discovery + Habilitar Peer Discovery Local + + + Encryption: + Encriptação: + + + Share ratio settings + Configurações de taxa de compartilhamento + + + Desired ratio: + Taxa designada: + + + Filter file path: + Caminho do arquivo do filtro: + + + transfer lists refresh interval: + Intervalo de atualização da lista de transferência: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Intervalo de atualização dos RSS feeds: + + + minutes + minutos + + + Maximum number of articles per feed: + Número máximo de artigos por feed: + + + File system + Sistema de arquivo + + + Remove finished torrents when their ratio reaches: + Remover torrents finalizados quando sua taxa atingir: + + + System default + Padrão do Sistema + + + Start minimized + Iniciar minimizado + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Ação no duplo clique na lista de transferência + + + In download list: + Na lista de download: + + + Pause/Start torrent + Pausar/Iniciar torrent + + + Open destination folder + Abrir pasta de destino + + + Display torrent properties + Mostrar propriedades do torrent + + + In seeding list: + Na lista de compartilhamento: + + + Folder scan interval: + Intervalo de escaneamento de pasta: + + + seconds + segundos + + + Spoof Azureus to avoid ban (requires restart) + Parar Azureus para evitar ser banido + + + Web UI + Caminho web + + + Enable Web User Interface + Habilitar interface de usuário web + + + HTTP Server + Servidor web + + + Enable RSS support + Habilitar suporte RSS + + + RSS settings + Configurações RSS + + + Enable queueing system + Habilitar sistema de espera + + + Maximum active downloads: + Downloads máximos ativos: + + + Torrent queueing + Torrent em espera + + + Maximum active torrents: + Downloads máximos ativos: + + + Display top toolbar + Exibir barra acima + + + Search engine proxy settings + Configurações de proxy de barra de busca + + + Bittorrent proxy settings + Configurações de proxy do Bittorrent + + + Maximum active uploads: + Uploads máximos ativos: + + + Spoof µtorrent to avoid ban (requires restart) + Spoof para evitar a proibição μtorrent (requer reinicialização) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Ação executada quando der duplo clique num item de transferência (baixando/subindo) + Ação no duplo clique + + + Start/Stop + Inicia/Para + + + Open folder + Abrir pasta + + + Show properties + Mostra propriedades + + + Port used for incoming connections: + Porta usada para conexões de entrada: + + + Random + Aleatório + + + UI + UI + + + + DownloadingTorrents + + Name + i.e: file name + ex.: nome do arquivo + Nome + + + Size + i.e: file size + ex.: Tamanho do arquivo + Tamanho + + + Progress + i.e: % downloaded + ex.: % baixado + Progresso + + + DL Speed + i.e: Download speed + ex: Velocidade de download ativo + Velocidade de download + + + UP Speed + i.e: Upload speed + ex: Velocidade de upload ativo + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Ratio + Taxa + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + Be careful, sharing copyrighted material without permission is against the law. + Esteja ciente, compartilhar material protejido sem permissão é contra a lei. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado</i> + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Este arquivo encontra-se corrompido ou não é um torrent. + + + Couldn't listen on any of the given ports. + Não foi possível escutar pelas portas dadas. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + Hide or Show Column + Esconder ou mostrar coluna + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falha no mapeamento de porta, mensagem: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Portas mapeadas com sucesso, mensagem: %1 + + + Priority + Prioridade + + + Seeds/Leechers + i.e: full/partial sources + ex: Fontes completas/parciais + Seeds/Leechers + + + + FeedDownloader + + RSS Feed downloader + Baixador de conteúdo RSS + + + RSS feed: + RSS feed: + + + Feed name + Nome do Feed + + + Automatically download torrents from this feed + Baixar automaticamente torrents deste feed + + + Download filters + Baixar filtros + + + Filters: + Filtros: + + + Filter settings + Configurações de filtro + + + Matches: + Correspondem: + + + Does not match: + Não correspondem: + + + Destination folder: + Pasta de destino: + + + ... + ... + + + Filter testing + Teste de filtro + + + Torrent title: + Título do torrent: + + + Result: + Resultado: + + + Test + Teste + + + Import... + Importar... + + + Export... + Exportar... + + + Rename filter + Renomear filtro + + + Remove filter + Remover filtro + + + Add filter + Adicionar filtro + + + + FeedDownloaderDlg + + New filter + Novo filtro + + + Please choose a name for this filter + Por favor escolha um nome para este filtro + + + Filter name: + Nome do filtro: + + + Invalid filter name + Nome inválido para o filtro + + + The filter name cannot be left empty. + O nome do filtro não pode ser vazio. + + + This filter name is already in use. + Este nome de filtro já está sendo usado. + + + Filter testing error + Erro ao testar o filtro + + + Please specify a test torrent name. + Por favor especifique um nome para o torrent. + + + matches + assemelha + + + does not match + não assemelha + + + Select file to import + Selecione arquivo a importar + + + Filters Files + Arquivos de filtro + + + Import successful + Importado com sucesso + + + Filters import was successful. + Filtros importados com sucesso. + + + Import failure + Falha ao importar + + + Filters could not be imported due to an I/O error. + Filtros não podem ser importados por um erro de entrada e saída. + + + Select destination file + Seleciona arquivo de destino + + + Overwriting confirmation + Confirma sobescrever + + + Are you sure you want to overwrite existing file? + Tem certeza que deseja sobescrever o arquivo existente ? + + + Export successful + Exportado com sucesso + + + Filters export was successful. + A exportação foi executada com sucesso. + + + Export failure + Falha na exportação + + + Filters could not be exported due to an I/O error. + Os filtros não puderam ser exportados por um erro de entrada e saída. + + + + FeedList + + Unread + Não lido + + + + FilterParserThread + + I/O Error + Input/Output Error + Erro de entrada e saída + + + Couldn't open %1 in read mode. + Não posso abrir %1 no modo de leitura. + + + %1 is not a valid PeerGuardian P2B file. + %1 não é um arquivo P2B válido de PeerGuardian. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Concluído + + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeds / Leechers + Seeds / Leechers + + + Connected peers + Peers conectados + + + Progress + i.e: % downloaded + Progresso + + + DL Speed + i.e: Download speed + Velocidade de download + + + UP Speed + i.e: Upload speed + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Estado + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Concluído + + + None + i.e: No error message + Nenhum + + + Ratio + Taxa + + + Leechers + i.e: full/partial sources + Compartilhadores parciais + + + Total uploaded + i.e: Total amount of uploaded data + Total uploaded + +ex.: Quantidade total de dados transferidos + + + Hide or Show Column + Esconder ou mostrar coluna + + + Incomplete torrent in seeding list + Torrent incompleto na lista de compartilhamento + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Parece que o estado do torrent '%1' foi mudado de 'compartilhando' para 'baixando'. Deseja movê-lo de volta para lista de download? (Ou então este torrent será simplesmente removido) + + + Priority + Prioridade + + + + GUI + + Open Torrent Files + Abrir Arquivos Torrent + + + Unknown + Desconhecido + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um torrent. + + + Are you sure you want to delete all files in download list? + Tem certeza que deseja apagar todos os arquivos na lista de downloads? + + + &Yes + &Sim + + + &No + &Não + + + Are you sure you want to delete the selected item(s) in download list? + Tem certeza que deseja apagar o(s) arquivo(s) selecionado(s) na lista de downloads? + + + paused + pausado + + + started + iniciado + + + Finished + Concluído + + + Checking... + Checando... + + + Connecting... + Conectando... + + + Downloading... + Baixando... + + + Download list cleared. + Lista de downloads limpa. + + + All Downloads Paused. + Todos os downloads pausados. + + + All Downloads Resumed. + Todos os downloads reiniciados. + + + DL Speed: + Velocidade de DL: + + + started. + iniciado. + + + UP Speed: + Velocidade de UP: + + + Couldn't create the directory: + Não pode criar o diretório: + + + Torrent Files + Arquivos Torrent + + + already in download list. + <file> already in download list. + já está na lista de downloads. + + + added to download list. + adicionado à lista de downloads. + + + resumed. (fast resume) + reiniciado. (reinicialização rápida) + + + Unable to decode torrent file: + Incapaz de decodificar o arquivo torrent: + + + removed. + <file> removed. + removido. + + + paused. + <file> paused. + pausado. + + + resumed. + <file> resumed. + reiniciado. + + + Listening on port: + Escutando na escuta: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Tem certeza? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Velocidade de Download: + + + <b>Connection Status:</b><br>Online + <b>Status da conexão:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Status da conexão:</b><br>Firewall ativado?<br><i>Não foi possível estabelecer uma conexão...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Status da conexão:</b><br/>Offline<br/><i>Peers não encontrados...</i> + + + has finished downloading. + download finalizado. + + + Couldn't listen on any of the given ports. + Não foi possível escutar pelas portas dadas. + + + None + Nenhum + + + Empty search pattern + Padrão de busca vazio + + + Please type a search pattern first + Por favor digite um padrão de busca primeiro + + + No seach engine selected + Nenhum mecanismo de busca selecionado + + + You must select at least one search engine. + Você deve selecionar pelo menos um mecanismo de busca. + + + Searching... + Buscando... + + + Could not create search plugin. + Não foi possível criar plugin de busca. + + + Stopped + Parado + + + Torrent file URL + URL do arquivo torrent + + + Torrent file URL: + URL do arquivo torrent: + + + Are you sure you want to quit? -- qBittorrent + Tem certeza que deseja sair? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Tem certeza que deseja fechar o qBittorrent? + + + Timed out + Tempo finalizado + + + Error during search... + Erro durante a busca... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Parado + + + Search is finished + Busca finalizada + + + An error occured during search... + Um erro ocorreu durante a busca... + + + Search aborted + Busca abortada + + + Search returned no results + A busca não retornou resultados + + + Search is Finished + Busca finalizada + + + Search plugin update -- qBittorrent + Atualização do plugin de busca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin de busca pode ser atualizado, deseja atualizá-lo? + +Registro de mudanças: + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + Your search plugin is already up to date. + Seu plugin de busca já está atualizado. + + + Results + Resultados + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Estado + + + ETA + ETA + + + Leechers (People that have parts of the files) + Leechers (Pessoas que têm partes de arquivos) + + + Search engine + Mecanismo de busca + + + Stalled + state of a torrent whose DL Speed is 0 + Parado + + + Paused + Pausado + + + Preview process already running + Processo de pré-visualização já está rodando + + + There is already another preview process running. +Please close the other one first. + Há um outro processo de pré-visualização rodando. +Por favor feche o outro primeiro. + + + Downloading + Example: Downloading www.example.com/test.torrent + Baixando + + + Transfers + Transferências + + + Download finished + Download finalizado + + + has finished downloading. + <filename> has finished downloading. + download finalizado. + + + Search Engine + Mecanismo de Busca + + + Are you sure you want to quit qBittorrent? + Você tem certeza que quer sair do qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Você tem certeza que quer deletar o(s) arquivo(s) selecionado(s) da lista de download e do seu disco rígido? + + + I/O Error + Erro de Entrada/Saída + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Estado da conexão: + + + Offline + Offline + + + No peers found... + Peers não encontrados... + + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Progress + i.e: % downloaded + Progresso + + + DL Speed + i.e: Download speed + Velocidade de download + + + UP Speed + i.e: Upload speed + Velocidade de Upload + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 iniciado. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Velocidade de download: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Velocidade de Upload: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Concluído + + + Checking... + i.e: Checking already downloaded parts... + Checando... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Parado + + + Are you sure you want to quit? + Você tem certeza que quer sair? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' foi deletado. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + None + i.e: No error message + Nenhum + + + Listening on port: %1 + e.g: Listening on port: 1666 + Escutando a porta: %1 + + + All downloads were paused. + Todos os downloads pausados. + + + '%1' paused. + xxx.avi paused. + '%1' pausado. + + + Connecting... + i.e: Connecting to the tracker... + Conectando... + + + All downloads were resumed. + Todos os downloads foram resumidos. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' resumido. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 download finalizado. + + + I/O Error + i.e: Input/Output Error + Erro de Entrada/Saída + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Ocorreu um erro quando tentava ler ou escrever %1. Provavelmente o seu disco está cheio, o download foi pausado + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Ocorreu um erro (disco cheio?), '%1' pausado. + + + Connection Status: + Estado da conexão: + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Sob firewall? + + + No incoming connections... + Sem conexão... + + + No search engine selected + Nenhum mecanismo de busca selecionado + + + Search plugin update + Atualização de plugin de busca + + + Search has finished + Busca finalizada + + + Results + i.e: Search results + Resultados + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Ocorreu um erro (disco cheio?), '%1' pausado. + + + Search + Busca + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Erro de I/O no torrent %1. +Motivo: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent escuta a porta: %1 + + + DHT support [ON], port: %1 + Suporte DHT [Ligado], porta: %1 + + + DHT support [OFF] + Suporte DHT [Desligado] + + + PeX support [ON] + Suporte PeX [Ligado] + + + PeX support [OFF] + Suporte PeX [Desligado] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + A lista de download não está vazia. +Deseja mesmo sair do qBittorrent? + + + Downloads + Downloads + + + Are you sure you want to delete the selected item(s) in finished list? + Quer mesmo deletar os ítems selecionados na lista de finalizados? + + + UPnP support [ON] + Suporte UPnP [Ligado] + + + Be careful, sharing copyrighted material without permission is against the law. + Esteja ciente, compartilhar material protejido sem permissão é contra a lei. + + + Encryption support [ON] + Suporte a encriptação [Ligado] + + + Encryption support [FORCED] + Suporte a encriptação [FORÇADO] + + + Encryption support [OFF] + Suporte a encriptação [Desligado] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado</i> + + + Ratio + Taxa + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Erro no download da URL + + + Couldn't download file at url: %1, reason: %2. + Não pude baixar arquivo em: %1, motivo: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Quer mesmo deletar o(s) arquivo(s) selecionado(s) da lista e do seu HD ? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Quer mesmo deletar o(s) arquivo(s) selecionado(s) da lista finalizada e do seu HD ? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' foi removido permanentemente. + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent está limitado a porta: TCP/%1 + + + UPnP support [OFF] + Suporte UPnP [desligado] + + + NAT-PMP support [ON] + Suporte NAT-PMP [ligado] + + + NAT-PMP support [OFF] + Suporte NAT-PMP [desligado] + + + DHT support [ON], port: UDP/%1 + Suporte DHT [ON], porta: UDP/%1 + + + Local Peer Discovery [ON] + Peer discovery [ligado] + + + Local Peer Discovery support [OFF] + Peer discovery [desligado] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' foi removido sua taxa atingiu o valor máximo que você configurou. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Down: %2Kb/s, Up: %3kb/s) + + + DL: %1 KiB/s + DL: %1 Kbps + + + UP: %1 KiB/s + UP: %1 Kpbs + + + Ratio: %1 + Taxa: %1 + + + DHT: %1 nodes + DHT: %1 nos + + + No direct connections. This may indicate network configuration problems. + Sem conexões diretas. Talvez tenha algo errado em sua configuração. + + + Uploads + Uploads + + + Options were saved successfully. + Opções salvas com sucesso. + + + + MainWindow + + Log: + Registro: + + + Total DL Speed: + Velocidade total de Download: + + + Total UP Speed: + Velocidade total de Upload: + + + Name + Nome + + + Size + Tamanho + + + % DL + % Download + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Estado + + + ETA + ETA + + + &Options + &Opções + + + &Edit + &Editar + + + &File + &Arquivo + + + &Help + &Ajuda + + + Open + Abrir + + + Exit + Sair + + + Preferences + Preferências + + + About + Sobre + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Pause All + Pausar todos + + + Start All + Iniciar todos + + + Documentation + Documentação + + + Delete All + Apagar todos + + + Torrent Properties + Propriedades do Torrent + + + Connection Status + Estado da conexão + + + Downloads + Downloads + + + Search + Busca + + + Search Pattern: + Padrão de busca: + + + Status: + Estado: + + + Stopped + Parado + + + Search Engines + Mecanismos de Busca + + + Results: + Resultados: + + + Stop + Parar + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Mecanismo de Busca + + + Download from URL + Baixar da URL + + + Download + Download + + + Clear + Limpar + + + KiB/s + KiB/s + + + Create torrent + Criar torrent + + + Ratio: + Taxa: + + + Update search plugin + Atualizar plugin de busca + + + Session ratio: + Taxa da sessão: + + + Transfers + Transferências + + + Preview file + Arquivo de pré-visualização + + + Clear log + Limpar log + + + Delete Permanently + Apagar permanentemente + + + Visit website + Visitar site + + + Report a bug + Reportar um bug + + + Set upload limit + Setar limite de upload + + + Set download limit + Setar limite de download + + + Log + Log + + + IP filter + Filtro IP + + + Set global download limit + Setar limite global de download + + + Set global upload limit + Setar limite global de upload + + + Options + Opções + + + Decrease priority + Diminuir prioridade + + + Increase priority + Aumentar prioridade + + + Console + Console + + + + PropListDelegate + + False + Falso + + + True + Verdadeiro + + + Ignored + Ignorado + + + Normal + Normal (priority) + Normal + + + High + High (priority) + Alta + + + Maximum + Maximum (priority) + Máxima + + + + QTextEdit + + Clear + Limpar + + + + RSS + + Search + Busca + + + Delete + Apagar + + + Rename + Renomear + + + Refresh + Atualizar + + + Create + Criar + + + Delete selected streams + Deletar streams selecionadas + + + Refresh RSS streams + Atualizar RSS streams + + + Add a new RSS stream + Adicionar um novo stream de RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Info:</b> <i>(clique-duplo para abrir o link no seu browser)</i> + + + Add RSS stream + Adicionar stream RSS + + + Refresh all streams + Atualizar todos streams + + + RSS streams: + streams RSS: + + + 2 + 2 + + + Mark all as read + Marcar todos como lido + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(duplo-clique para baixar)</span></p></body></html> + + + Download torrent + Baixar torrent + + + Open news URL + Abrir novas URL + + + Copy feed URL + Copiar URL do feed + + + RSS feed downloader + Baixador de RSS feed + + + New subscription + Nova inscrição + + + Mark items read + Marcar ítems lidos + + + Update all + Atualizar todos + + + Update all feeds + Atualizar todos feeds + + + RSS feeds + RSS feeds + + + Update + Atualiza + + + New folder + Nova pasta + + + 1 + 1 + + + Feed URL + URL do feed + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Digite uma url de stream rss + + + Stream URL: + Stream URL: + + + Please choose a new name for this stream + Escolha um novo nome para esse stream + + + New stream name: + Novo nome do stream: + + + Are you sure? -- qBittorrent + Tem certeza? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Quer mesmo deletar este stream da lista ? + + + &Yes + &Sim + + + &No + &Não + + + Are you sure you want to delete this stream from the list? + Quer mesmo deletar este stream da lista ? + + + Description: + Descrição: + + + url: + url: + + + Last refresh: + Última atualização: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Este rss feed já está na lista. + + + Date: + Data: + + + Author: + Autor: + + + Please choose a folder name + Por favor escolha um nome de pasta + + + Folder name: + Nome da pasta: + + + New folder + Nova pasta + + + Are you sure you want to delete these elements from the list? + Está certo de que deseja deletar esses elementos da lista ? + + + Are you sure you want to delete this element from the list? + Deseja realmente deletar esse ítem da lista? + + + Please choose a new name for this RSS feed + Por favor escolha um novo nome para este feed RSS + + + New feed name: + Novo nome do feed: + + + Name already in use + Novo já está em uso + + + This name is already used by another item, please choose another one. + Este nome já está sendo usado por outro ítem, por favor escolha outro. + + + Overwrite attempt + Atenção sobescrevendo + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Você não pode sobescrever o ítem %1. + + + Unread + Não lido + + + + RssItem + + No description available + Nenhuma descrição disponível + + + + RssStream + + %1 ago + 10min ago + %1 atrás + + + Never + Nunca + + + Automatically downloading %1 torrent from %2 RSS feed... + Baixando automaticamente o torrent %1 do RSS feed %2... + + + + SearchCategories + + All categories + Todas categorias + + + Movies + Filmes + + + TV shows + Shows de TV + + + Music + Música + + + Games + Jogos + + + Anime + Anime + + + Software + Programa + + + Pictures + Imagens + + + Books + Livros + + + + SearchEngine + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeders + i.e: Number of full sources + Semeadores + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Mecanismo de busca + + + Empty search pattern + Padrão de busca vazio + + + Please type a search pattern first + Por favor digite um padrão de busca primeiro + + + No search engine selected + Nenhum mecanismo de busca selecionado + + + You must select at least one search engine. + Você deve selecionar pelo menos um mecanismo de busca. + + + Results + Resultados + + + Searching... + Buscando... + + + Search plugin update -- qBittorrent + Atualização do plugin de busca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin de busca pode ser atualizado, deseja atualizá-lo? + +Log de mudanças: + + + &Yes + &Sim + + + &No + &Não + + + Search plugin update + Atualização de plugin de busca + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + Your search plugin is already up to date. + Seu plugin de busca já está atualizado. + + + Cut + Corta + + + Copy + Copia + + + Paste + Cola + + + Clear field + Limpa campo + + + Clear completion history + Limpar lista dos completados + + + Search Engine + Mecanismo de Busca + + + Search has finished + Busca finalizada + + + An error occured during search... + Um erro ocorreu durante a busca... + + + Search aborted + Busca abortada + + + Search returned no results + A busca não retornou resultados + + + Results + i.e: Search results + Resultados + + + Search plugin download error + Erro no download do plugin de busca + + + Couldn't download search plugin update at url: %1, reason: %2. + Não pude baixar a atualização do plugin de busca na url: %1, motivo: %2. + + + Unknown + Desconhecido + + + + SearchTab + + Name + i.e: file name + Nome + + + Size + i.e: file size + Tamanho + + + Seeders + i.e: Number of full sources + Compartilhadores completos + + + Leechers + i.e: Number of partial sources + Compartilhadores parciais + + + Search engine + Mecanismo de busca + + + + SobreDlg + + About qBittorrent + Sobre qBittorrent + + + About + Sobre + + + Author + Autor + + + Name: + Nome: + + + Country: + País: + + + E-mail: + E-mail: + + + Home page: + Site: + + + Christophe Dumez + Christophe Dumez + + + France + França + + + Thanks To + Agradecimentos + + + Translation + Tradução + + + License + Licença + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dcrhis.eu + + + Birthday: + Aniversário: + + + Occupation: + Profissão: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Estudante em Ciências da Computação + + + + TrackersAdditionDlg + + Trackers addition dialog + Diálogo de adição de Trackers + + + List of trackers to add (one per line): + Lista Trackers para adicionar (um por linha): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Contate-me se você gostaria de traduzir o qBittorrent para seu idioma. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Gostaria de agradecer às seguintes pessoas por voluntariamente terem traduzido o qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Gostaria de agradecer ao sourceforge.net pela hospedagem do projeto.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Gostaria também de agradecer a Jeffery Fernandez (developer@jefferyfernandez.id.au), nosso RPM packager, pelo seu grande trabalho.</li></ul> + + + Preview impossible + Impossível a pré-visualização + + + Sorry, we can't preview this file + Sinto muito, mas não podemos ter uma pré-visualização desse arquivo + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + No URL entered + Nenhuma URL inserida + + + Please type at least one URL. + Por favor digite uma URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contate-me se você deseja traduzir o qBittorrent no seu idioma. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Gostaria de agradecer às seguintes pessoas por voluntariamente terem traduzido o qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Por favor contate-me se você deseja traduzir o qBittorrent no seu idioma. + + + + addTorrentDialog + + Torrent addition dialog + Dialogo de adicionar torrent + + + Save path: + Caminho de salvamento: + + + ... + ... + + + Torrent content: + Conteúdo do torrent: + + + File name + Nome do arquivo + + + File size + Tamanho do arquivo + + + Selected + Selecionado + + + Download in correct order (slower but good for previewing) + Baixar em ordem (lento mas bom para pré-visualizar) + + + Add to download list in paused state + Adicionar a lista de download em pausa + + + Add + Adicionar + + + Cancel + Cancelar + + + Unselect + Deselecionar + + + Select + Selecionar + + + Ignored + Ignorado + + + Normal + Normal + + + High + Alto + + + Maximum + Máximo + + + Collapse all + Fechar todos + + + Expand all + Expandir todos + + + Torrent size: + Tamanho do torrent: + + + Unknown + Desconhecido + + + Free disk space: + Espaço livre em disco: + + + Download in sequential order (slower but good for previewing) + Baixar em ordem de sequência (mais lento porém melhor para visualizar) + + + + authentication + + Tracker authentication + Autenticação de tracker + + + Tracker: + Tracker: + + + Login + Login + + + Username: + Usuário: + + + Password: + Senha: + + + Log in + Logar + + + Cancel + Cancelar + + + + bandwidth_dlg + + Bandwidth allocation + Alocação de banda + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 atingiu a taxa máxima que você configurou. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' foi removido permanentemente. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' foi deletado. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' pausado. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' resumido. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' já está na lista de download. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' continuando. (continue rápido) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adicionado a lista de download. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Incapaz de decodificar arquivo torrent: '%1' + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>foi bloqueado pelo seu filtro de IP</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>foi banido por corromper partes</i> + + + Couldn't listen on any of the given ports. + Não foi possível escutar nenhuma das portas informadas. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Falha no mapeamento de porta, mensagem: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Portas mapeadas com sucesso, mensagem: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Resumo rápido rejeitado para o torrent %1, tente novamente... + + + Url seed lookup failed for url: %1, message: %2 + Url falhou para: %1, mensagem: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + baixando '%1', por favor espere... + + + '%1' is not a valid magnet URI. + '%1' não é um URI magnético válido. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Download recursivo do arquivo %1 embutido no torrent %2 + + + Unable to decode %1 torrent file. + Impossível decodificar %1 do arquivo torrent. + + + + createTorrentDialog + + Create Torrent file + Criar arquivo torrent + + + Destination torrent file: + Arquivo torrent de destino: + + + Input file or directory: + Entre com arquivo ou diretório: + + + Comment: + Comentário: + + + ... + ... + + + Create + Criar + + + Cancel + Cancelar + + + Announce url (Tracker): + Anunciar url (Rastreador): + + + Directory + Diretório + + + Torrent Creation Tool + Ferramenta de Criação de Torrent + + + <center>Destination torrent file:</center> + <center>Arquivo torrent de destino:</center> + + + <center>Input file or directory:</center> + <center>Arquivo ou diretório:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Divulgar url:<br>(Um por linha)</center> + + + <center>Comment:</center> + <center>Comentário:</center> + + + Torrent file creation + Criando arquivo Torrent + + + Input files or directories: + Insira arquivos ou diretórios: + + + Announce urls (trackers): + Urls (trackers): + + + Comment (optional): + Comentário (opcional): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privado (Não pode ser distribuido na rede trackerless / se DHT habilitado) + + + Web seeds urls (optional): + Urls de compartilhadores web (opcional): + + + File or folder to add to the torrent: + Arquivo ou pasta para adicionar ao torrent: + + + Add a file + Adicionar um arquivo + + + Add a folder + Adicionar uma pasta + + + Piece size: + Tamanho: + + + 32 KiB + 32kb + + + 64 KiB + 64kb + + + 128 KiB + 128kb + + + 256 KiB + 256kb + + + 512 KiB + 512kb + + + 1 MiB + 1mb + + + 2 MiB + 2mb + + + 4 MiB + 4mb + + + Private (won't be distributed on DHT network if enabled) + Privado (não distribuir em DHT se habilitado) + + + Start seeding after creation + Iniciar compartilhamento depois de criar + + + Create and save... + Criar e salvar... + + + Progress: + Progresso: + + + Add file + Adicionar arquivo + + + Add folder + Adicionar pasta + + + + createtorrent + + Select destination torrent file + Selecione o arquivo torrent de destino + + + Torrent Files + Arquivos Torrent + + + Select input directory or file + Selecione o diretório ou arquivo de entrada + + + No destination path set + Nenhum caminho de destino selecionado + + + Please type a destination path first + Digite primeiro um caminho de destino + + + No input path set + Nenhum caminho de entrada selecionado + + + Please type an input path first + Digite primeiro um caminho de entrada + + + Input path does not exist + Caminho de entrada não existe + + + Please type a correct input path first + Digite primeiro um caminho de entrada correto + + + Torrent creation + Criação de torrent + + + Torrent was created successfully: + Torrent foi criado com sucesso: + + + Please type a valid input path first + Por favor insira um caminho válido primeiro + + + Select a folder to add to the torrent + Selecione uma pasta para adicionar ao torrent + + + Select files to add to the torrent + Selecione arquivos para adicionar ao torrent + + + Please type an announce URL + Digite uma url anunciada + + + Torrent creation was unsuccessful, reason: %1 + A criação do torrent não foi possível, motivo: %1 + + + Announce URL: + Tracker URL + Url anunciada: + + + Please type a web seed url + Digite uma url de compartilhador web + + + Web seed URL: + Url de compartilhador web: + + + Select a file to add to the torrent + Selecione um arquivo para adicionar ao torrent + + + No tracker path set + Nenhum tracker setado + + + Please set at least one tracker + Por favor, adicione ao menos um tracker + + + Created torrent file is invalid. It won't be added to download list. + Torrent criado é inválido. Não será adicionado a lista de download. + + + + downloadFromURL + + Download Torrents from URLs + Baixar torrents de URLs + + + Only one URL per line + Somente uma URL por linha + + + Download + Baixar + + + Cancel + Cancelar + + + Download from urls + Baixar de URLs + + + No URL entered + Nenhuma URL inserida + + + Please type at least one URL. + Por favor digite uma URL. + + + + downloading + + Search + Busca + + + Total DL Speed: + Velocidade total de Download: + + + KiB/s + Kb/s + + + Session ratio: + Taxa da sessão: + + + Total UP Speed: + Velocidade total de Upload: + + + Log + Log + + + IP filter + Filtro IP + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Clear + Limpar + + + Preview file + Arquivo de pré-visualização + + + Set upload limit + Setar limite de upload + + + Set download limit + Setar limite de download + + + Delete Permanently + Apagar permanentemente + + + Torrent Properties + Propriedades do Torrent + + + Open destination folder + Abrir pasta de destino + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + DLSpeed + Velocidade de download + + + UpSpeed + Velocidade de upload + + + Seeds/Leechs + Compartilhadores + + + Ratio + Taxa + + + ETA + ETA + + + Buy it + Compre isso + + + Priority + Prioridade + + + Increase priority + Aumentar prioridade + + + Decrease priority + Diminuir prioridade + + + Force recheck + Forçar re-checagem + + + Copy magnet link + Copiar link magnético + + + + engineSelect + + Search plugins + Plugins de busca + + + Installed search engines: + Plugins de busca instalados: + + + Name + Nome + + + Url + Url + + + Enabled + Habilitado + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Você pode encontrar novos plugins de busca aqui: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Instalar um novo + + + Check for updates + Verificar atualizações + + + Close + Fechar + + + Enable + Habilitar + + + Disable + Desabilitar + + + Uninstall + Desinstalar + + + + engineSelectDlg + + True + Verdadeiro + + + False + Falso + + + Uninstall warning + Aviso de desinstalação + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Muitos plugins não podem ser desinstalados por serem padrão do qBittorrent. + Apenas aqueles que você instalou podem ser desinstalados. +Portanto os plugins foram desabilitados. + + + Uninstall success + Desinstalado com sucesso + + + Select search plugins + Selecionar plugins de busca + + + qBittorrent search plugins + Plugins de busca qBittorrent + + + Search plugin install + Instalação de plugin de busca + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Uma versão mais recente de plugin de busca %1 já está instalado. + + + Search plugin update + Atualização de plugin de busca + + + Sorry, update server is temporarily unavailable. + Desculpe, servidor de atualizações está temporariamente indisponível. + + + All your plugins are already up to date. + Todos os plugins já estão atuais. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 esse aí não pôde ser atualizado, vai ficar o véio. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Plugin de busca %1 não pode ser instalado. + + + All selected plugins were uninstalled successfully + Plugins selecionados desinstalados com sucesso + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Plugin de busca %1 atualizado com sucesso. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Plugin de busca %1 instalado com sucesso. + + + Search engine plugin archive could not be read. + Arquivo de plugin de busca não pode ser lido. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Sinto muito mas a instalação do plugin de busca %1 falhou. + + + New search engine plugin URL + Url de novo plugin de busca + + + URL: + Url: + + + Yes + Sim + + + No + Não + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + Kib + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + Unknown + Desconhecido + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Desconhecido + + + < 1m + < 1 minute + < 1 minuto + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + Opções salvas com sucesso! + + + Choose Scan Directory + Escolha diretório para varrer + + + Choose save Directory + Escolha diretório onde salvar + + + Choose ipfilter.dat file + Escolha arquivo ipfilter.dat + + + I/O Error + Erro de Entrada ou Saída + + + Couldn't open: + Impossível abrir: + + + in read mode. + em modo de leitura. + + + Invalid Line + Linha inválida + + + Line + Linha + + + is malformed. + está corrompido. + + + Range Start IP + IP do começo da escala + + + Start IP: + Iniciar IP: + + + Incorrect IP + IP incorreto + + + This IP is incorrect. + Este IP está incorreto. + + + Range End IP + IP do fim da escala + + + End IP: + Finalizar IP: + + + IP Range Comment + Comentário Range de IP + + + Comment: + Comentário: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + Selecione seu programa preferido para pré-visualizar + + + Invalid IP + IP inválido + + + This IP is invalid. + Este IP é inválido. + + + Options were saved successfully. + Opções salvas com sucesso. + + + Choose scan directory + Selecione diretório para varredura + + + Choose an ipfilter.dat file + Selecione um arquivo ipfilter.dat + + + Choose a save directory + Selecione um diretório de salvamento + + + I/O Error + Input/Output Error + Erro de Entrada/Saída + + + Couldn't open %1 in read mode. + Não posso abrir %1 no modo de leitura. + + + Choose an ip filter file + Escolha um arquivo de filtro de ip + + + Filters + Filtros + + + + pluginSourceDlg + + Plugin source + Fonte do plugin + + + Search plugin source: + Busca de plugin de busca: + + + Local file + Arquivo local + + + Web link + Link da net + + + + preview + + Preview selection + Seleção de pré-visualização + + + File preview + Pré-visualização de arquivo + + + The following files support previewing, <br>please select one of them: + Os seguintes arquivos suportam pré-visualização, <br>por favor selecione um deles: + + + Preview + Pré-visualização + + + Cancel + Cancelar + + + + previewSelect + + Preview impossible + Pré-visualização impossível + + + Sorry, we can't preview this file + Arquivo sem possível pré-visualização + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + + properties + + Torrent Properties + Propriedades do Torrent + + + Main Infos + Informações principais + + + File Name + Nome do Arquivo + + + Current Session + Sessão atual + + + Total Uploaded: + Total Enviado: + + + Total Downloaded: + Total Baixado: + + + Download state: + Estado do download: + + + Current Tracker: + Rastreador atual: + + + Number of Peers: + Número de Peers: + + + Torrent Content + Conteúdo do Torrent + + + OK + OK + + + Total Failed: + Falharam: + + + Finished + Concluído + + + Queued for checking + Na fila para checagem + + + Checking files + Checando arquivos + + + Connecting to tracker + Conectando-se ao rastreador + + + Downloading Metadata + Baixando Metadados + + + Downloading + Baixando + + + Seeding + Enviando + + + Allocating + Alocando + + + Unknown + Desconhecido + + + Complete: + Completo: + + + Partial: + Parcial: + + + Files contained in current torrent: + Arquivos contidos no torrent atual: + + + Size + Tamanho + + + Selected + Selecionado + + + Unselect + Desfazer seleção + + + Select + Selecionar + + + You can select here precisely which files you want to download in current torrent. + Você pode selecionar aqui precisamente quais arquivos você quer baixar no torrent atual. + + + False + Falso + + + True + Verdadeiro + + + Tracker + Rastreador + + + Trackers: + Rastreadores: + + + None - Unreachable? + Nenhum - Inatingível? + + + Errors: + Erros: + + + Progress + Progresso + + + Main infos + Informações principais + + + Current tracker: + Rastreador atual: + + + Total uploaded: + Total de Upload: + + + Main info + Início da informação + + + Torrent information + Informação do Torrent + + + Total downloaded: + Total baixado: + + + Total failed: + Total falhado: + + + Torrent content + Conteúdo torrent + + + Options + Opções + + + Download in correct order (slower but good for previewing) + Baixar em ordem correta (lento mas bom para pré-visualizar) + + + Share Ratio: + Taxa de compartilhamento: + + + Seeders: + Enviando: + + + Leechers: + Leechers: + + + Save path: + Caminho de salvamento: + + + Torrent infos + Infos do Torrent + + + Creator: + Criador: + + + Torrent hash: + Mistura do Torrent: + + + Comment: + Comentário: + + + Current session + Sessão atual + + + Share ratio: + Taxa de Compartilhamento: + + + Trackers + Rastreadores + + + New tracker + Novo rastreador + + + New tracker url: + Novo url de rastreador: + + + Priorities: + Prioridades: + + + Normal: normal priority. Download order is dependent on availability + Normal: prioridade normal. Ordem de download é dependente da disponibilidade + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Alta: Maior que a prioridade normal. As partes são preferidas sobre partes com a mesma disponibilidade, mas não em excesso das com disponibilidade mais baixa + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Máxima: prioridade máxima, disponibilidade é desconsiderada, a parte é preferida mais que outra parte com prioridade baixa + + + File name + Nome do arquivo + + + Priority + Prioridade + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Lista de rastreadores não pode estar vazia. + + + Ignored: file is not downloaded at all + Ignorado: arquivo não foi baixado completamente + + + Ignored + Ignorado + + + Normal + Normal + + + Maximum + Máxima + + + High + Alta + + + Url seeds + Url de compartilhadores + + + New url seed: + Nova url de compartilhador: + + + This url seed is already in the list. + Essa url de compartilhador já está na lista. + + + Hard-coded url seeds cannot be deleted. + Url de compartilhador no código-fonte não pode ser deletada. + + + None + i.e: No error message + Nenhum + + + New url seed + New HTTP source + Nova url de compartilhador + + + The following url seeds are available for this torrent: + As urls a seguir estão disponíveis para este torrent: + + + Priorities error + Erro de prioridades + + + Error, you can't filter all the files in a torrent. + Erro, você não pode filtrar todos arquivos no torrent. + + + Downloaded pieces + Partes baixadas + + + Collapse all + Fechar todos + + + Expand all + Expandir todos + + + ... + ... + + + Choose save path + Escolha um caminho de salvamento + + + Save path creation error + Erro ao criar caminho de salvamento + + + Could not create the save path + Não foi possível criar caminho de salvamento + + + + search_engine + + Search + Busca + + + Search Engines + Mecanismos de Busca + + + Search Pattern: + Padrão de busca: + + + Stop + Parar + + + Status: + Estado: + + + Stopped + Parado + + + Results: + Resultados: + + + Download + Download + + + Clear + Limpar + + + Update search plugin + Atualizar plugin de busca + + + Search engines... + Máquinas de busca... + + + Close tab + Fechar aba + + + + seeding + + Search + Busca + + + The following torrents are finished and shared: + Os torrents a seguir terminaram e compartilham: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Info:</u> É importante que você mantenha compartilhando seus torrents terminados para o bem estar da rede. + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Delete Permanently + Apagar permanentemente + + + Torrent Properties + Propriedades do Torrent + + + Preview file + Arquivo de pré-visualização + + + Set upload limit + Setar limite de upload + + + Open destination folder + Abrir pasta de destino + + + Name + Nome + + + Size + Tamanho + + + Upload Speed + Velocidade de upload + + + Connected peers + Peers conectados + + + Seeds / Leechers + Seeds / Leechers + + + Leechers + Compartilhadores + + + Ratio + Taxa + + + Buy it + Compre isso + + + Total uploaded + Total uploaded + + + Priority + Prioridade + + + Force recheck + Forçar re-checagem + + + Copy magnet link + Copiar link magnético + + + + subDownloadThread + + Host is unreachable + O host é inalcançável + + + File was not found (404) + Arquivo não encontrado (404) + + + Connection was denied + Conexão foi negada + + + Url is invalid + Url é inválida + + + Connection forbidden (403) + Conexão proibida (403) + + + Connection was not authorized (401) + Conexão não foi autorizada (401) + + + Content has moved (301) + Conteúdo foi movido (301) + + + Connection failure + Conexão falhou + + + Connection was timed out + Conexão esgotou o tempo + + + Incorrect network interface + Relação da rede incorreta + + + Unknown error + Erro desconhecido + + + Could not resolve proxy + Não pude resolver proxy + + + I/O Error + Erro de entrada e saída + + + + torrentAdditionDialog + + True + Verdadeiro + + + Unable to decode torrent file: + Incapaz de decodificar o arquivo torrent: + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um arquivo torrent. + + + Choose save path + Escolha um caminho de salvamento + + + False + Falso + + + Empty save path + Caminho de salvamento vazio + + + Please enter a save path + Por favor digite um caminho de salvamento + + + Save path creation error + Erro ao criar caminho de salvamento + + + Could not create the save path + Não foi possível criar caminho de salvamento + + + Invalid file selection + Seleção de arquivo inválida + + + You must select at least one file in the torrent + Você deve selecionar um arquivo no torrent + + + File name + Nome do arquivo + + + Size + Tamanho + + + Progress + Progresso + + + Priority + Prioridade + + + Unknown + Desconhecido + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + ex: (100MiB depois de baixar o torrent) + (%1 depois de baixar o torrent) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 mais é requerido para baixar) + + + diff --git a/src/lang/qbittorrent_ro.qm b/src/lang/qbittorrent_ro.qm new file mode 100644 index 0000000000000000000000000000000000000000..03db572648946ce7618e8d3512d52aebccabb009 GIT binary patch literal 68454 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 z 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 X$6(2OMNeql@L&O5$u3_nF@ygH2#?yc literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_ro.ts b/src/lang/qbittorrent_ro.ts new file mode 100644 index 000000000..82bc5f0ad --- /dev/null +++ b/src/lang/qbittorrent_ro.ts @@ -0,0 +1,4643 @@ + + + + + AboutDlg + + About qBittorrent + Despre qBittorrent + + + About + Despre + + + Author + Autor + + + Name: + Nume: + + + Country: + Ţara: + + + E-mail: + E-Mail: + + + Home page: + Pagina de acasă: + + + Christophe Dumez + Christophe Dumez + + + France + Franţa + + + Thanks To + Mulţumim pentru + + + Translation + Translare + + + License + Licensă + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Client pentru bittorrent pe baza la QT4 și libtorrent, programat în C++,<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + Ziua de naştere: + + + Occupation: + Ocupaţia: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Student in computer science + + + Thanks to + Mulţumesc lui + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">(new line) +<html><head><meta name="qrichtext" content="1" /><style type="text/css">(new line) +p, li { white-space: pre-wrap; }(new line) +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;">(new line) +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p>(new line) +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Limita de Upload: + + + Download limit: + Limita de Download: + + + Unlimited + Unlimited (bandwidth) + Nelimitat + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + Consola qBittorrent + + + General + General + + + Blocked IPs + IP-uri blocate + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opţiuni -- qBittorrent + + + Options + Opţiuni + + + Main + Principal + + + Save Path: + Calea de salvare: + + + Download Limit: + Limita de Download: + + + Upload Limit: + Limita de Upload: + + + Max Connects: + Numărul maxim de conectări: + + + Port range: + Domeniul portului: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Dezactivat + + + connections + conectări + + + Proxy + Proxy + + + Proxy Settings + Setările Proxy + + + Server IP: + IP-ul Serverului: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Portul: + + + Proxy server requires authentication + Serverul Proxy cere autentificare + + + Authentication + Autentificare + + + User Name: + Numele utilizatorului: + + + Password: + Parola: + + + Enable connection through a proxy server + Activarea conectării prin Proxy Server + + + OK + OK + + + Cancel + Anulare + + + Scanned Dir: + Directoriul Scanat: + + + Enable directory scan (auto add torrent files inside) + Activarea Scanarea Direcoriului(Automat adauga torrentele din directoriu) + + + Connection Settings + Setările conectării + + + Share ratio: + Raţia de Share: + + + 1 KB DL = + 1 KB DL= + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Activarea IP Filtrare + + + Filter Settings + Setările Filtrului + + + Start IP + IP de start + + + End IP + IP de oprire + + + Origin + Origine + + + Comment + Comentarii + + + Apply + Aplicare + + + IP Filter + Filtru IP + + + Add Range + Adaugă domeniu + + + Remove Range + Sterge domeniu + + + ipfilter.dat Path: + ipfilter.dat Cale: + + + Clear finished downloads on exit + Sgerge descarcările terminate la eşire + + + Ask for confirmation on exit + Intreabă confirmare la eşire + + + Go to systray when minimizing window + Ascunde in SysTray la minimizare + + + Misc + Diferite + + + Localization + Localizare + + + Language: + Limba: + + + Behaviour + Interfaţa + + + OSD + OSD + + + Always display OSD + Întotdeauna arata OSD + + + Display OSD only if window is minimized or iconified + Arata OSD numai cînd fereastra este minimizata sau iconificata + + + Never display OSD + Nici o data nu afiseaza OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB Up max. + + + DHT (Trackerless): + DHT(Tracker-uri): + + + Disable DHT (Trackerless) support + Anulează suport de DHT + + + Automatically clear finished downloads + Automat şterge descărcările finişate + + + Preview program + Program de preview + + + Audio/Video player: + Audio/Video player: + + + DHT configuration + Configurarea DHT + + + DHT port: + Portul DHT: + + + Language + Limba + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Notă:</b> Schimbările vor fi aplicate după restartarea qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Notă pentru translatori:</b> Dacă qBittorrent nu este tradus in limba dvs, <br/>şi dacă doriti să traduceţi in limba dvs,<br/>vă rog să mă contactaţi (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Arată dialogul de adăugare fiecaredată cînd adaug un torrent + + + Default save path + Calea de salvare + + + Systray Messages + Mesajele din systray + + + Always display systray messages + Întotdeauna arată mesajele din systray + + + Display systray messages only when window is hidden + Afişează mesajele din systray numai cînd fereastra este ascunsă + + + Never display systray messages + Niciodată nu afişa mesajele din systray + + + Disable DHT (Trackerless) + Dezactiveaza DHT + + + Disable Peer eXchange (PeX) + Dezactiveaza Peer eXchange (PeX) + + + Go to systray when closing main window + Trec in systray la inchiderea ferestrei + + + Connection + Conectare + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (trackerless) + + + Torrent addition + Adaugarea torrentului + + + Main window + Fereastra principala + + + Systray messages + Mesage din systray + + + Directory scan + Scanarea directoriului + + + Style (Look 'n Feel) + Stilul + + + Plastique style (KDE like) + Stil plastic (ca in KDE) + + + Cleanlooks style (GNOME like) + Stril cleanlooks (ca în GNOME) + + + Motif style (default Qt style on Unix systems) + Stil motif ( stil Qt pe alte UNIX sisteme) + + + CDE style (Common Desktop Environment like) + Stil CDE (Common Desktop Environment like) + + + MacOS style (MacOSX only) + Stil MacOS (disponibil numai pentru MacOSX) + + + Exit confirmation when the download list is not empty + Confirmare la eşire cînd lista de descărcare nu este vidă + + + Disable systray integration + Dezactiverea integrării in systray + + + WindowsXP style (Windows XP only) + Stil WindowsXP (numai pentru WindowsXP) + + + Server IP or url: + IP-ul Serverului sau URL: + + + Proxy type: + Tipul de proxy: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Conectări afectate + + + Use proxy for connections to trackers + Foloseşte proxy pentru conectare la tracker-i + + + Use proxy for connections to regular peers + Foloseşte proxy pentru conectare la peer-i + + + Use proxy for connections to web seeds + Foloseşte proxy la conectare cu web seeds + + + Use proxy for DHT messages + Foloseşte proxy pentru DHT mesage + + + Encryption + Criptare + + + Encryption state: + Starea codificării: + + + Enabled + Activată + + + Forced + Forţată + + + Disabled + Dezactivată + + + Preferences + Preferinţe + + + General + General + + + Network + Rețea + + + User interface settings + Setările interfaţei grafice + + + Visual style: + Stilul vizual: + + + Cleanlooks style (Gnome like) + Stilul Cleanlooks(ca în Gnome) + + + Motif style (Unix like) + Stilul Motif(ca în Unix) + + + Ask for confirmation on exit when download list is not empty + Întreabă confirmare la ieşire cînd lista de descărcare nu este vidă + + + Display current speed in title bar + Afişează viteza curentă în bara de titlu + + + System tray icon + Imagine în system tray + + + Disable system tray icon + Dezactivează imagine în system tray + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Închide în tray + + + Minimize to tray + Minimizează în tray + + + Show notification balloons in tray + Arată notificări în tray + + + Media player: + Media player: + + + Downloads + Descărcări + + + Put downloads in this folder: + Pune descărcările în acest dosar: + + + Pre-allocate all files + Pre alocă toate fişierele + + + When adding a torrent + Cînd adaugi un torrent + + + Display torrent content and some options + Afişează conţinutul torrentului şi unele opţiuni + + + Do not start download automatically + The torrent will be added to download list in pause state + Nu porni descărcarea automat + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Monitorizează directoriul + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Lista cu transferuri dublu-click +qBittorrent va monitoriza directoriul și va adăuga în lista de descărcare a torentelor din directoriu + + + Download list: + Lista de download: + + + Seeding list: + Lista de sedare: + + + Download folder: + Directoriul de download: + + + Temp folder: + Directoriul temporar: + + + Automatically download torrents present in this folder: + Descarcă automat torrentele prezente în acest dosar: + + + Listening port + Port-ul de ascultare + + + to + i.e: 1200 to 1300 + la + + + Enable UPnP port mapping + Activează UPnP mapare port + + + Enable NAT-PMP port mapping + Activează NAT-PMP mapare port + + + Global bandwidth limiting + Limită globală de bandwidth + + + Upload: + Încărcat: + + + Download: + Descărcat: + + + Bittorrent features + Facilitățile bittorrent + + + Use the same port for DHT and Bittorrent + Utilizează acelaș port pentru DHT și Bittorrent + + + Type: + Tipul: + + + (None) + (Nimic) + + + Proxy: + Proxy: + + + Username: + Numele de utilizator: + + + Bittorrent + Bittorrent + + + Connections limit + Limită de conectare + + + Global maximum number of connections: + Numărul global maxim de conectări: + + + Maximum number of connections per torrent: + Numărul maxim de conectări pentru torrent: + + + Maximum number of upload slots per torrent: + Numărul maxim de sloturi de încărcare pentru un torrent: + + + Additional Bittorrent features + Funcţii adiţionale + + + Enable DHT network (decentralized) + Activează reţeaua DHT(decentralizat) + + + Enable Peer eXchange (PeX) + Activează Peer eXchange(PeX) + + + Enable Local Peer Discovery + Activează căutarea locală de Peer-i + + + Encryption: + Codificare: + + + Share ratio settings + Setările de Share ratio + + + Desired ratio: + Desired ratio: + + + Filter file path: + Filtrează cale de fisiere: + + + transfer lists refresh interval: + Intervalul de reînnoire al litei de transferuri: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Intervalul de reînnoire al listei RSS: + + + minutes + minute + + + Maximum number of articles per feed: + Numărul maxim de articole pentru flux: + + + File system + Sistem de fişiere + + + Remove finished torrents when their ratio reaches: + Şterge torrent-urile finişate cînd ratio lor ajunge la: + + + System default + Predefinit de sistem + + + Start minimized + Starteaza minimizat + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Acţiunea la dubli click pe lista de transferuri + + + In download list: + Lista de descarcare: + + + Pause/Start torrent + Pauza/Pornire torrent + + + Open destination folder + Deschide directoriul destinaţie + + + Display torrent properties + Afişeaza proprietăţile torrentului + + + In seeding list: + În lista de sedare: + + + Folder scan interval: + Intervalul de scanare a directoriului: + + + seconds + secunde + + + Spoof Azureus to avoid ban (requires restart) + Spoof Azureus to avoid ban (requires restart) + + + Web UI + Web UI + + + Enable Web User Interface + Activeaza WebUI + + + HTTP Server + HTTP Server + + + Enable RSS support + Activeză suport de RSS + + + RSS settings + Setări RSS + + + Enable queueing system + Activeaza sistemul de cozi + + + Maximum active downloads: + Numărul maxim de descărcări active: + + + Torrent queueing + Cererea de torrente + + + Maximum active torrents: + Maximum torrente active: + + + Display top toolbar + Afișează bara de instrumente + + + Search engine proxy settings + Setările motorului de căutare prin proxy + + + Bittorrent proxy settings + Setările proxy pentru bittorrent + + + Maximum active uploads: + Numărul maxim de upload-uri active : + + + Spoof µtorrent to avoid ban (requires restart) + Înșeală utorrent pentru a nu primi ban (necesita restart) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Acțiune pentru dublu click + + + + Start/Stop + Start/Stop + + + Open folder + Deschide directoriul + + + Show properties + Arată proprietățile + + + Port used for incoming connections: + Portul utilizat pentru conectării: + + + Random + Aleatoriu + + + UI + UI + + + + DownloadingTorrents + + Name + i.e: file name + Nume + + + Size + i.e: file size + Capacitate + + + Progress + i.e: % downloaded + Progress + + + DL Speed + i.e: Download speed + Viteză DL + + + UP Speed + i.e: Upload speed + Viteză UP + + + Seeds/Leechs + i.e: full/partial sources + Sideri/Licheri + + + Ratio + Rata + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 startat. + + + Be careful, sharing copyrighted material without permission is against the law. + Atenţie ! Încălcarea drepturilor de autor se pedepseşte in toate ţările. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>a fost blocat</i> + + + Fast resume data was rejected for torrent %1, checking again... + Resumarea rapidă a fost respinsă pentru torrent-ul %1, verific încă o dată... + + + Url seed lookup failed for url: %1, message: %2 + Conectarea la seed a eşuat pentru : %1, mesajul : %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adăugat la lista de descărcare. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' resumat. (resumare rapidă) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' este de acum in lista de descărcare. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nu pot decodifica torrent-ul : '%1' + + + This file is either corrupted or this isn't a torrent. + Acest fişier este deteriorat sau nu este torrent. + + + Couldn't listen on any of the given ports. + Nu pot asculta pe orice port dat. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Descarc '%1', vă rugăm să aşteptaţi... + + + Hide or Show Column + Ascunde sau Afişeaza coloana + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + Priority + Prioritate + + + Seeds/Leechers + i.e: full/partial sources + Seederi/Licheri + + + + FeedDownloader + + RSS Feed downloader + RSS Feed download-er + + + RSS feed: + Feed RSS: + + + Feed name + Numele la Feed + + + Automatically download torrents from this feed + Automat descarcă torrente din acest feed + + + Download filters + Filtre de descărcare + + + Filters: + Filtre: + + + Filter settings + Stările filtrului + + + Matches: + Coincidențe: + + + Does not match: + Nu coincide: + + + Destination folder: + Directoriul destinație: + + + ... + ... + + + Filter testing + Setările filtrului + + + Torrent title: + Titlul torrent-ului: + + + Result: + Rezultat: + + + Test + Test + + + Import... + Import... + + + Export... + Export... + + + Rename filter + Redenumirea filtrului + + + Remove filter + Șterge filtrul + + + Add filter + Adaugă filtrul + + + + FeedDownloaderDlg + + New filter + Nou filtru + + + Please choose a name for this filter + Alegeți un nume pentru acest filtru + + + Filter name: + Numele filtrului: + + + Invalid filter name + Numele filtrului invalid + + + The filter name cannot be left empty. + Numele filtrului nu poate fi vid. + + + This filter name is already in use. + Nume de filtru existent. + + + Filter testing error + Filtrul testare eroare + + + Please specify a test torrent name. + Specificați un nume de test a torrent-ului. + + + matches + coincidenț + + + does not match + nu coincide + + + Select file to import + Alegeți fișier pentru import + + + Filters Files + Filtrează Fișiere + + + Import successful + Import cu success + + + Filters import was successful. + Importul filtrelor a fost cu success. + + + Import failure + Importează failure + + + Filters could not be imported due to an I/O error. + Filtrele nu pot fi importate din cauza erorilor I/O. + + + Select destination file + Selectează fișierul de destinație + + + Overwriting confirmation + Configmă rescrierea + + + Are you sure you want to overwrite existing file? + Doriți să rescriți fișierul existent? + + + Export successful + Export cu success + + + Filters export was successful. + Exportul filtrelor a fost cu success. + + + Export failure + Export eșuat + + + Filters could not be exported due to an I/O error. + Filtrele nu pot fi exportate din cauza erorilor I/O. + + + + FeedList + + Unread + Necitit + + + + FilterParserThread + + I/O Error + Input/Output Error + Eroare de intrare/eşire + + + Couldn't open %1 in read mode. + Nu pot deschide %1 în mod de citire. + + + %1 is not a valid PeerGuardian P2B file. + %1 nu este un fisier valid al PeerGuardian. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + Finişat + + + Name + i.e: file name + Nume + + + Size + i.e: file size + Capacitate + + + Seeds / Leechers + Sideri / Leecheri + + + Connected peers + Peeri conectați + + + Progress + i.e: % downloaded + Progress + + + DL Speed + i.e: Download speed + Viteză DL + + + UP Speed + i.e: Upload speed + Viteză UP + + + Seeds/Leechs + i.e: full/partial sources + Sideri/Licheri + + + Status + Stare + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Finişat + + + None + i.e: No error message + Nimic + + + Ratio + Rata + + + Leechers + i.e: full/partial sources + Leecheri + + + Total uploaded + i.e: Total amount of uploaded data + Total uploadad + + + Hide or Show Column + Ascunde sau Afişeaza coloama + + + Incomplete torrent in seeding list + Torrente incomplete în lista de sedare + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + + + Priority + Prioritate + + + + GUI + + Open Torrent Files + Deschide Fişiere Torrent + + + Unknown + Necunoscut + + + This file is either corrupted or this isn't a torrent. + Acest fişier este deteriorat sau nu este torrent. + + + Are you sure you want to delete all files in download list? + Sunteţi siguri să ştergeţi toate fişierele din lista de download? + + + &Yes + &Yes + + + &No + &No + + + Are you sure you want to delete the selected item(s) in download list? + Sunteţi siguri să ştergeţi itemii selectaţi din lista download? + + + paused + pauză + + + started + început + + + Finished + Finişat + + + Checking... + Verificare... + + + Connecting... + Conectare... + + + Downloading... + Downloading... + + + Download list cleared. + Lista Download curăţită. + + + All Downloads Paused. + Toate descărcările sunt Pausate. + + + All Downloads Resumed. + Toate descărcările sunt Resumate. + + + DL Speed: + DL viteză: + + + started. + început. + + + UP Speed: + UP viteză: + + + Couldn't create the directory: + Nu pot crea directoriul: + + + Torrent Files + Fişiere Torrent + + + already in download list. + <file> already in download list. + deacum în lista download. + + + added to download list. + adăugat la download list. + + + resumed. (fast resume) + resumat.(resumare rapidă) + + + Unable to decode torrent file: + Nu pot decoda fişierul torrent: + + + removed. + <file> removed. + şters. + + + paused. + <file> paused. + pausă. + + + resumed. + <file> resumed. + resumat. + + + Listening on port: + Ascult portul: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Sunteţi siguri? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL viteză: + + + <b>Connection Status:</b><br>Online + <b>Starea conectării:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Starea conectării:</b><br>Firewalled?<br><i>Nu sunt conectări externe...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Starea conectării:</b><br>Offline<br><i>Nu sunt găsiţi peers...</i> + + + has finished downloading. + am terminat descărcarea. + + + Couldn't listen on any of the given ports. + Nu pot asculta pe orice port dat. + + + None + Nimic + + + Empty search pattern + Şablonul de căutat este vid + + + Please type a search pattern first + Vă rugăm să completaţi şablonul de căutare + + + No seach engine selected + Nu aţi selectat motorul de căutare + + + You must select at least one search engine. + Trebuie să selectaţi cel puţin un motor de căutare. + + + Searching... + Căutare... + + + Could not create search plugin. + Nu pot să creez plugin de căutare. + + + Stopped + Oprit + + + Torrent file URL + Calea URL către fişierul Torrent + + + Torrent file URL: + URL către fişierul Torrent: + + + Are you sure you want to quit? -- qBittorrent + Sunteţi siguri să ieşiţi? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Sunteţi siguri să ieşiţi din qbittorrent? + + + Timed out + Timpul a expirat + + + Error during search... + Eroare în timpul căutării... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Oprit + + + Search is finished + Cautarea este terminata + + + An error occured during search... + Eroare în timpul căutării... + + + Search aborted + Cautarea abordată + + + Search returned no results + Cautarea nu a returnat rezultate + + + Search is Finished + Cautarea terminata + + + Search plugin update -- qBittorrent + Cautarea plugin înoire -- qBittorent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Cautarea plugin pentru înoire, doriţi să înoiţi? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Ne cerem ertare, serverul este temporar inaccesibil. + + + Your search plugin is already up to date. + Plugin-ul cautat este de acum înnoit. + + + Results + Rezultate + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + DL Speed + Viteză DL + + + UP Speed + Viteză UP + + + Status + Stare + + + ETA + ETA + + + Seeders + Seederi + + + Leechers + Leecheri + + + Search engine + Motorul de căutare + + + Stalled + state of a torrent whose DL Speed is 0 + Oprit + + + Paused + Pauzat + + + Preview process already running + Procesul de preview de acum este pornit + + + There is already another preview process running. +Please close the other one first. + De acum alt proces de preview este pornit. +Vă rugăm să-l opriţi. + + + Couldn't download + Couldn't download <file> + Nu pot descărca + + + reason: + Reason why the download failed + reason: + + + Downloading + Example: Downloading www.example.com/test.torrent + Descărcarea + + + Please wait... + Vă rugăm să aşteptaţi... + + + Transfers + Transferuri + + + Are you sure you want to quit qBittorrent? + Doriti să eşiţi din qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Doriti să ştergeţi item(ii) selectaţi? + + + Download finished + Descărcarea terminată + + + has finished downloading. + <filename> has finished downloading. + am terminat descărcarea. + + + Search Engine + Motor de Căutare + + + I/O Error + Eroare de intrare/eşire + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Starea conectării: + + + Offline + Deconectat + + + No peers found... + Nici un peer nu a fost găsit... + + + Name + i.e: file name + Nume + + + Size + i.e: file size + Capacitate + + + Progress + i.e: % downloaded + Progress + + + DL Speed + i.e: Download speed + Viteză DL + + + UP Speed + i.e: Upload speed + Viteză UP + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seederi + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Viteza DL: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Viteza IP: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Finişat + + + Checking... + i.e: Checking already downloaded parts... + Verificare... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Oprit + + + Are you sure you want to quit? + Doriti să ieşiţi ? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' a fost şters. + + + None + i.e: No error message + Nimic + + + All downloads were paused. + Toate descărcările au fost pauzate. + + + '%1' paused. + xxx.avi paused. + '%1' pauzat. + + + Connecting... + i.e: Connecting to the tracker... + Conectare... + + + All downloads were resumed. + Toate descărcările au fost reluate. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' reluat. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 a fost terminat de descărcat. + + + I/O Error + i.e: Input/Output Error + Eroare de intrare/eşire + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + O eroare a fost detectată la citire sau scriere în %1. Discul probabil este plin, descărcarea a fost pauzată + + + Connection Status: + Starea conectării: + + + Online + Conectat + + + Firewalled? + i.e: Behind a firewall/router? + Firewalled? + + + No incoming connections... + Nu sunt conectări din exterior... + + + Results + i.e: Search results + Rezultate + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Eroare a fost detectată(discul plin?), '%1' pauzad. + + + Search + Caută + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent foloseşte portul: %1 + + + DHT support [ON], port: %1 + Suport DHT[Activat], port: %1 + + + DHT support [OFF] + Suport DHT[Dezactivat] + + + PeX support [ON] + Suport PeX[Activat] + + + PeX support [OFF] + Suport PeX[Dezactivat] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Lista de descărcare nu este vidă. +Doriţi să ieşiţi din qBittorrent? + + + Downloads + Descărcări + + + Are you sure you want to delete the selected item(s) in finished list? + Doriţi să ştergeţi itemii selectaţi ? + + + UPnP support [ON] + Suport UPnP[Activat] + + + Encryption support [ON] + Suport de codificate[Activat] + + + Encryption support [FORCED] + Suport de codificare[Forţat] + + + Encryption support [OFF] + Suport de codificare [Dezactivat] + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Eroare de intrare/ieșire pentru torrent-ul %1. +Motivul : %2 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Eroare la descărcare URL + + + Couldn't download file at url: %1, reason: %2. + Nu pot descărca fisierul de pe url: %1, motivul: %2. + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Doriţi să ştergeţi itemii selectaţi din listă si de pe hard disk ? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Doriţi să ştergeţi itemii selectaţi din listă si de pe hard disk ? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' a fost şters pentru totdeauna. + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent utilizează portul : TCP/%1 + + + UPnP support [OFF] + suport de UPnP[Dezactivat] + + + NAT-PMP support [ON] + suport NAT-PMP[Activat] + + + NAT-PMP support [OFF] + suport NAT-PMP[Dezactivat] + + + DHT support [ON], port: UDP/%1 + DHT activat, portul : UDP/%1 + + + Local Peer Discovery [ON] + Căutare peer locali[Activat] + + + Local Peer Discovery support [OFF] + Căutarea peer locali[Dezactivat] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' a fost şters deoarece ratio lui a ajuns la valoarea maximă setată de dvs. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + DL: %1 KiB/s + DL: %1 KiB/s + + + UP: %1 KiB/s + UP:%1 Kib/s + + + Ratio: %1 + Ratio: %1 + + + DHT: %1 nodes + DHT: %1 noduri + + + No direct connections. This may indicate network configuration problems. + Nu sunt connectări directe. Aceasta poate indica la probleme cu rețeaua. + + + Uploads + Upload-uri + + + Options were saved successfully. + Opţiunile salvate cu success. + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Viteza totală DL: + + + Total UP Speed: + Viteza totală UP: + + + Name + Nume + + + Size + Capacitate + + + % DL + % DL + + + DL Speed + Viteză DL + + + UP Speed + Viteză UP + + + Status + Stare + + + ETA + ETA + + + &Options + &Opţiuni + + + &Edit + &Editare + + + &File + &Fişier + + + &Help + &Ajutor + + + Open + Deschide + + + Exit + Esire + + + Preferences + Preferinţe + + + About + Despre + + + Start + Start + + + Pause + Pauză + + + Delete + Şterge + + + Pause All + Pauză Toţi + + + Start All + Start Toţi + + + Documentation + Documentaţie + + + Delete All + Şterge Toţi + + + Torrent Properties + Proprietăţile Torrentului + + + Connection Status + Starea Conectării + + + Downloads + Descărcări + + + Search + Caută + + + Search Pattern: + Şablonul Căutării: + + + Status: + Stare: + + + Stopped + Oprit + + + Search Engines + Motoare de Căutare + + + Results: + Rezultate: + + + Stop + Oprit + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Motor de Căutare + + + Download from URL + Descarcă din URL + + + Download + Descarcă + + + Clear + Curăţă + + + KiB/s + KiB/s + + + Create torrent + Crează torrent + + + Ratio: + Rata: + + + Update search plugin + Înnoirea plugin-ului cautat + + + Session ratio: + Rata de sessiune: + + + Transfers + Transferuri + + + Preview file + Preview fişier + + + Clear log + Curăţă log-ul + + + Delete Permanently + Şterge permanent + + + Visit website + Vizitaţi web site-ul + + + Report a bug + Raportaţi despre bug-uri + + + Set upload limit + Setaţi limita de upload + + + Set download limit + Setaţi limita de download + + + Set global download limit + Setaţi limita globală de download + + + Set global upload limit + Setaţi limita globală de upload + + + Options + Opţiuni + + + Decrease priority + Decrementează prioritatea + + + Increase priority + Incrementează prioritatea + + + Console + Consola + + + + PropListDelegate + + False + Fals + + + True + Adevărat + + + Ignored + Ignorat + + + Normal + Normal (priority) + Normal + + + High + High (priority) + Înaltă + + + Maximum + Maximum (priority) + Maximală + + + + QTextEdit + + Clear + Curăţă + + + + RSS + + Search + Caută + + + Delete + Şterge + + + Rename + Redenumeşte + + + Refresh + Reînnoieşte + + + Create + Crează + + + Delete selected streams + Şterge itemul selectat + + + Refresh RSS streams + Reînnoieşte firul RSS + + + Add a new RSS stream + Adaugă un nou fir RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Noutăţi:</b> <i>(dubli click pentru a deschide)</i> + + + Add RSS stream + Adaugă RSS fir + + + Refresh all streams + Reînnoieşte toate firele + + + RSS streams: + Fire RSS: + + + 2 + 2 + + + Mark all as read + Marchează toate ca citite + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + Download torrent + Descarcă torrent-ul + + + Open news URL + Deschide noutățile URL + + + Copy feed URL + Copie URL feed-ul + + + RSS feed downloader + RSS feed descărcare + + + New subscription + Noua subsriere + + + Mark items read + Marchează itemii citiți + + + Update all + Reînnoiește toate + + + Update all feeds + Reînnoiește toate feed-urile + + + RSS feeds + RSS feed-uri + + + Update + Reînnoiește + + + New folder + Nou folder + + + 1 + 1 + + + Feed URL + Feed URL + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Introduceţi adresa URL la RSS fir + + + Stream URL: + Adresa URL: + + + Please choose a new name for this stream + Alegeţi un nume nou la acest fir + + + New stream name: + Numele nou: + + + Are you sure? -- qBittorrent + Sunteţi siguri? -- qBittorrent + + + &Yes + &Yes + + + &No + &No + + + Are you sure you want to delete this stream from the list? + Doriţi să ştergeţi acest fir din listă ? + + + Description: + Descriere: + + + url: + URL: + + + Last refresh: + Ultima reînnoire: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Acest RSS este deacum în listă. + + + Date: + Data: + + + Author: + Autor: + + + Please choose a folder name + Vă rugăm să alegeți altă denumire a directoriului + + + Folder name: + Denumirea folder-ului: + + + New folder + Nou directoriu + + + Are you sure you want to delete these elements from the list? + Doriti sa ștergeți aceste elemente? + + + Are you sure you want to delete this element from the list? + Sunteti siguri că doriti sa stergeti elementele selectate din listă? + + + Please choose a new name for this RSS feed + Alegeți alt nume pentru această listă RSS + + + New feed name: + Nou nume: + + + Name already in use + Numele este deacum utilizat + + + This name is already used by another item, please choose another one. + Numele este utilizat, alegeți altul. + + + Overwrite attempt + Încercare de rescriere + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Nu puteți rescri itemul %1. + + + Unread + Recitit + + + + RssItem + + No description available + Descrierea nu este disponobilă + + + + RssStream + + %1 ago + 10min ago + %1 în urmă + + + Never + Niciodată + + + Automatically downloading %1 torrent from %2 RSS feed... + Automat descarcă torrentul %1 din lista RSS %2... + + + + SearchCategories + + All categories + Toate categoriile + + + Movies + Filme + + + TV shows + TV show-uri + + + Music + Muzică + + + Games + Jocuri + + + Anime + Anime + + + Software + Soft + + + Pictures + Fotografii + + + Books + Cărți + + + + SearchEngine + + Name + i.e: file name + Nume + + + Size + i.e: file size + Capacitate + + + Seeders + i.e: Number of full sources + Seederi + + + Leechers + i.e: Number of partial sources + Licheri + + + Search engine + Motorul de căutare + + + Empty search pattern + Şablonul de căutat este vid + + + Please type a search pattern first + Vă rugăm să completaţi şablonul de căutare + + + No search engine selected + Nici un motor de căutare nu este selectat + + + You must select at least one search engine. + Trebuie să selectaţi cel puţin un motor de căutare. + + + Results + Rezultate + + + Searching... + Căutare... + + + Search plugin update -- qBittorrent + Cautarea plugin înoire -- qBittorent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Cautarea plugin pentru înoire, doriţi să înoiţi? + +Changelog: + + + + &Yes + &Yes + + + &No + &No + + + Search plugin update + Reînnoirea plugin-ului de căutare + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Ne cerem ertare, serverul este temporar inaccesibil. + + + Your search plugin is already up to date. + Plugin-ul cautat este de acum înnoit. + + + Cut + Tăiere + + + Copy + Copiere + + + Paste + Pune + + + Clear field + Ștergerea cîmpului + + + Clear completion history + Șterge istoria de completare + + + Search Engine + Motor de Căutare + + + Search has finished + Căutarea a fost terminată + + + An error occured during search... + Eroare în timpul căutării... + + + Search aborted + Cautarea abordată + + + Search returned no results + Cautarea nu a returnat rezultate + + + Results + i.e: Search results + Rezultate + + + Search plugin download error + Eroare la descărcarea plugin-ului de căutare + + + Couldn't download search plugin update at url: %1, reason: %2. + Nu pot descărca plugin-ul de căutare reînoit prin url: %1, motivul: %2. + + + Unknown + Necunoscut + + + + SearchTab + + Name + i.e: file name + Nume + + + Size + i.e: file size + Capacitate + + + Seeders + i.e: Number of full sources + Seederi + + + Leechers + i.e: Number of partial sources + Leecheri + + + Search engine + Motorul de căutare + + + + TrackersAdditionDlg + + Trackers addition dialog + Dialogul de adaugare a trackerilor + + + List of trackers to add (one per line): + Lista trackerilor(unul pe linie): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Vă rog contactaţimă dacă doriţi să traslaţi qBittorrent în limba dvs. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Eu vreau să mulţumesc voluntarilor care au translat qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Eu vreau să mulţumesc sourceforge.net pentru gazda proiectului qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Eu mulţumesc lui Jeffery Fernandez (developer@jefferyfernandez.id.au), funcţia de RPM packager, pentru lucrul lui mare.</li></ul> + + + Preview impossible + Preview imposibil + + + Sorry, we can't preview this file + Nu putem face preview pentru acest fişier + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + No URL entered + Nu este introdus URL-ul + + + Please type at least one URL. + Vă rugăm să introduceţi cel puţin un URL. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Eu vreau să mulţumesc voluntarilor care au translat qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Contactaţimă dacă doriţi să traduceţi qBittorrent in limba dumneavoastră. + + + + addTorrentDialog + + Torrent addition dialog + Dialogul de adăugare a torrentului + + + Save path: + Calea de salvare: + + + ... + ... + + + Torrent content: + Conţinutul torrent-ului: + + + File name + Numele fişierului + + + File size + Dimensiunea fişierului + + + Selected + Selectat + + + Download in correct order (slower but good for previewing) + Descarcă în ordine corectă (mai încet dar bun pentru preview) + + + Add to download list in paused state + Adauga în lista de descărcare în stare de pauză + + + Add + Adaugă + + + Cancel + Anulare + + + select + selectează + + + Unselect + Deselectează + + + Ignored + Ignorat + + + Normal + Normal + + + High + Înalt + + + Maximum + Maximal + + + Collapse all + Închide toate + + + Expand all + Deschide toate + + + Torrent size: + Dimensiunea torrentului: + + + Unknown + Necunoscut + + + Free disk space: + Spațiu liber: + + + Download in sequential order (slower but good for previewing) + Descarcă în ordine secvențială (încet dar bine pentru preview) + + + + authentication + + Tracker authentication + Autentificarea pe Tracker + + + Tracker: + Tracker: + + + Login + Login + + + Username: + Numele de utilizator: + + + Password: + Parola: + + + Log in + Logare + + + Cancel + Anulare + + + + bandwidth_dlg + + Bandwidth allocation + Alocare bandwidth + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 a ajuns la rata maximă + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' a fost şters pentru totdeauna. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' a fost şters. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' pauzat. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' reluat. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' este de acum in lista de descărcare. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' resumat. (resumare rapidă) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' adăugat la lista de descărcare. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nu pot decodifica torrent-ul : '%1' + + + This file is either corrupted or this isn't a torrent. + Acest fişier este deteriorat sau nu este torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>a fost blocat conform IP filtrului</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>a fost banat din cauza fragmentelor eronate</i> + + + Couldn't listen on any of the given ports. + Nu pot asculta pe orice port dat. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Resumarea rapidă a fost respinsă pentru torrent-ul %1, verific încă o dată... + + + Url seed lookup failed for url: %1, message: %2 + Conectarea la seed a eşuat pentru : %1, mesajul : %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Descarc '%1', vă rugăm să aşteptaţi... + + + '%1' is not a valid magnet URI. + '%1' nu este valid URI. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Descarcă recursiv fișierul %1 din torrentul %2 + + + Unable to decode %1 torrent file. + Nu pot citi torrentul %1. + + + + createTorrentDialog + + Create Torrent file + Crează fişier Torrent + + + Destination torrent file: + Destinaţia fişierului torrent: + + + Input file or directory: + Fişierul sau directoriul de intrare: + + + Comment: + Comentarii: + + + ... + ... + + + Create + Crează + + + Cancel + Anulare + + + Announce url (Tracker): + Anunţă URL(Tracker): + + + Directory + Directoriul + + + Torrent Creation Tool + Crearea Torrentului + + + <center>Destination torrent file:</center> + <center>Destinaţia fişierului torrent:</center> + + + <center>Input file or directory:</center> + <center>Fişier de intrare sau directoriu:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Anunţă url:<br>(unu pe o linie)</center> + + + <center>Comment:</center> + <center>Comentariu:</center> + + + Torrent file creation + Locaţia de creare a torrent-ului + + + Input files or directories: + Fişiere sau directorii de intrare: + + + Announce urls (trackers): + URL-uri de anunţare (tracke-ri): + + + Comment (optional): + Comentariu(opţional): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Privat (nu va fi distribui prin reţea DHT daca este activată) + + + Web seeds urls (optional): + Web sedări(opţional): + + + File or folder to add to the torrent: + Fişier sau directoriu pentru a adăuga torentul: + + + Add a file + Adaugă un fişier + + + Add a folder + Adaugă un directoriu + + + Piece size: + Dimensiunea bucăţii: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + Privat(nu va fi distribuit prin reţeaua DHT dacă este activată) + + + Start seeding after creation + Începe sedarea după creare + + + Create and save... + Crează şi salvează... + + + Progress: + Progress: + + + Add file + Adaugă fișier + + + Add folder + Adaugă directoriu + + + + createtorrent + + Select destination torrent file + Selectează fişierul de destinare + + + Torrent Files + Fişiere Torrent + + + Select input directory or file + Selectează directoriul sau fişierul de intrare + + + No destination path set + Nu este setată calea de destinaţie + + + Please type a destination path first + Vă rugăm să arătaţi calea de destinaţie + + + No input path set + Nu sunt selectate fişiere de intrare + + + Please type an input path first + Vă rugăm să arătaţi calea de intrare + + + Input path does not exist + Calea de intrare nu există + + + Please type a correct input path first + Vă rugăm să introduceţi corect calea de intrare + + + Torrent creation + Crearea torentului + + + Torrent was created successfully: + Torrentul a fost creat cu success: + + + Please type a valid input path first + Introduceţi o cale validă + + + Select a folder to add to the torrent + Seletaţi directoriul pentru a fi adăugat în torrent fişier + + + Select files to add to the torrent + Selectaţi fişierele pentru a fi adăugate în torrent + + + Please type an announce URL + Introduceţi URL-ul de anunţare + + + Torrent creation was unsuccessful, reason: %1 + Crearea torrent-ului a eşuat, motivul: %1 + + + Announce URL: + Tracker URL + URL-ul de anunţare: + + + Please type a web seed url + Introduceţi URL-ul de web seed + + + Web seed URL: + Web seed URL: + + + Select a file to add to the torrent + Selectaţi un fişier pentru al adăuga la torrent + + + No tracker path set + Calea la tracker nu este setată + + + Please set at least one tracker + Vă rugăm să setaţi cel puţin un tracker + + + Created torrent file is invalid. It won't be added to download list. + Fişierul torrent creat este deteriorat. El nu va fi adăugat în lista de download-uri. + + + + downloadFromURL + + Download Torrents from URLs + Descărcarea Torrent-uri de pe URL-uri + + + Only one URL per line + Numai un URL pe linie + + + Download + Descarcă + + + Cancel + Anulare + + + Download from urls + Descărcare de pe url-uri + + + No URL entered + Nu este introdus URL-ul + + + Please type at least one URL. + Vă rugăm să introduceţi cel puţin un URL. + + + + downloading + + Search + Caută + + + Total DL Speed: + Viteza totală DL: + + + KiB/s + KiB/s + + + Session ratio: + Rata de sessiune: + + + Total UP Speed: + Viteza totală UP: + + + Log + Lof + + + IP filter + Filtru IP + + + Start + Start + + + Pause + Pauză + + + Delete + Şterge + + + Clear + Curăţă + + + Preview file + Preview fişier + + + Set upload limit + Setează limita de upload + + + Set download limit + Setează limita de download + + + Delete Permanently + Şterge permanent + + + Torrent Properties + Proprietăţile Torrentului + + + Open destination folder + Deschide directoriul destinaţie + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + DLSpeed + VitezaDL + + + UpSpeed + VitezaUP + + + Seeds/Leechs + Sideri/Licheri + + + Ratio + Rata + + + ETA + ETA + + + Buy it + Buy it + + + Priority + Prioritate + + + Increase priority + Incrementează prioritatea + + + Decrease priority + Decrementează prioritatea + + + Force recheck + Reverificarea forţată + + + Copy magnet link + Copie magent link-ul + + + + engineSelect + + Search plugins + Plugin-uri de căutare + + + Installed search engines: + Motoare de căutare instalare: + + + Name + Nume + + + Url + Url + + + Enabled + Activată + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Puteţi obţine motoare de căutare noi aici : <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Instalez un nou + + + Check for updates + Verifică pentru veriuni mai noi + + + Close + Închide + + + Enable + Activează + + + Disable + Dezactivat + + + Uninstall + Dezinstalează + + + + engineSelectDlg + + True + Adevărat + + + False + Fals + + + Uninstall warning + Avertizare de dezinstalare + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Unele plug-inuri nu pot fi dezinstalate deoarece sunt incluse în qBittorrent. +Numai acele adăugate de dvs. pot fi dezinstalate. + + + + Uninstall success + Dezinstalare cu success + + + Select search plugins + Alege motorul de căutare + + + qBittorrent search plugins + Plugin-urilie de căutare al qBittorrent + + + Search plugin install + Caută plugin-ul instalat + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + O versiune mai recentă de al motorului de căutare %1 este de acum instalată. + + + Search plugin update + Reînnoirea plugin-ului de căutare + + + Sorry, update server is temporarily unavailable. + Ne cerem ertare, serverul este temporar inaccesibil. + + + All your plugins are already up to date. + Totate plugin-urile dvs sunt deacum reînnoite. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 motorul de căutare nu a putut fi reînnoit, folosesc versiunea veche. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + motorul de căutare %1 nu poate fi instalat. + + + All selected plugins were uninstalled successfully + Toate plugin-urile selectate sunt dezinstalate cu success + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + motorul de căutare %1 a fost reînnoit cu success. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + motorul de căutare %1 a fost instalat cu success. + + + Search engine plugin archive could not be read. + Arhiva cu motorul de căutare nu poate fi citită. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Instalarea motorului de căutare %1 a eşuat. + + + New search engine plugin URL + Adresa noului motor de căutare URL + + + URL: + URL: + + + Yes + Da + + + No + Ny + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + Kib + + + MiB + mebibytes (1024 kibibytes) + Mib + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + Unknown + Necunoscut + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Necunoscut + + + < 1m + < 1 minute + < 1m + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1ore %2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1 zile %2 ore %3m + + + + options_imp + + Options saved successfully! + Opţiunile salvate! + + + Choose Scan Directory + Alegeţi Directoriul pentru Scanare + + + Choose save Directory + Selectaţi Directoriul pentru Salvare + + + Choose ipfilter.dat file + Selectaţi fişierul : ipfilter.dat + + + I/O Error + Eroare de intrare/eşire + + + Couldn't open: + Nu pot deschide: + + + in read mode. + in mod de citire. + + + Invalid Line + Linie invalidă + + + Line + Linie + + + is malformed. + este neformată. + + + Range Start IP + Domeniul de Start IP + + + Start IP: + IP-ul de start: + + + Incorrect IP + IP-ul incorrect + + + This IP is incorrect. + Acest IP este incorrect. + + + Range End IP + Domeniul de sfirşit IP + + + End IP: + IP-ul de sfirşit: + + + IP Range Comment + Comentarii la domeniul de IP + + + Comment: + Comentarii: + + + to + <min port> to <max port> + la + + + Choose your favourite preview program + Alegeţi programul dvs. favorit pentru preview + + + Invalid IP + IP greşit + + + This IP is invalid. + Acest IP este valid. + + + Options were saved successfully. + Opţiunile salvate cu success. + + + Choose scan directory + Selectează directoriul de scanare + + + Choose an ipfilter.dat file + Selectează fişierul ipfilter.dat + + + Choose a save directory + Selectează directoriul de salvare + + + I/O Error + Input/Output Error + Eroare de intrare/eşire + + + Couldn't open %1 in read mode. + Nu pot deschide %1 în mod de citire. + + + Choose an ip filter file + Alageţi un fişier ip filtru + + + Filters + Filtre + + + + pluginSourceDlg + + Plugin source + Sursa plugin-ului + + + Search plugin source: + Caută sursa plugin-ului: + + + Local file + Fişier local + + + Web link + Legătură web + + + + preview + + Preview selection + Secţia de preview + + + File preview + Preview Fişier + + + The following files support previewing, <br>please select one of them: + Următoarele fişiere suportă preview, <br>selectaţi unul din ei: + + + Preview + Preview + + + Cancel + Anulare + + + + previewSelect + + Preview impossible + Preview imposibil + + + Sorry, we can't preview this file + Nu putem face preview pentru acest fişier + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + + properties + + Torrent Properties + Proprietăţile Torrentului + + + Main Infos + Informaţia principală + + + File Name + Numele fişierului + + + Current Session + Sesiunea curentă + + + Total Uploaded: + Total încărcat: + + + Total Downloaded: + Total Descărcat: + + + Download state: + Starea Descărcării: + + + Current Tracker: + Tracker-ul curent: + + + Number of Peers: + Numărul de Peers: + + + Torrent Content + Conţinutul torrentului + + + OK + OK + + + Total Failed: + Total Eşuat: + + + Finished + Finişat + + + Queued for checking + In coadă pentru verificare + + + Checking files + Verificarea fişierelor + + + Connecting to tracker + Conectarea la tracker + + + Downloading Metadata + Descărcarea Metadata + + + Downloading + Descărcarea + + + Seeding + Sedarea + + + Allocating + Alocarea + + + Unknown + Necunoscut + + + Complete: + Completat: + + + Partial: + Parţial: + + + Files contained in current torrent: + Fişiere conţinute in Torrentul curent: + + + Size + Capacitate + + + Selected + Selectat + + + Unselect + Deselectare + + + Select + Selectare + + + You can select here precisely which files you want to download in current torrent. + Puteţi selecta unde precis unde fiecare fişier va fi descărcat în torrentul curent. + + + False + Fals + + + True + Adevărat + + + Tracker + Tracker + + + Trackers: + Trackere: + + + None - Unreachable? + Nimic-Neaccesibil? + + + Errors: + Erori: + + + Progress + Progress + + + Main infos + Info. principala + + + Number of peers: + Numarul de peers: + + + Current tracker: + Tracker-ul curent: + + + Total uploaded: + Total încărcat: + + + Main info + Informația principală + + + Torrent information + Informația torrent-ului + + + Total downloaded: + Total descărcat: + + + Total failed: + Total eronat: + + + Torrent content + Conţinutul torentului + + + Options + Opţiuni + + + Download in correct order (slower but good for previewing) + Descarcă în ordine corectă (mai încet dar bun pentru preview) + + + Share Ratio: + Rata de Share: + + + Seeders: + Seederi: + + + Leechers: + Leecheri: + + + Save path: + Calea de salvare: + + + Torrent infos + Informaţie despre torrent + + + Creator: + Creator: + + + Torrent hash: + Hash-ul torrentului: + + + Comment: + Comentarii: + + + Current session + Sesiunea curentă + + + Share ratio: + Raţia de Share: + + + Trackers + Trackeri + + + New tracker + Tracker nou + + + New tracker url: + URL-ul trackerului nou: + + + Priorities: + Priorităţi: + + + Normal: normal priority. Download order is dependent on availability + Normal: prioritate normală. Ordinea de descărcare depinde de avaibilitate + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Inaltă: mai sus ca prioritatea normală + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximală: prioritatea maximală + + + File name + Numele fişierului + + + Priority + Prioritate + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Lista de trackeri nu poate fi vidă. + + + Ignored: file is not downloaded at all + Ignorat: fişierul nu este descărcat tot + + + Ignored + Ignorat + + + Normal + Normal + + + Maximum + Maximum + + + High + Înaltă + + + Url seeds + Sedări URL + + + New url seed: + Nou URL de sedări: + + + This url seed is already in the list. + Acest URL este deacum în listă. + + + None + i.e: No error message + Nimic + + + New url seed + New HTTP source + Nou URL de sedări + + + The following url seeds are available for this torrent: + Următoarele sedări URL sunt accesibile pentru acest torrent: + + + Priorities error + Eroare de prorităţi + + + Error, you can't filter all the files in a torrent. + Eroare, nu puteţi filtra toate fişierele în un torrent. + + + Downloaded pieces + Segmente de download + + + Collapse all + Închide toate + + + Expand all + Deschide toate + + + ... + ... + + + Choose save path + Alegeţi calea de salvare + + + Save path creation error + Salvează calea care crează erori + + + Could not create the save path + Nu pot crea calea de salvare + + + + search_engine + + Search + Caută + + + Search Engines + Motoare de Căutare + + + Search Pattern: + Şablonul Căutării: + + + Stop + Oprit + + + Status: + Stare: + + + Stopped + Oprit + + + Results: + Rezultate: + + + Download + Descarcă + + + Clear + Curăţă + + + Update search plugin + Înnoirea plugin-ului cautat + + + Search engines... + Motoare de căutare... + + + Close tab + Închide tab-ul + + + + seeding + + Search + Caută + + + The following torrents are finished and shared: + Aceste torrente sunt terminate şi distribuite: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Notă:</u> Este important să distribuiţi torentele dvs. după ce leaţi descărcat pentru ca alţi utilizatori sa le poată lua. + + + Start + Start + + + Pause + Pauză + + + Delete + Şterge + + + Delete Permanently + Şterge permanent + + + Torrent Properties + Proprietăţile Torrentului + + + Preview file + Preview fişier + + + Set upload limit + Setaţi limita de upload + + + Open destination folder + Deschide directoriul destinaţie + + + Name + Nume + + + Size + Capacitate + + + Upload Speed + Viteza upload + + + Connected peers + Peeri conectați + + + Seeds / Leechers + Sederi / Leecheri + + + Leechers + Leecheri + + + Ratio + Rata + + + Buy it + Buy it + + + Total uploaded + Total încărcat + + + Priority + Prioritate + + + Increase priority + Incrementează prioritatea + + + Decrease priority + Decrementează prioritatea + + + Force recheck + Reverificarea forţată + + + Copy magnet link + Copie magnet link-ul + + + + subDownloadThread + + Host is unreachable + Calculatorul nu poate fi accesat + + + File was not found (404) + Fişierul nu a fost găsit(404) + + + Connection was denied + Conectarea a fost interzisă + + + Url is invalid + Adresa URL nu este validă + + + Connection forbidden (403) + Conectarea respinsă(403) + + + Connection was not authorized (401) + Conectare neautorizată(401) + + + Content has moved (301) + Conţinutul a fost mutat(301) + + + Connection failure + Conectarea eşuată + + + Connection was timed out + Timpul de conectare expirat + + + Incorrect network interface + Interfaţa de reţea incorectă + + + Unknown error + Eroare necunoscută + + + Could not resolve proxy + Proxy nu a putut fi rezolvata + + + I/O Error + Eroare de intrare/eşire + + + + torrentAdditionDialog + + True + Adevărat + + + Unable to decode torrent file: + Nu pot decoda fişierul torrent: + + + This file is either corrupted or this isn't a torrent. + Acest fişier este deteriorat sau nu este torrent. + + + Choose save path + Alegeţi calea de salvare + + + False + Fals + + + Empty save path + Calea de salvare vidă + + + Please enter a save path + Vă rugăm să introduceţi calea de salvare + + + Save path creation error + Salvează calea care crează erori + + + Could not create the save path + Nu pot crea calea de salvare + + + Invalid file selection + Selecţia fişierului invalidă + + + You must select at least one file in the torrent + Trebuie să selectaţi cel puţin un fişier din torrent + + + File name + Numele fişierului + + + Size + Capacitate + + + Progress + Progress + + + Priority + Prioritate + + + Unknown + Necunoscut + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 rămas după descărcare torrent-ului) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 mai mult este necesar pentru a descărca) + + + diff --git a/src/lang/qbittorrent_ru.qm b/src/lang/qbittorrent_ru.qm new file mode 100644 index 0000000000000000000000000000000000000000..44240eff40748b184a6f27f8816eac085d4f6862 GIT binary patch literal 69416 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 + + + + @default + + b + bytes + б + + + KB + КБ + + + MB + МБ + + + GB + ГБ + + + KB + kilobytes + КБ + + + MB + megabytes + МБ + + + GB + gigabytes + ГБ + + + + AboutDlg + + About qBittorrent + О qBittorrent + + + About + О программе + + + Author + Автор + + + Name: + Имя: + + + Country: + Страна: + + + E-mail: + Электронная почта: + + + Home page: + Домашняя страница: + + + Christophe Dumez + Кристоф Дюме (Christophe Dumez) + + + France + Франция + + + Thanks To + Благодарности + + + Translation + Перевод + + + License + Лицензия + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Клиент bittorrent, использующий пакеты QT4 и libtorrent, написанный на C++.<br> +<br> +Все права защищены © 2006 Кристоф Дюме (Christophe Dumez)<br> +<br> <u>Домашняя страница:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + День рождения: + + + Occupation: + Занятие: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Студент, изучающий программирование + + + Thanks to + Благодарности + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bittorrent клиент написанный на C++, с использованием библиотеки Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">и libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Домашняя страница:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Ограничение раздачи: + + + Download limit: + Ограничение скачивания: + + + Unlimited + Unlimited (bandwidth) + Неограниченно + + + KiB/s + КиБ/с + + + + ConsoleDlg + + qBittorrent console + Консоль qBittorrent + + + General + Общие + + + Blocked IPs + Заблокированные IP + + + + DLListDelegate + + KiB/s + КиБ/с + + + + Dialog + + Options -- qBittorrent + Параметры -- qBittorrent + + + Options + Опции + + + Main + Главная + + + Save Path: + Путь для сохранения: + + + Download Limit: + Ограничение скачивания: + + + Upload Limit: + Предел загрузки: + + + Max Connects: + Максимально соединений: + + + Port range: + Диапазон портов: + + + ... + ... + + + Kb/s + Кб/с + + + Disable + Отключить + + + connections + соединения + + + to + кому + + + Proxy + Прокси + + + Proxy Settings + Настройки прокси + + + Server IP: + IP сервера: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Порт: + + + Proxy server requires authentication + Прокси-сервер требует аутентификации + + + Authentication + Аутентификация + + + User Name: + Имя пользователя: + + + Password: + Пароль: + + + Enable connection through a proxy server + Включить соединение через прокси-сервер + + + Language + Язык + + + Please choose your preferred language in the following list: + Пожалуйста, выберите подходящий язык из следующего списка: + + + OK + ОК + + + Cancel + Отмена + + + Language settings will take effect after restart. + Языковые настройки вступят в силу после перезапуска. + + + Scanned Dir: + Просканированные папки: + + + Enable directory scan (auto add torrent files inside) + Включить сканирование папок (автоматическое добавление torrent файлов в нее) + + + Connection Settings + Настройки соединения + + + Share ratio: + Степень разделенности: + + + 1 KB DL = + 1 КБ Скач. = + + + KB UP max. + КБ ЗАГР. макс. + + + Activate IP Filtering + Включить фильтр по IP + + + Filter Settings + Настройки фильтра + + + Start IP + Начальный IP + + + End IP + Конечный IP + + + Origin + Происхождение + + + Comment + Комментарий + + + Apply + Применить + + + IP Filter + Фильтр по IP + + + Add Range + Добавить диапазон + + + Remove Range + Удалить диапазон + + + ipfilter.dat Path: + Путь к ipfilter.dat: + + + Clear finished downloads on exit + Очищать законченные закачки при выходе + + + Ask for confirmation on exit + Просить подтверждения при выходе + + + Go to systray when minimizing window + Сворачивать в системный трей + + + Misc + Разное + + + Localization + Локализация + + + Language: + Язык: + + + Behaviour + Поведение + + + OSD + OSD + + + Always display OSD + Всегда показывать OSD + + + Display OSD only if window is minimized or iconified + Показывать OSD только когда окно минимизировано + + + Never display OSD + Никогда не показывать OSD + + + KiB/s + КиБ/с + + + 1 KiB DL = + 1 КиБ Скач. = + + + KiB UP max. + КиБ Загр. макс. + + + DHT (Trackerless): + DHT: + + + Disable DHT (Trackerless) support + Отключить поддержку DHT + + + Automatically clear finished downloads + Автоматически удалять законченные скачивания + + + Preview program + Программа для предпросмотра + + + Audio/Video player: + Аудио/Видео проигрыватель: + + + DHT configuration + Настройки DHT + + + DHT port: + Порт DHT: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Заметьте:</b> Изменения вступят в силу только после перезапуска qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Примечание для переводчиков:</b> Если qBittorrent еще не переведен на ваш язык, <br/>и вы хотите перевести его на свой родной язык, <br/>пожалуйста, свяжитесь со мной (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Показывать окно добавления torrent-а каждый раз при добавлении torrent-а + + + Default save path + Путь сохранения по умолчанию + + + Systray Messages + Сообщения в трее + + + Always display systray messages + Всегда показывать сообщения в трее + + + Display systray messages only when window is hidden + Показывать сообщения в трее только когда окно свернуто + + + Never display systray messages + Не отображать сообщения в трее + + + Disable DHT (Trackerless) + Выключить DHT (Без трэкеров) + + + Disable Peer eXchange (PeX) + Выключить обмен пирами (PeX) + + + Go to systray when closing main window + Сворачивать в трей при закрытии окна + + + Connection + Соединение + + + Peer eXchange (PeX) + Обмен Пирами (PeX) + + + DHT (trackerless) + DHT (Без трэкеров) + + + Torrent addition + Добавление torrentа + + + Main window + Главное окно + + + Systray messages + Сообщения в трее + + + Directory scan + Сканирование папки + + + Style (Look 'n Feel) + Стиль (Смотри и чувствуй) + + + Plastique style (KDE like) + Стиль пластик (как KDE) + + + Cleanlooks style (GNOME like) + Свободный стиль (как в GNOME) + + + Motif style (default Qt style on Unix systems) + Стиль Motif (по умолчанию в Qt на Unix-подобных системах) + + + CDE style (Common Desktop Environment like) + Стиль CDE (как Окружение Общего Рабочего Стола) + + + MacOS style (MacOSX only) + Стиль MacOS (только на MacOSX) + + + Exit confirmation when the download list is not empty + Подтверждение выхода, когда список закачек не пуст + + + Disable systray integration + Выключает интеграцию в системный трей + + + WindowsXP style (Windows XP only) + Стиль WindowsXP (только WindowsXP) + + + Server IP or url: + IP сервера или его URL: + + + Proxy type: + Тип прокси: + + + HTTP + HTTP + + + SOCKS5 + Сервер SOCKS5 + + + Affected connections + Затрагиваемые соединения + + + Use proxy for connections to trackers + Использовать прокси для подключения к трекерам + + + Use proxy for connections to regular peers + Использовать прокси для подключения к обычным пирам + + + Use proxy for connections to web seeds + Использовать прокси для подключения к веб раздачам + + + Use proxy for DHT messages + Использовать прокси для сообщений DHT + + + Encryption + Шифрование + + + Encryption state: + Состояние шифрования: + + + Enabled + Включено + + + Forced + Принудительно + + + Disabled + Выключено + + + Preferences + Предпочтения + + + General + Общие + + + Network + Сеть + + + User interface settings + Настройки интерфейса пользователя + + + Visual style: + Визуальный стиль: + + + Cleanlooks style (Gnome like) + Свободный стиль (как в GNOME) + + + Motif style (Unix like) + Стиль Motif (на Unix-подобных системах) + + + Ask for confirmation on exit when download list is not empty + Спрашивать о подтверждении выхода, если список закачек не пустой + + + Display current speed in title bar + Отображать текущую скорость в полосе заголовка + + + System tray icon + Значок в системном лотке + + + Disable system tray icon + Убрать значок из системного лотка + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Свернуть в значок при закрытии + + + Minimize to tray + Сворачивать в значок + + + Show notification balloons in tray + Показывать всплывающие сообщения в системном лотке + + + Media player: + Медиа проигрыватель: + + + Downloads + Закачки + + + Put downloads in this folder: + Расположить закачки в этой папке: + + + Pre-allocate all files + Резервировать место для всего файла + + + When adding a torrent + При добавлении торента + + + Display torrent content and some options + Отображать содержимое torrentа и некоторые настройки + + + Do not start download automatically + The torrent will be added to download list in pause state + Не начинать загрузку автоматически + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Просматривать папку + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Двойной щелчок по списку закачек + + + Download list: + Список закачек: + + + Seeding list: + Список раздач: + + + Download folder: + Директория закачек: + + + Temp folder: + Временная директория: + + + Automatically download torrents present in this folder: + Автоматически скачивает torrentы, существующие в данной папке: + + + Listening port + Прослушивание порта + + + to + i.e: 1200 to 1300 + до + + + Enable UPnP port mapping + Включить распределение портов UPnP + + + Enable NAT-PMP port mapping + Включить распределение портов NAT-PMP + + + Global bandwidth limiting + Общее ограничение канала + + + Upload: + Отдача: + + + Download: + Загрузка: + + + Bittorrent features + Возможности Bittorrent + + + Use the same port for DHT and Bittorrent + Использовать один и тот же порт для DHT и Bittorrent + + + Type: + Тип: + + + (None) + (нет) + + + Proxy: + Прокси: + + + Username: + Имя пользователя: + + + Bittorrent + Bittorrent + + + Connections limit + Ограничение соединений + + + Global maximum number of connections: + Общее ограничение на число соединений: + + + Maximum number of connections per torrent: + Максимальное число соединений на torrent: + + + Maximum number of upload slots per torrent: + Максимальное количество слотов отдачи на torrent: + + + Additional Bittorrent features + Дополнительные функции Bittorrent + + + Enable DHT network (decentralized) + Включить DHT сеть (децентрализованную) + + + Enable Peer eXchange (PeX) + Включить Обмен пирами - Peer eXchange (PeX) + + + Enable Local Peer Discovery + Включить обнаружение локальных пиров + + + Encryption: + Шифрование: + + + Share ratio settings + Настройки коэффициента раздачи + + + Desired ratio: + Предпочитаемое соотношение: + + + Filter file path: + Файл фильтра: + + + transfer lists refresh interval: + интервал обновления списков передачи: + + + ms + мс + + + RSS + RSS + + + RSS feeds refresh interval: + Интервал обновления RSS каналов: + + + minutes + минут + + + Maximum number of articles per feed: + Максимальное число статей на канал: + + + File system + Файловая система + + + Remove finished torrents when their ratio reaches: + Удалять законченные torrentы когда их соотношение раздачи достигнет: + + + System default + Системная тема + + + Start minimized + Запускать свернутым + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Действие по двойному щелчку в списках передач + + + In download list: + В списке закачек: + + + Pause/Start torrent + Приостановить/Запустить torrent + + + Open destination folder + Открыть папку назначения + + + Display torrent properties + Свойства torrentа + + + In seeding list: + В списке раздачи: + + + Folder scan interval: + Интервал сканирования папки: + + + seconds + секунд + + + Spoof Azureus to avoid ban (requires restart) + "Обманывать" Azureus чтобы избежать бана (требуется перезапуск) + + + Web UI + Web интерфейс + + + Enable Web User Interface + Включить Web интерфейс + + + HTTP Server + HTTP сервер + + + Enable RSS support + Включить поддержку RSS + + + RSS settings + Настройки RSS + + + Torrent queueing + Очереди Torrent + + + Enable queueing system + Включить очереди torrent + + + Maximum active downloads: + Максимальное число активных закачек: + + + Maximum active torrents: + Максимальное число активных torrent: + + + Display top toolbar + Показать верхнюю панель + + + Search engine proxy settings + Настройки прокси для поисковых движков + + + Bittorrent proxy settings + Настройки прокси Bittorrent + + + Maximum active uploads: + Максимальное число активных раздач: + + + Spoof µtorrent to avoid ban (requires restart) + "Обманывать" µtorrent чтобы избежать бана (требуется перезапуск) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Действие по двойному щелчку + + + Start/Stop + Начать/Остановить + + + Open folder + Открыть папку + + + Show properties + Показать свойства + + + Port used for incoming connections: + Порт, используемый для входящих соединений: + + + Random + Случайно + + + UI + Интерфейс + + + + DownloadingTorrents + + Name + i.e: file name + Имя + + + Size + i.e: file size + Размер + + + Progress + i.e: % downloaded + Состояние + + + DL Speed + i.e: Download speed + Скорость скач + + + UP Speed + i.e: Upload speed + Скорость загр + + + Seeds/Leechs + i.e: full/partial sources + Раздающих/Качающих + + + Ratio + Соотношение + + + ETA + i.e: Estimated Time of Arrival / Time left + Ост. время + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 запущен. + + + Be careful, sharing copyrighted material without permission is against the law. + Осторожнее, раздача материалов защищенных авторскими правами, преследуется по закону. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>был заблокирован</i> + + + Fast resume data was rejected for torrent %1, checking again... + Быстрое восстановление данных для torrentа %1 было невозможно, проверка заново... + + + Url seed lookup failed for url: %1, message: %2 + Поиск раздающего Url не удался: %1, сообщение: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавлен в список закачек. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' возобновлен. (быстрое возобновление) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' уже присутствует в списке закачек. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не удалось декодировать torrent файл: '%1' + + + This file is either corrupted or this isn't a torrent. + Этот файл либо поврежден, либо не torrent типа. + + + Couldn't listen on any of the given ports. + Невозможно прослушать ни один из заданных портов. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Скачивание '%1', подождите... + + + Hide or Show Column + Скрыть или показать столбец + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + Распределение портов UPnP/NAT-PMP не удалось с сообщением: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + Распределение портов UPnP/NAT-PMP прошло успешно: %1 + + + Priority + Приоритет + + + Seeds/Leechers + i.e: full/partial sources + Раздающих/Качающих + + + + FeedDownloader + + RSS Feed downloader + dont understand perfectly what is this 'downloader' + Загрузка RSS канала + + + RSS feed: + RSS канал: + + + Feed name + Имя канала + + + Automatically download torrents from this feed + Автоматически загружать торренты с этого канала + + + Download filters + Фильтр загрузок + + + Filters: + Фильтры: + + + Filter settings + Настройки фильтра + + + Matches: + Совпадения: + + + Does not match: + Не совпадают: + + + Destination folder: + Папка назначения: + + + ... + ... + + + Filter testing + Тестирование фильтра + + + Torrent title: + Заголовок торрента: + + + Result: + Результат: + + + Test + Тест + + + Import... + Импорт... + + + Export... + Экспорт... + + + Rename filter + Переименовать фильтр + + + Remove filter + Удалить фильтр + + + Add filter + Добавить фильтр + + + + FeedDownloaderDlg + + New filter + Новый фильтр + + + Please choose a name for this filter + Пожалуйста, выберите имя для этого фильтра + + + Filter name: + имя фильтра: + + + Invalid filter name + Неправильное имя фильтра + + + The filter name cannot be left empty. + Имя фильтра не может быть пустым. + + + This filter name is already in use. + Это имя фильтра уже используется. + + + Filter testing error + Ошибка тестирования фильтра + + + Please specify a test torrent name. + Пожалуйста, укажите имя тестового торрента. + + + matches + совпадения + + + does not match + не совпадают + + + Select file to import + Выберите файл для импорта + + + Filters Files + Файлы фильтров + + + Import successful + Импорт завершен + + + Filters import was successful. + Импорт фильтров завершен. + + + Import failure + Ошибка при импорте + + + Filters could not be imported due to an I/O error. + Фильтры не импортированы из-за ошибки ввода/вывода. + + + Select destination file + Выберите файл назначения + + + Overwriting confirmation + Предупреждение о перезаписи + + + Are you sure you want to overwrite existing file? + Вы уверены что хотите перезаписать существующий файл? + + + Export successful + Экспорт завершен + + + Filters export was successful. + Экспорт фильтров завершен. + + + Export failure + Ошибка при экспорте + + + Filters could not be exported due to an I/O error. + Фильтры не экспортированы из-за ошибки ввода/вывода. + + + + FeedList + + Unread + Не прочитано + + + + FilterParserThread + + I/O Error + Input/Output Error + Ошибка ввода/вывода + + + Couldn't open %1 in read mode. + Невозможно открыть %1 в режиме чтения. + + + %1 is not a valid PeerGuardian P2B file. + %1 не является файлом PeerGuardian P2B. + + + + FinishedListDelegate + + KiB/s + КиБ/с + + + + FinishedTorrents + + Finished + Завершено + + + Name + i.e: file name + Имя + + + Size + i.e: file size + Размер + + + Seeds / Leechers + Раздающих/Скачивающих + + + Connected peers + Подключенные пиры + + + Progress + i.e: % downloaded + Состояние + + + DL Speed + i.e: Download speed + Скорость скач + + + UP Speed + i.e: Upload speed + Скорость загр + + + Seeds/Leechs + i.e: full/partial sources + Раздающих/Качающих + + + Status + Статус + + + Finished + i.e: Torrent has finished downloading + Завершено + + + None + i.e: No error message + Нет + + + Ratio + Соотношение + + + Leechers + i.e: full/partial sources + Качающие + + + Total uploaded + i.e: Total amount of uploaded data + Всего закачано + + + Hide or Show Column + Скрыть или показать столбец + + + Incomplete torrent in seeding list + Неполный torrent в списке раздачи + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Похоже, что состояние %1 torrent-а изменилось с 'раздается' на 'скачивается'. Хотите переместить его обратно в список закачек? (иначе torrent будет просто удален) + + + Priority + Приоритет + + + + GUI + + qBittorrent + qBittorrent + + + :: By Christophe Dumez :: Copyright (c) 2006 + ::Кристоф Дюме:: Все права защищены (c) 2006 + + + started. + начат. + + + qBittorrent + qBittorrent + + + DL Speed: + Скорость скач.: + + + kb/s + кб/с + + + UP Speed: + Скорость Загр.: + + + Open Torrent Files + Открыть файлы Torrent + + + Torrent Files + Файлы Torrent + + + Couldn't create the directory: + Невозможно создать директорию: + + + already in download list. + <file> already in download list. + уже в списке закачек. + + + kb/s + кб/с + + + Unknown + Неизвестно + + + added to download list. + добавлен в список закачек. + + + resumed. (fast resume) + восстановлен. (быстрое восстановление) + + + Unable to decode torrent file: + Невозможно декодировать torrent файл: + + + This file is either corrupted or this isn't a torrent. + Этот файл либо поврежден, либо не torrent типа. + + + Are you sure? -- qBittorrent + Вы уверены? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Вы уверены что хотите удалить все файлы из списка закачек? + + + &Yes + &Да + + + &No + &Нет + + + Download list cleared. + Список закачек очищен. + + + Are you sure you want to delete the selected item(s) in download list? + Вы уверены что хотите удалить выделенные пункты из списка закачек? + + + removed. + <file> removed. + удален. + + + Listening on port: + Прослушивание порта: + + + paused + приостановлено + + + All Downloads Paused. + Все Закачки приостановлены. + + + started + начато + + + All Downloads Resumed. + Все Закачки Восстановлены. + + + paused. + <file> paused. + приостановлен. + + + resumed. + <file> resumed. + восстановлен. + + + <b>Connection Status:</b><br>Online + <b>Состояние соединения:</b><br>В сети + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Состояние соединения:</b><br>Работает файервол?<br><i>Нет входящих соединений...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Состояние соединения:</b><br>Отключено?<br><i>Пэры не найдены...</i> + + + has finished downloading. + скачивание завершено. + + + Couldn't listen on any of the given ports. + Невозможно прослушать ни один из заданных портов. + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Скорость скач.: + + + /s + <unit>/seconds + + + + Finished + Закончено + + + Checking... + Проверка... + + + Connecting... + Подключение... + + + Downloading... + Скачивание... + + + m + minutes + м + + + h + hours + ч + + + d + days + д + + + None + Нет + + + Empty search pattern + Закончено + + + Please type a search pattern first + Пожалуйста, наберите сначала шаблон поиска + + + No seach engine selected + Не выбрано ни одного поискового двигателя + + + You must select at least one search engine. + Вы должны выбрать по меньшей мере один поисковый двигатель. + + + Could not create search plugin. + Невозможно создать плагин поиска. + + + Searching... + Поиск... + + + Error during search + Ошибка во время поиска + + + KB/s + кб/с + + + KB/s + кб/с + + + I/O Error + Ошибка ввода/вывода + + + Torrent file URL + URL Torrent файла + + + Torrent file URL: + URL Torrent файла: + + + Are you sure you want to quit? -- qBittorrent + Вы уверены, что хотите выйти? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Вы уверены, что хотите выйти из qbittorrent? + + + KiB/s + КиБ/с + + + KiB/s + КиБ/с + + + Stalled + Заглохло + + + Search is finished + Поиск завершен + + + An error occured during search... + Во время поиска произошла ошибка... + + + Search aborted + Поиск прерван + + + Search returned no results + Поиск не дал результатов + + + Search is Finished + Поиск завершен + + + Search plugin update -- qBittorrent + Обновление поискового плагина -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Поиковый плагин может быть обновлен, вы хотите обновить его? + +Список изменений: + + + + Sorry, update server is temporarily unavailable. + Извините, сервер обновлений временно недоступен. + + + Your search plugin is already up to date. + Ваш поисковый плагин не нуждается в обновлении. + + + Results + Результаты + + + Name + Имя + + + Size + Размер + + + Progress + Прогресс + + + DL Speed + Скорость скач + + + UP Speed + Скорость загр + + + Status + Статус + + + ETA + ETA + + + Seeders + Сидеры + + + Leechers + Личеры + + + Search engine + Поисковои сэрвис + + + Stalled + state of a torrent whose DL Speed is 0 + Заглохло + + + Paused + Пауза + + + Preview process already running + Процесс предпросмотра уже работает + + + There is already another preview process running. +Please close the other one first. + Есть уже другой процесс предпросмотра. +Пожалуйста закроите процесс. + + + Couldn't download + Couldn't download <file> + Не могу загрузить + + + reason: + Reason why the download failed + причина: + + + Downloading + Example: Downloading www.example.com/test.torrent + Скачивание + + + Please wait... + Пожалуйста подождите... + + + Transfers + Передачи + + + Are you sure you want to quit qBittorrent? + Вы действительно хотите покинуть qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Вы действительно хотите удалить выбранный(-е) элемент(ы) из списка скачек и с жесткого диска? + + + Download finished + Скачивание завершено + + + has finished downloading. + <filename> has finished downloading. + скачивание завершено. + + + Search Engine + Поисковый движок + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Состояние связи: + + + Offline + Не в сети + + + No peers found... + Не найдено пиров... + + + Name + i.e: file name + Имя + + + Size + i.e: file size + Размер + + + Progress + i.e: % downloaded + Состояние + + + DL Speed + i.e: Download speed + Скорость скач + + + UP Speed + i.e: Upload speed + Скорость загр + + + Seeds/Leechs + i.e: full/partial sources + Раздающих/Качающих + + + ETA + i.e: Estimated Time of Arrival / Time left + Оцен. время + + + Seeders + i.e: Number of full sources + Раздающие + + + Leechers + i.e: Number of partial sources + Качающие + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 запущен. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Скорость скач.: %1 KiB/с + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Скорость загр.: %1 KiB/с + + + Finished + i.e: Torrent has finished downloading + Завершено + + + Checking... + i.e: Checking already downloaded parts... + Проверка... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Простаивает + + + Are you sure you want to quit? + Вы действительно хотите выйти? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' был удален. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавлен в список закачек. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' запущен. (быстрый запуск) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' уже присутствует в списке закачек. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не удалось раскодировать torrent файл: '%1' + + + None + i.e: No error message + Нет + + + Listening on port: %1 + e.g: Listening on port: 1666 + Прослушивание порта: %1 + + + All downloads were paused. + Все закачки были приостановлены. + + + '%1' paused. + xxx.avi paused. + '%1' приостановлен. + + + Connecting... + i.e: Connecting to the tracker... + Подключение... + + + All downloads were resumed. + Все закачки были возобновлены. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' возобновлен. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + скачивание %1 завершено. + + + I/O Error + i.e: Input/Output Error + Ошибка ввода/вывода + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + При попытке чтения/записи %1 произошла ошибка. Возможно, на диске не хватает места, закачка приостановлена + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Произошла ошибка (нет места?), '%1' остановлен. + + + Connection Status: + Состояние связи: + + + Online + В сети + + + Firewalled? + i.e: Behind a firewall/router? + Файерволл? + + + No incoming connections... + Нет входящих соединений... + + + No search engine selected + Не выбран движок для поиска + + + Search plugin update + Проверить наличие обновлений для плагинов + + + Search has finished + Поиск завершен + + + Results + i.e: Search results + Результаты + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Скачивание '%1', подождите... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Произошла ошибка (нет места?), '%1' приостановлен. + + + Search + Поиск + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Произошла ошибка ввода/вывода для торрента %1. +Причина: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent привязан к порту: %1 + + + DHT support [ON], port: %1 + Поддержка DHT [Вкл], порт: %1 + + + DHT support [OFF] + Поддержка DHT [Выкл] + + + PeX support [ON] + Поддержка PeX [Вкл] + + + PeX support [OFF] + Поддержка PeX [Выкл] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Список закачек не пуст. +Вы хотите выйти из qBittorrent? + + + Downloads + Закачки + + + Are you sure you want to delete the selected item(s) in finished list? + Вы уверены что хотите удалить выделенные пункты из списка завершенных? + + + UPnP support [ON] + Поддержка UPnP [Вкл] + + + Be careful, sharing copyrighted material without permission is against the law. + Осторожнее, раздача материалов защищенных авторскими правами, преследуется по закону. + + + Encryption support [ON] + Поддержка шифрования [Вкл] + + + Encryption support [FORCED] + Поддержка шифрования [Принудительно] + + + Encryption support [OFF] + Поддержка шифрования [Выкл] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>был заблокирован</i> + + + Ratio + Соотношение + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Ошибка при скачивании URL + + + Couldn't download file at url: %1, reason: %2. + Невозможно скачать файл по URL: %1, причина: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Быстрое восстановление данных для torrentа %1 было невозможно, проверка заново... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Вы действительно хотите удалить выбранный(-е) элемент(ы) из списка скачек и с жесткого диска? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Вы действительно хотите удалить выбранный(-е) элемент(ы) из списка законченных скачек и с жесткого диска? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' был удален навсегда. + + + Url seed lookup failed for url: %1, message: %2 + Поиск раздающего Url не удался: %1, сообщение: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent привязан к порту: TCP/%1 + + + UPnP support [OFF] + Поддержка UPnP [Выкл] + + + NAT-PMP support [ON] + Поддержка NAT-PMP [Вкл] + + + NAT-PMP support [OFF] + Поддержка NAT-PMP [Выкл] + + + DHT support [ON], port: UDP/%1 + Поддержка DHT [Вкл.], порт: UDP/%1 + + + Local Peer Discovery [ON] + Обнаружение локальных пиров [Вкл] + + + Local Peer Discovery support [OFF] + Обнаружение локальных пиров [Выкл] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' был удален, так как его соотношение достигло максимально установленного вами. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Скач: %2КиБ/с, Загр: %3КиБ/с) + + + DL: %1 KiB/s + Скач: %1 КиБ/с + + + UP: %1 KiB/s + Загр: %1 КиБ/с + + + Ratio: %1 + Соотношение: %1 + + + DHT: %1 nodes + DHT: %1 узлов + + + No direct connections. This may indicate network configuration problems. + Нет прямых соединений. Причиной этого могут быть проблемы в настройке сети. + + + Uploads + Раздачи + + + Options were saved successfully. + Настройки были успешно сохранены. + + + + MainWindow + + Log: + Лог: + + + Total DL Speed: + Общая скорость скач.: + + + Kb/s + Кб/с + + + Total UP Speed: + Общая скорость загр.: + + + Name + Имя + + + Size + Размер + + + % DL + % Скач + + + DL Speed + Скорость скач + + + UP Speed + Скорость загр + + + Status + Статус + + + ETA + ETA + + + &Options + &Настройки + + + &Edit + &Изменить + + + &File + &Файл + + + &Help + &Помощь + + + Open + Открыть + + + Exit + Выход + + + Preferences + Предпочтения + + + About + О программе + + + Start + Возобновить + + + Pause + Приостановить + + + Delete + Удалить + + + Pause All + Приостановить Все + + + Start All + Возобновить Все + + + Documentation + Документация + + + Delete All + Удалить Все + + + Torrent Properties + Свойства torrent-а + + + Connection Status + Состояние соединения + + + Downloads + Закачки + + + Search + Поиск + + + Search Pattern: + Шаблон поиска: + + + Stop + Остановить + + + Status: + Состояние: + + + Stopped + Остановлено + + + Search Engines + Поисковики + + + Results: + Результаты: + + + Seeds + Источники + + + Leechers + Личеры + + + Search Engine + Поисковик + + + Download + Закачать + + + Clear + Очистить + + + Download from URL + Закачать из URL + + + KiB/s + КиБ/с + + + Create torrent + Создать поток + + + Ratio: + Соотношение: + + + Update search plugin + Обновить плагин поиска + + + Session ratio: + Сеансовый коэффициент: + + + Transfers + Передачи + + + Preview file + Фаил предпросмотра + + + Clear log + Очистить лог + + + Delete Permanently + Удалить навсегда + + + Visit website + Посетить веб-сайт + + + Report a bug + Сообщить об ошибке + + + Set upload limit + Установить ограничение раздачи + + + Set download limit + Установить ограничение закачки + + + Log + Лог + + + IP filter + Фильтр по IP + + + Set global download limit + Установить глобальное ораничение закачки + + + Set global upload limit + Установить глобальное ограничение раздачи + + + Options + Параметры + + + Decrease priority + Понизить приоритет + + + Increase priority + Повысить приоритет + + + Console + Консоль + + + + PropListDelegate + + False + Нет + + + True + Да + + + Ignored + Игнорировано + + + Normal + Normal (priority) + Обычный + + + High + High (priority) + Высокий + + + Maximum + Maximum (priority) + Максимальный + + + + QTextEdit + + Clear + Очистить + + + + RSS + + Search + Поиск + + + Delete + Удалить + + + Rename + Переименовать + + + Refresh + Обновить + + + Create + Создать + + + Delete selected streams + Удалить выбранные потоки + + + Refresh RSS streams + Обновить RSS потоки + + + Add a new RSS stream + Добавить новый RSS поток + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Новости:</b> <i>(двойной клик откроет ссылку в вашем браузере)</i> + + + Add RSS stream + Добавить RSS поток + + + Refresh all streams + Обновить все потоки + + + RSS streams: + RSS потоки: + + + 2 + 2 + + + Mark all as read + Отметить все как прочитанное + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Торренты:</span> <span style=" font-style:italic;">(дважды щелкните для загрузки)</span></p></body></html> + + + Download torrent + Скачать торрент + + + Open news URL + Открыть новый URL + + + Copy feed URL + Скопировать URL канала + + + RSS feed downloader + Загрузка RSS канала + + + New subscription + Новая подписка + + + Mark items read + Отметить элементы как прочитанные + + + Update all + Обновить все + + + Update all feeds + Обновить все каналы + + + RSS feeds + RSS каналы + + + Update + Обновить + + + New folder + Новая папка + + + 1 + 1 + + + Feed URL + URL канала + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Введите URL RSS потока + + + Stream URL: + URL потока: + + + Please choose a new name for this stream + Выберите новое имя для потока + + + New stream name: + Новое имя потока: + + + Are you sure? -- qBittorrent + Вы уверены? -- qBittorrent + + + &Yes + &Да + + + &No + &Нет + + + Are you sure you want to delete this stream from the list? + Вы уверены что хотите удалить этот поток из списка? + + + Description: + Описание: + + + url: + URL: + + + Last refresh: + Последнее обновление: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Этот RSS канал уже в списке. + + + Date: + Дата: + + + Author: + Автор: + + + Please choose a folder name + Выберите имя папки + + + Folder name: + Имя папки: + + + New folder + Новая папка + + + Are you sure you want to delete these elements from the list? + Вы уверены что хотите удалить эти элементы из списка? + + + Are you sure you want to delete this element from the list? + Вы уверены что хотите удалить этот элемент из списка? + + + Please choose a new name for this RSS feed + Укажите новое имя для этого RSS канала + + + New feed name: + Новое имя канала: + + + Name already in use + Имя уже используется + + + This name is already used by another item, please choose another one. + Это имя уже используется. Выберите другое. + + + Overwrite attempt + Подтверждение перезаписи + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Вы не можете перезаписать %1. + + + Unread + Не прочитано + + + + RssItem + + No description available + Описание недоступно + + + + RssStream + + %1 ago + 10min ago + %1 назад + + + Never + Никогда + + + Automatically downloading %1 torrent from %2 RSS feed... + Автоматически загрузить %1 торрент с %2 RSS канала... + + + + SearchCategories + + All categories + Все категории + + + Movies + Фильмы + + + TV shows + ТВ-шоу + + + Music + Музыка + + + Games + Игры + + + Anime + Аниме + + + Software + Программы + + + Pictures + Изображения + + + Books + Книги + + + + SearchEngine + + Name + i.e: file name + Имя + + + Size + i.e: file size + Размер + + + Seeders + i.e: Number of full sources + Раздающие + + + Leechers + i.e: Number of partial sources + Скачивающие + + + Search engine + Поисковый сервис + + + Empty search pattern + Очистить шаблон поиска + + + Please type a search pattern first + Пожалуйста, наберите сначала шаблон поиска + + + No search engine selected + Не выбран движок для поиска + + + You must select at least one search engine. + Вы должны выбрать по меньшей мере один поисковый двигатель. + + + Results + Результаты + + + Searching... + Поиск... + + + Search plugin update -- qBittorrent + Обновление поискового плагина -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Поиковый плагин может быть обновлен, вы хотите обновить его? + +Список изменений: + + + + &Yes + &Да + + + &No + &Нет + + + Search plugin update + Проверить наличие обновлений для плагинов + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Извините, сервер обновлений временно недоступен. + + + Your search plugin is already up to date. + Ваш поисковый плагин не нуждается в обновлении. + + + Cut + Вырезать + + + Copy + Копировать + + + Paste + Вставить + + + Clear field + Очистить поле + + + Clear completion history + Очистить историю + + + Search Engine + Поисковый движок + + + Search has finished + Поиск завершен + + + An error occured during search... + Во время поиска произошла ошибка... + + + Search aborted + Поиск прерван + + + Search returned no results + Поиск не дал результатов + + + Results + i.e: Search results + Результаты + + + Search plugin download error + Ошибка скачивания плагина + + + Couldn't download search plugin update at url: %1, reason: %2. + Невозможно скачать обновления поискового плагина по ссылке: %1, причина: %2. + + + Unknown + Неизвестно + + + + SearchTab + + Name + i.e: file name + Имя + + + Size + i.e: file size + Размер + + + Seeders + i.e: Number of full sources + Раздающие + + + Leechers + i.e: Number of partial sources + Скачивающие + + + Search engine + Поисковый движок + + + + TrackersAdditionDlg + + Trackers addition dialog + Диалог добавление трекеров + + + List of trackers to add (one per line): + Список трекеров для добавление (один трекер на строку): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Пожалуйста, свяжитесь со мной если вы хотите перевести qBittorrent на свой язык. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хочу поблагодарить следующих людей, кто вызвался перевести qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <li>Я хочу поблагодарить sourceforge.net за предоставление хостинга проекту qBittorrent.</li></ul> + + + <li>I also like to thank Jeffery Fernandez, our RPM packager, for his great work.</li></ul> + <li>Я также хочу поблагодарить Джеффри Фернандеса (Jeffery Fernandez), нашего RPM упаковщика, за его отличную работу.</li></ul> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Я также хочу поблагодарить Джеффри Фернандеса (Jeffery Fernandez -developer@jefferyfernandez.id.au), нашего RPM упаковщика, за его отличную работу.</li></ul> + + + Preview impossible + Предпросмотр невозможен + + + Sorry, we can't preview this file + Извините, предпросмотр невозможен + + + Name + Имя + + + Size + Размер + + + Progress + Прогресс + + + No URL entered + URL не введен + + + Please type at least one URL. + Пожалуста введите минимум один URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Пожалуйста, свяжитесь со мной, если хотите перевести qBittorrent на свой язык. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хочу поблагодарить следующих людей, кто вызвался перевести qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Пожалуйста, свяжитесь со мной, если хотите перевести qBittorrent на свой язык. + + + + addTorrentDialog + + Torrent addition dialog + Окно добавления torrent-а + + + Save path: + Путь сохранения: + + + ... + ... + + + Torrent content: + Содержимое torrent-а: + + + File name + Имя файла + + + File size + Размер файла + + + Selected + Выбрано + + + Download in correct order (slower but good for previewing) + Загрузить в правильном порядке (медленнее, но удобнее для предпросмотра) + + + Add to download list in paused state + Добавить в список закачек в приостановленном состоянии + + + Add + Добавить + + + Cancel + Отмена + + + select + выбрать + + + Unselect + Снять выделение + + + Select + Выбрать + + + Ignored + Игнорировано + + + Normal + Обычный + + + High + Высокий + + + Maximum + Максимальный + + + Collapse all + Свернуть все + + + Expand all + Развернуть все + + + Torrent size: + Размер торрента: + + + Unknown + Неизвестно + + + Free disk space: + Свободное место на диске: + + + Download in sequential order (slower but good for previewing) + Загружать последовательно (медленнее но удобнее для предпросмотра) + + + + authentication + + Tracker authentication + Аутентификация Трэкера + + + Tracker: + Трэкер: + + + Login + Логин + + + Username: + Имя пользователя: + + + Password: + Пароль: + + + Log in + Вход + + + Cancel + Отмена + + + + bandwidth_dlg + + Bandwidth allocation + Распределение пропускной способности канала + + + KiB/s + КиБ/с + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 достиг установленного вами максимального соотношения. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' был удален навсегда. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' был удален. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' приостановлен. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' возобновлен. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' уже присутствует в списке закачек. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' возобновлен. (быстрое возобновление) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' добавлен в список закачек. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Не удалось декодировать torrent файл: '%1' + + + This file is either corrupted or this isn't a torrent. + Этот файл либо поврежден, либо не torrent типа. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>был заблокирован в соответствии с вашим IP фильтром</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>был заблокирован из-за поврежденных кусочков</i> + + + Couldn't listen on any of the given ports. + Невозможно прослушать ни один из заданных портов. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + Распределение портов UPnP/NAT-PMP не удалось с сообщением: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + Распределение портов UPnP/NAT-PMP прошло успешно: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Быстрое восстановление данных для torrentа %1 было невозможно, проверка заново... + + + Url seed lookup failed for url: %1, message: %2 + Поиск раздающего Url не удался: %1, сообщение: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Скачивание '%1', подождите... + + + '%1' is not a valid magnet URI. + '%1' не является magnet URI. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Рекурсивная загрузка файла %1 ввстроенного в торрент %2 + + + Unable to decode %1 torrent file. + Не удалось декодировать %1 torrent файл. + + + + createTorrentDialog + + Create Torrent file + Создать файл Torrent + + + Comment: + Комментарий: + + + ... + ... + + + Create + Создать + + + Cancel + Отмена + + + Directory + Папка + + + Torrent Creation Tool + Инструмент для создания Torrent-ов + + + <center>Destination torrent file:</center> + <center>torrent файл назначения:</center> + + + <center>Input file or directory:</center> + <center>Входной файл или папка:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Анонс-URL:<br>(По одной на строку)</center> + + + <center>Comment:</center> + <center>Комментарий:</center> + + + Torrent file creation + Создание Torrent файла + + + Input files or directories: + Входные файлы или папки: + + + Announce urls (trackers): + Аоносирующие ссылки (трэкеров): + + + Comment (optional): + Комментарий (необязателен): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Закрытый (не будет передаваться через безтрекерную сеть / DHT при включении) + + + Destination torrent file: + Имя Torrent файла назначения: + + + Web seeds urls (optional): + Ссылки на веб раздачи (необязательно): + + + File or folder to add to the torrent: + Файл или папка для добавления в torrent: + + + Add a file + Добавить файл + + + Add a folder + Добавить папку + + + Piece size: + Размер кусочка: + + + 32 KiB + 32 КиБ + + + 64 KiB + 64 КиБ + + + 128 KiB + 128 КиБ + + + 256 KiB + 256 КиБ + + + 512 KiB + 512 КиБ + + + 1 MiB + 1 МиБ + + + 2 MiB + 2 МиБ + + + 4 MiB + 4 МиБ + + + Private (won't be distributed on DHT network if enabled) + Закрытый (не будет передаваться через безтрекерную сеть / DHT при включении) + + + Start seeding after creation + Начать раздавать после создания + + + Create and save... + Создать и сохранить... + + + Progress: + Прогресс: + + + Add file + Добавить файл + + + Add folder + Добавить папку + + + + createtorrent + + Select destination torrent file + Выберите torrent файл назначения + + + Torrent Files + Файлы Torrent + + + Select input directory or file + Выберите входной файл или папку + + + No destination path set + Не установлен путь назначения + + + Please type a destination path first + Пожалуйста, сначала введите путь назначения + + + No input path set + Не установлен входной путь + + + Please type an input path first + Пожалуйста, сначала введите путь назначения + + + Input path does not exist + Несуществующий входной путь + + + Please type a correct input path first + Пожалуйста, сначала введите правильный входной путь + + + Torrent creation + Создание Torrent-а + + + Torrent was created successfully: + Torrent успешно создан: + + + Please type a valid input path first + Пожалуйста, введите сначала правильный путь входа + + + Select a folder to add to the torrent + Выберите папку для добавления torrent-а + + + Select files to add to the torrent + Выберите файлы для добавления в torrent + + + Please type an announce URL + Введите ссылку анонсирования + + + Torrent creation was unsuccessful, reason: %1 + Создание torrent-а не завершено, причина: %1 + + + Announce URL: + Tracker URL + Анонсирующий URL: + + + Please type a web seed url + Введите URL веб раздачи + + + Web seed URL: + URL веб раздачи: + + + Select a file to add to the torrent + Выберите файл для добавления в torrent + + + No tracker path set + Нет пути трекера + + + Please set at least one tracker + Пожалуйста, пропишите хотя бы один трекер + + + Created torrent file is invalid. It won't be added to download list. + Созданный torrent файл испорчен. Он не будет добавлен в список закачек. + + + + downloadFromURL + + Download Torrents from URLs + Загрузить торреннт из URL + + + Only one URL per line + Толко один URL в строке + + + Download + Закачать + + + Cancel + Отмена + + + Download from urls + Загрузить Torrent(ы) из URL(s) + + + No URL entered + URL не введен + + + Please type at least one URL. + Пожалуста введите минимум один URL. + + + + downloading + + Search + Поиск + + + Total DL Speed: + Общая скорость скач.: + + + KiB/s + КиБ/с + + + Session ratio: + Сеансовое соотношение: + + + Total UP Speed: + Общая скорость загр.: + + + Log + Лог + + + IP filter + Фильтр по IP + + + Start + Начать + + + Pause + Приостановить + + + Delete + Удалить + + + Clear + Очистить + + + Preview file + Просмотреть файл + + + Set upload limit + Установить предел загрузки + + + Set download limit + Установить предел скачивания + + + Delete Permanently + Удалить навсегда + + + Torrent Properties + Свойства torrentа + + + Open destination folder + Открыть папку назначения + + + Name + Имя + + + Size + Размер + + + Progress + Прогресс + + + DLSpeed + Скорость скач + + + UpSpeed + Скорость загр + + + Seeds/Leechs + Раздающих/Скачивающих + + + Ratio + Соотношение + + + ETA + Оцен. время + + + Buy it + Купить + + + Priority + Приоритет + + + Increase priority + Повысить приоритет + + + Decrease priority + Понизить приоритет + + + Force recheck + Проверить принудительно + + + Copy magnet link + Скопировать ссылку magnet + + + + engineSelect + + Search plugins + Плагины поиска + + + Installed search engines: + Установленные плагины поиска: + + + Name + Имя + + + Url + Ссылка + + + Enabled + Включено + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Здесь вы можете скачать новые плагины поиска: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Установить новый + + + Check for updates + Проверить обновления + + + Close + Закрыть + + + Enable + Включить + + + Disable + Отключить + + + Uninstall + Удалить + + + + engineSelectDlg + + True + Да + + + False + Нет + + + Uninstall warning + Предупреждение об удалении + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Некоторые плагины не могут быть удалены, так как включены в qBittorrent. +Удалены могут быть лишь те, что вы установили сами. +Но все равно, эти плагины будут отключены. + + + Uninstall success + Удаление произведено + + + All selected plugins were uninstalled successfuly + Все выбранные плагины успешно удалены + + + Select search plugins + Выбрать поисковые движки + + + qBittorrent search plugins + Плагин поиска qBittorrent + + + Search plugin install + Установка поискового плагина + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Самая последняя версия поискового движка %1 уже установлена. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Плагин поискового движка %1 был успешно обновлен. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Плагин поискового движка %1 был успешно установлен. + + + Search plugin update + Обновление поисковых плагинов + + + Sorry, update server is temporarily unavailable. + Извините, сервер обновлений временно недоступен. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Поисковый движок %1 был успешно обновлен. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Извините, произошла ошибка при обновлении поискового плагина %1. + + + All your plugins are already up to date. + Все ваши плагины имеют последнии версии. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Плагин поискового движка %1 не может быть обновлен, осталась старая версия. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Плагин поискового движка %1 не может быть установлен. + + + All selected plugins were uninstalled successfully + Все выбранные плагины были успешно удалены + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Плагин поискового движка %1 был успешно обновлен. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Плагин поискового движка %1 был успешно установлен. + + + Search engine plugin archive could not be read. + Архив плагина поискового движка не может буть прочитан. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Извините, установка поискового плагина %1 не удалась. + + + New search engine plugin URL + URL нового плагина поискового движка + + + URL: + URL: + + + Yes + Да + + + No + Нет + + + + misc + + B + bytes + Б + + + KiB + kibibytes (1024 bytes) + КиБ + + + MiB + mebibytes (1024 kibibytes) + МиБ + + + GiB + gibibytes (1024 mibibytes) + ГиБ + + + TiB + tebibytes (1024 gibibytes) + ТиБ + + + m + minutes + м + + + h + hours + ч + + + d + days + д + + + Unknown + Неизвестно + + + h + hours + ч + + + d + days + д + + + Unknown + Unknown (size) + Неизвестно + + + < 1m + < 1 minute + < 1м + + + %1m + e.g: 10minutes + %1м + + + %1h%2m + e.g: 3hours 5minutes + %1ч%2м + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1д%2ч%3м + + + + options_imp + + Options saved successfully! + Настройки успешно сохранены! + + + Choose Scan Directory + Выберите директорию для сканирования + + + Choose save Directory + Выберите директорию для сохранения + + + Choose ipfilter.dat file + Выберите файл ipfilter.dat + + + I/O Error + Ошибка ввода/вывода + + + Couldn't open: + Невозможно открыть: + + + in read mode. + в режиме чтения. + + + Invalid Line + Неправильная строка + + + Line + Строка + + + is malformed. + поврежден. + + + Range Start IP + Начальный IP диапазона + + + Start IP: + Начальный IP: + + + Incorrect IP + Неправильный IP + + + This IP is incorrect. + Этот IP некорректен. + + + Range End IP + Конечный IP диапазона + + + End IP: + Конечный IP: + + + IP Range Comment + Комментарий к диапазону IP + + + Comment: + Комментарий: + + + to + <min port> to <max port> + кому + + + Choose your favourite preview program + Выберите вашу любимую программу для предпросмотра + + + Invalid IP + Неверный IP + + + This IP is invalid. + Этот IP неправилен. + + + Options were saved successfully. + Настройки были успешно сохранены. + + + Choose scan directory + Выберите директорию для сканирования + + + Choose an ipfilter.dat file + Выберите файл ipfilter.dat + + + Choose a save directory + Выберите путь сохранения + + + I/O Error + Input/Output Error + Ошибка ввода/вывода + + + Couldn't open %1 in read mode. + Невозможно открыть %1 в режиме чтения. + + + Choose an ip filter file + Укажите файл ip фильтра + + + Filters + Фильтры + + + + pluginSourceDlg + + Plugin source + Код плагина + + + Search plugin source: + Код поискового плагина: + + + Local file + Локальный файл + + + Web link + Веб ссылка + + + + preview + + Preview selection + Выбор предпросмотра + + + File preview + Предпросмотр файла + + + The following files support previewing, <br>please select one of them: + Следующее файлы поддерживают предпросмотр, <br>выберите одно из них: + + + Preview + Предпросмотр + + + Cancel + Отмена + + + + previewSelect + + Preview impossible + Предпросмотр невозможен + + + Sorry, we can't preview this file + Извините, предпросмотр этого файла невозможен + + + Name + Имя + + + Size + Размер + + + Progress + Состояние + + + + properties + + Torrent Properties + Свойства Torrent + + + Main Infos + Главная информация + + + File Name + Имя Файла + + + Download state: + Состояние скачивания: + + + Number of Peers: + Число пэров: + + + Tracker + Трэкер + + + Trackers: + Трэкеры: + + + Current Tracker: + Текущий трэкер: + + + Errors: + Ошибки: + + + Current Session + Текущая сессия + + + Total Uploaded: + Всего закачано: + + + Total Downloaded: + Всего скачано: + + + Total Failed: + Всего неудач: + + + Torrent Content + Содержимое Torrent + + + Files contained in current torrent: + Файлы, содержащиеся в текущем torrent-е: + + + Size + Размер + + + Selected + Выбрано + + + Unselect + Отменить выбор + + + Select + Выбрать + + + You can select here precisely which files you want to download in current torrent. + Здесь вы можете выбрать заранее, какие файлы вы хотите скачать из текущего torrent-а. + + + OK + OK + + + Finished + Завершено + + + Queued for checking + В очереди на проверку + + + Checking files + Проверка файлов + + + Connecting to tracker + Подключение к трэкеру + + + Downloading Metadata + Скачивание Метаданных + + + Downloading + Скачивание + + + Seeding + Рассеивание + + + Allocating + Нахождение + + + None - Unreachable? + Нет - Недостигаемо? + + + Unknown + Неизвестно + + + Complete: + Завершено: + + + Partial: + Частично: + + + False + Нет + + + True + Да + + + Progress + Прогресс + + + Main infos + Основная информация + + + Number of peers: + Число пэров: + + + Current tracker: + Текущий трэкер: + + + Total uploaded: + Всего загружено: + + + Main info + Главная информация + + + Torrent information + Информация torrent-а + + + Total downloaded: + Всего скачено: + + + Total failed: + Всего неудачно: + + + Torrent content + Содержимое Torrent-a + + + Options + Опции + + + Download in correct order (slower but good for previewing) + Загрузить в правильном порядке + + + Share Ratio: + Соотношение разлачи: + + + Seeders: + Сидеры: + + + Leechers: + Личеры: + + + Save path: + Путь сохранения: + + + Torrent infos + Информация torrent-а + + + Creator: + Создатель: + + + Torrent hash: + Хэш torrentа: + + + Comment: + Комментарий: + + + Current session + Текущая сессия + + + Share ratio: + Соотношение раздачи: + + + Trackers + Трэкеры + + + New tracker + Новый трекер + + + New tracker url: + URL нового трекера: + + + Priorities: + Приоритеты: + + + Normal: normal priority. Download order is dependent on availability + Обычный: обычный приоритет. Порядок скачивания зависит от степени доступности + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Высокий: приоритет выше обычного. Кусочки скачиваются раньше, чем нормальные при одной доступности, но не раньше более доступных + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Максимум: максимальный приоритет, доступность игнорируется, скачиваются в первую очередь при любой доступности + + + File name + Имя файла + + + Priority + Приоритет + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Список трекеров не может быть пуст. + + + Ignored: file is not downloaded at all + Игнорирован: файл не будет скачан + + + Ignored + Проигнорирован + + + Normal + Обычный + + + Maximum + Максимум + + + High + Высокий + + + Url seeds + URL раздающих + + + New url seed: + URL нового раздающего: + + + This url seed is already in the list. + Этот URL раздающего уже в списке. + + + Hard-coded url seeds cannot be deleted. + Прописанные в коде URL раздающих не могут быть удалены. + + + None + i.e: No error message + Нет + + + New url seed + New HTTP source + Новый URL раздачи + + + The following url seeds are available for this torrent: + Для данного torrentа доступны следующие URL раздач: + + + Priorities error + Ошибка приоритетов + + + Error, you can't filter all the files in a torrent. + Ошибка, вы не можете отфильтровать все файлы в torrentе. + + + Downloaded pieces + Закаченые кусочки + + + Collapse all + Свернуть все + + + Expand all + Развернуть все + + + ... + ... + + + Choose save path + Выберите путь сохранения + + + Save path creation error + Ошибка создания пути сохранения + + + Could not create the save path + Невозможно создать путь сохранения + + + + search_engine + + Search + Поиск + + + Search Engines + Поисковики + + + Search Pattern: + Шаблон поиска: + + + Stop + Остановить + + + Status: + Состояние: + + + Stopped + Остановлено + + + Results: + Результаты: + + + Download + Скачать + + + Clear + Очистить + + + Update search plugin + Обновить плагин поиска + + + Search engines... + Поисковые движки... + + + + seeding + + Search + Поиск + + + The following torrents are finished and shared: + Следующие torrentы завершены и раздаются: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Замечание:</u>Важно, чтобы скачанные файлы раздавались какое-то время после скачивания, иначе вы будете забанены на трекере. + + + Start + Начать + + + Pause + Приостановить + + + Delete + Удалить + + + Delete Permanently + Удалить навсегда + + + Torrent Properties + Свойства torrentа + + + Preview file + Предпросмотр фаила + + + Set upload limit + Установить предел загрузки + + + Open destination folder + Открыть папку назначения + + + Name + Имя + + + Size + Размер + + + Upload Speed + Скорость Загр + + + Connected peers + Подключенные пиры + + + Seeds / Leechers + Раздающих/Скачивающих + + + Leechers + Скачивающие + + + Ratio + Соотношение + + + Buy it + Купить + + + Total uploaded + Всего закачано + + + Priority + Приоритет + + + Increase priority + Повысить приоритет + + + Decrease priority + Понизить приоритет + + + Force recheck + Проверить принудительно + + + Copy magnet link + Скопировать ссылку magnet + + + + subDownloadThread + + Host is unreachable + Хост недоступен + + + File was not found (404) + Файл не был найден (404) + + + Connection was denied + Подключение было отклонено + + + Url is invalid + URL некорректен + + + Connection forbidden (403) + Подключение запрещено (403) + + + Connection was not authorized (401) + Соединение не авторизовано (401) + + + Content has moved (301) + Содержимое было перенесено (301) + + + Connection failure + Соединение не установлено + + + Connection was timed out + Тайм-аут соединения + + + Incorrect network interface + Неправильный интерфейс сети + + + Unknown error + Неизвестная ошибка + + + Could not resolve proxy + Не удалось соединиться с Прокси + + + I/O Error + Ошибка ввода/вывода + + + + torrentAdditionDialog + + True + Да + + + Unable to decode torrent file: + Невозможно декодировать torrent файл: + + + This file is either corrupted or this isn't a torrent. + Этот файл либо поврежден, либо не torrent типа. + + + Choose save path + Выберите путь сохранения + + + False + Нет + + + Empty save path + Очистить путь сохранения + + + Please enter a save path + Пожалуйста, введите путь сохранения + + + Save path creation error + Ошибка создания пути сохранения + + + Could not create the save path + Невозможно создать путь сохранения + + + Invalid file selection + Неправильное выделение файлов + + + You must select at least one file in the torrent + Вы должны выбрать по меньшей мере один файл в torrentе + + + File name + Имя файла + + + Size + Размер + + + Progress + Прогресс + + + Priority + Приоритет + + + Unknown + Неизвестно + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 останется после загрузки торрента) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (на %1 больше нужно для загрузки) + + + diff --git a/src/lang/qbittorrent_sk.qm b/src/lang/qbittorrent_sk.qm new file mode 100644 index 0000000000000000000000000000000000000000..dd9cda5224aa5176b41fadfcab4fb2b8ed5dfccf GIT binary patch literal 69210 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%0DI{E_jgr=NMmE@r8%tIo94(tu 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 Bf|&pS literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_sk.ts b/src/lang/qbittorrent_sk.ts new file mode 100644 index 000000000..56df971cc --- /dev/null +++ b/src/lang/qbittorrent_sk.ts @@ -0,0 +1,4822 @@ + + + + + AboutDlg + + About qBittorrent + O aplikácii qBittorrent + + + About + O aplikácii + + + Author + Autor + + + Name: + Meno: + + + Country: + Krajina: + + + E-mail: + E-mail: + + + Home page: + Homepage: + + + Christophe Dumez + Christophe Dumez + + + France + Francúzsko + + + Thanks To + Poďakovanie + + + Translation + Preklad + + + License + Licencia + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Klient protokolu bittorrent za pomoci Qt4 a libtorrent, naprogramovaný v C++.<br> +<br> +Copyright © 2006, Christophe Dumez<br> +<br> <u>Homepage:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + Narodeniny: + + + Occupation: + Zamestnanie: + + + 03/05/1985 + 5.3.1985 + + + Student in computer science + študent informatiky + + + Thanks to + Poďakovanie + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Klient siete Bittorrent naprogramovaný v C++, založený na sade nástrojov Qt4</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Domovská stránka:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Limit nahrávania: + + + Download limit: + Limit sťahovania: + + + Unlimited + Unlimited (bandwidth) + neobmedzené (pásmo) + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + Konzola qBittorrent + + + General + Všeobecné + + + Blocked IPs + Zablokované IP + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Nastavenia -- qBittorrent + + + Options + Nastavenia + + + Main + Hlavný + + + Save Path: + Cesta pre uloženie: + + + Download Limit: + Limit sťahovania: + + + Upload Limit: + Limit nahrávania: + + + Max Connects: + Maximum spojení: + + + Port range: + Rozsah portov: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Vypnúť + + + connections + spojení + + + Proxy + Proxy + + + Proxy Settings + Nastavenia proxy + + + Server IP: + IP servera: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Port: + + + Proxy server requires authentication + Proxy server vyžaduje autentfikáciu + + + Authentication + Autentifikácia + + + User Name: + Používateľské meno: + + + Password: + Heslo: + + + Enable connection through a proxy server + Použi spojenie pomocou proxy servera + + + Language + Jazyk + + + Please choose your preferred language in the following list: + Zvote si preferovan jazyk zo zoznamu: + + + OK + OK + + + Cancel + Storno + + + Language settings will take effect after restart. + Nastavenia jazyka sa prejavia po retarte programu. + + + Scanned Dir: + Prezeraný adresár: + + + Enable directory scan (auto add torrent files inside) + Zapnúť prehľadávanie adresárov (automatické pridávanie torrent súborov) + + + Connection Settings + Nastavenia spojenia + + + Share ratio: + Pomer zdieľania: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Aktivovať filtrovanie IP + + + Filter Settings + Nastavenie filtra + + + Start IP + Počiatočná IP + + + End IP + Koncová IP + + + Origin + Zdroj + + + Comment + Komentár + + + Apply + Použi + + + IP Filter + IP filter + + + Add Range + Pridať rozsah + + + Remove Range + Odstrániť rozsah + + + ipfilter.dat Path: + Cesta k ipfilter.dat: + + + Clear finished downloads on exit + Vyčisti dokončené sťahovania pri skončení programu + + + Ask for confirmation on exit + Potvrdenie skončenia programu + + + Go to systray when minimizing window + Minimalizovať medzi ikony (systray) + + + Misc + Rozličné + + + Localization + Lokalizácia + + + Language: + Jazyk: + + + Behaviour + Správanie + + + OSD + OSD + + + Always display OSD + Vždy zobrazuj OSD + + + Display OSD only if window is minimized or iconified + Zobrazuj OSD iba keď je okno minimalizované alebo ikonifikované + + + Never display OSD + Nikdy nezobrazuj OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + DHT (bez trackera): + + + Disable DHT (Trackerless) support + Vypnúť podporu DHT (bez trackera) + + + Automatically clear finished downloads + Automaticky vyčistiť skončené sťahovania + + + Preview program + Program pre náhľad + + + Audio/Video player: + Audio/Video prehrávač: + + + DHT configuration + Konfigurácia DHT + + + DHT port: + Port DHT: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Pozn.:</b> Zmeny sa prejavia po reštarte qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Poznámka pre prekladateľov:</b> Ak nie je qBittorrent dostupný vo vašom jazyku <br/>a chceli by ste ho preložiť, <br/>kontaktujte ma prosím (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Zobraziť dialóg pre pridanie torrentu zakaždým, keď pridám torrent + + + Default save path + Predvolená cesta pre uloženie + + + Systray Messages + Systray správy + + + Always display systray messages + Vždy zobrazovať systray správy + + + Display systray messages only when window is hidden + Zobrazovať systray správy iba keď je okno skryté + + + Never display systray messages + Nikdy nezobrazovať systray správy + + + Disable DHT (Trackerless) + Vypnúť DHT (bez trackera) + + + Disable Peer eXchange (PeX) + Vypnúť Peer eXchange (PeX) + + + Go to systray when closing main window + Minimalizovať do systray pri zatvorení hlavného okna + + + Connection + Spojenie + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (bez trackera) + + + Torrent addition + Pridanie torrentu + + + Main window + Hlavné okno + + + Exit confirmation when the download list is not empty + Potvrdenie skončenia v prípade, že zoznam sťahovaní nie je prázdny + + + Disable systray integration + Vypnúť integráciu s oznamovacou oblasťou (systray) + + + Systray messages + Správy v oznamovacej oblasti (systray) + + + Directory scan + Sken adresárov + + + Style (Look 'n Feel) + Štýl (vzhľad a správanie) + + + Plastique style (KDE like) + Plastický štýl (ako KDE) + + + Cleanlooks style (GNOME like) + Čistý vzhľad (ako GNOME) + + + Motif style (default Qt style on Unix systems) + Štýl Motif (štandardný štýl Qt na unixových systémoch) + + + CDE style (Common Desktop Environment like) + Štýl CDE (ako Common Desktop Environment) + + + MacOS style (MacOSX only) + Štýl MacOS (iba pre MacOSX) + + + WindowsXP style (Windows XP only) + Štýl WindowsXP (iba pre Windows XP) + + + Server IP or url: + IP alebo url servera: + + + Proxy type: + Typ proxy: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Ovplyvnené spojenia + + + Use proxy for connections to trackers + Používať proxy pre spojenia s trackermi + + + Use proxy for connections to regular peers + Používať proxy pre spojenia s obyčajnými rovesníkmi + + + Use proxy for connections to web seeds + Používať proxy pre spojenia k web seedom + + + Use proxy for DHT messages + Používať proxy pre DHT správy + + + Encryption + Kryptovanie + + + Encryption state: + Stav kryptovania: + + + Enabled + Zapnuté + + + Forced + Vynútené + + + Disabled + Vypnuté + + + Preferences + Nastavenia + + + General + Všeobecné + + + Network + Sieť + + + User interface settings + Nastavenia používateľského rozhrania + + + Visual style: + Vizuálny štýl: + + + Cleanlooks style (Gnome like) + Čistý vzhľad (ako GNOME) + + + Motif style (Unix like) + Štýl Motif (ako Unix) + + + Ask for confirmation on exit when download list is not empty + Potvrdenie skončenia v prípade, že zoznam sťahovaní nie je prázdny + + + Display current speed in title bar + Zobraziť aktuálnu rýchlosť sťahovania v titulnom pruhu + + + System tray icon + Ikona v oznamovacej oblasti (systray) + + + Disable system tray icon + Vypnúť ikonu v oznamovacej oblasti + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Zatvoriť do oznamovacej oblasti + + + Minimize to tray + Minimalizovať do oznamovacej oblasti + + + Show notification balloons in tray + Zobrazovať bublinové upozornenia v oblasti upozornení + + + Media player: + Prehrávač multimédií: + + + Downloads + Sťahovania + + + Put downloads in this folder: + Sťahovať do tohoto priečinka: + + + Pre-allocate all files + Dopredu alokovať všetky súbory + + + When adding a torrent + Pri pridávaní torrentu + + + Display torrent content and some options + Zobraziť obsah torrentu a nejaké voľby + + + Do not start download automatically + The torrent will be added to download list in pause state + Nezačínať sťahovanie automaticky + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Sledovanie priečinkov + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Dvojité kliknutie v zozname prenosov + + + Download list: + Zoznam sťahovaní: + + + Seeding list: + Zoznam seedovaní: + + + Download folder: + Cieľový priečinok: + + + Temp folder: + Pridať priečinok + + + Automatically download torrents present in this folder: + Automaticky sťahovať torrenty z tohto priečinka: + + + Listening port + Počúvať na porte + + + to + i.e: 1200 to 1300 + + + + Enable UPnP port mapping + Zapnúť mapovanie portov UPnP + + + Enable NAT-PMP port mapping + Zapnúť mapovanie portov NAT-PMP + + + Global bandwidth limiting + Globálny limit pásma + + + Upload: + Nahrávanie: + + + Download: + Sťahovanie: + + + Bittorrent features + Možnosti siete Bittorrent + + + Use the same port for DHT and Bittorrent + Použiť rovnaký port pre DHT a Bittorrent + + + Type: + Typ: + + + (None) + (žiadny) + + + Proxy: + Proxy: + + + Username: + Meno používateľa: + + + Bittorrent + Bittorrent + + + Connections limit + Limit spojení + + + Global maximum number of connections: + Maximálny globálny počet spojení: + + + Maximum number of connections per torrent: + Maximálny počet spojení na torrent: + + + Maximum number of upload slots per torrent: + Maximálny počet slotov pre nahrávanie na torrent: + + + Additional Bittorrent features + Ďalšie možnosti Bittorrent + + + Enable DHT network (decentralized) + Zapnúť sieť DHT (decentralizovaná) + + + Enable Peer eXchange (PeX) + Zapnúť Peer eXchange (PeX) + + + Enable Local Peer Discovery + Zapnúť Local Peer Discovery + + + Encryption: + Šifrovanie: + + + Share ratio settings + Nastavenia pomeru zdieľania + + + Desired ratio: + Požadovaný pomer: + + + Filter file path: + Cesta k súboru filtov: + + + transfer lists refresh interval: + interval obnovovania zoznamu prenosov: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Interval obnovovania RSS kanálov: + + + minutes + minút + + + Maximum number of articles per feed: + Maximálny počet článkov na kanál: + + + File system + Súborový systém + + + Remove finished torrents when their ratio reaches: + Odstrániť dokončené torrenty, keď ich pomer dosiahne: + + + System default + Štandardné nastavenie systému + + + Start minimized + Spustiť minimalizované + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Činnosť po dvojitom kliknutí v zozname prenosov + + + In download list: + V zozname sťahovaní: + + + Pause/Start torrent + Pozastaviť/spustiť torrent + + + Open destination folder + Otvoriť cieľový priečinok + + + Display torrent properties + Zobraziť vlastnosti torrentu + + + In seeding list: + V zozname seedov: + + + Folder scan interval: + Interval kontroly priečinkov: + + + seconds + sekúnd + + + Spoof Azureus to avoid ban (requires restart) + Klamať Azureus, aby sme sa vyhli blokovaniu (vyžaduje reštart) + + + Web UI + Webové rozhranie + + + Enable Web User Interface + Zapnúť webové rozhranie + + + HTTP Server + HTTP Server + + + Enable RSS support + + + + RSS settings + Nastavenia RSS + + + Enable queueing system + Zapnúť systém frontu + + + Maximum active downloads: + Maximum aktívnych sťahovaní: + + + Torrent queueing + Zaraďovanie torrentov do frontu + + + Maximum active torrents: + Maximum aktívnych torrentov: + + + Display top toolbar + Zobrazovať horný panel nástrojov + + + Search engine proxy settings + Proxy nastavenie vyhľadávača + + + Bittorrent proxy settings + Nastavenie Bittorrent proxy + + + Maximum active uploads: + Max. aktívnych nahrávaní: + + + Spoof µtorrent to avoid ban (requires restart) + Predstierať µtorrent aby sme sa vyhli blokovaniu (vyžaduje reštart) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Operácia sa vykoná po dvojitom kliknutí na položku v zozname prenosov (sťahovaní/nahrávaní) + + + Start/Stop + Spustiť/Zastaviť + + + Open folder + Otvoriť priečinok + + + Show properties + Zobraziť vlastnosti + + + Port used for incoming connections: + Port pre prichádzajúce spojenia: + + + Random + Náhodný + + + UI + Rozhranie + + + + DownloadingTorrents + + Name + i.e: file name + Názov + + + Size + i.e: file size + Veľkosť + + + Progress + i.e: % downloaded + Priebeh + + + DL Speed + i.e: Download speed + Rýchlosť sťahovania + + + UP Speed + i.e: Upload speed + Rýchlosť nahrávania + + + Seeds/Leechs + i.e: full/partial sources + Seederi/Leecheri + + + Ratio + Pomer + + + ETA + i.e: Estimated Time of Arrival / Time left + Odh. čas + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 spustený. + + + Be careful, sharing copyrighted material without permission is against the law. + Buďte opatrní, zdieľanie materiálu chráneného autorskými právami bez povolenia je protizákonné. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>bol zablokovaný</i> + + + Fast resume data was rejected for torrent %1, checking again... + Rýchle obnovenie torrentu torrent %1 bolo odmietnuté, skúšam znova... + + + Url seed lookup failed for url: %1, message: %2 + Vyhľadanie url seedu zlyhalo pre url: %1, správa: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + „%1“ bol pridaný do zoznamu na sťahovanie. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + „%1“ bol obnovený. (rýchle obnovenie) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + „%1“ sa už nachádza v zozname sťahovaných. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nebol omožné dekodovať torrent súbor: „%1“ + + + This file is either corrupted or this isn't a torrent. + Tento súbor je buď poškodený alebo to nie je torrent. + + + Couldn't listen on any of the given ports. + Nepodarilo sa počúvať na žiadnom zo zadaných portov. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Sťahuje sa „%1“, čakajte prosím... + + + Hide or Show Column + Skryť alebo zobraziť stĺpec + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Zlyhanie mapovania portov, správa: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Mapovanie portov úspešné, správa: %1 + + + Priority + Priorita + + + Seeds/Leechers + i.e: full/partial sources + Seederi/Leecheri + + + + FeedDownloader + + RSS Feed downloader + Sťahovanie RSS kanála + + + RSS feed: + RSS kanál: + + + Feed name + Názov kanála + + + Automatically download torrents from this feed + Automaticky sťahovať torrenty z tohto kanála + + + Download filters + Filtre sťahovania + + + Filters: + Filtre: + + + Filter settings + Nastavenia filtrov + + + Matches: + Zodpovedá: + + + Does not match: + Nezodpovedá: + + + Destination folder: + Cieľový priečinok: + + + ... + ... + + + Filter testing + Testovanie filtra + + + Torrent title: + Názov torrentu: + + + Result: + Výsledok: + + + Test + Test + + + Import... + Import... + + + Export... + Export... + + + Rename filter + Premenovať filter + + + Remove filter + Odstrániť filter + + + Add filter + Pridať filter + + + + FeedDownloaderDlg + + New filter + Nový filter + + + Please choose a name for this filter + Prosím, vyberte názov pre tento filter + + + Filter name: + Názov filtra: + + + Invalid filter name + Neplatný názov filtra + + + The filter name cannot be left empty. + Názov filtra nemôže byť prázdny. + + + This filter name is already in use. + Tento názov filtra už existuje. + + + Filter testing error + Chyba pri testovaní filtra + + + Please specify a test torrent name. + Prosím, uveďte názov testovacieho torrentu. + + + matches + zodpovedá + + + does not match + nezodpovedá + + + Select file to import + Vyberte súbor na import + + + Filters Files + Filtre Súbory + + + Import successful + Import prebehol úspešne + + + Filters import was successful. + Import filtrov prebehol úspešne. + + + Import failure + Chyba importu + + + Filters could not be imported due to an I/O error. + Nebolo možné importovať filtre z dôvodu V/V chyby. + + + Select destination file + Vyberte cieľový súbor + + + Overwriting confirmation + Potvrdenie prepísania + + + Are you sure you want to overwrite existing file? + Ste si istý, že chcete prepísať existujúci súbor? + + + Export successful + Export prebehol úspešne + + + Filters export was successful. + Export filtrov prebehol úspešne. + + + Export failure + Chyba exportu + + + Filters could not be exported due to an I/O error. + Nebolo možné exportovať filtre z dôvodu V/V chyby. + + + + FeedList + + Unread + Neprečítané + + + + FilterParserThread + + I/O Error + Input/Output Error + V/V Chyba + + + Couldn't open %1 in read mode. + Nebolo možné otvoriť %1 v režime pre čítanie. + + + %1 is not a valid PeerGuardian P2B file. + %1 nie je platný súbor PeerGuardian P2B. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Name + i.e: file name + Názov + + + Size + i.e: file size + Veľkosť + + + Seeds / Leechers + Seederi/Leecheri + + + Connected peers + Pripojení + + + Progress + i.e: % downloaded + Priebeh + + + UP Speed + i.e: Upload speed + Rýchlosť nahrávania + + + Seeds/Leechs + i.e: full/partial sources + Seederi/Leecheri + + + Finished + i.e: Torrent has finished downloading + Skončené + + + Finished + Skončené + + + Ratio + Pomer + + + Leechers + i.e: full/partial sources + Leecheri + + + Total uploaded + i.e: Total amount of uploaded data + Celkovo nahrané + + + Hide or Show Column + Zobraziť alebo skryť stĺpec + + + Incomplete torrent in seeding list + Neúplný torrent v zozname seedovaných + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Zdá sa, že stav torrentu „%1” sa zmenil zo „seedovanie” na „sťahovanie”. Chcete ho presunúť naspäť do zoznamu sťahovaných? (inak bude jednoducho zmazaný) + + + Priority + Priorita + + + + GUI + + Open Torrent Files + Otvoriť torrent súbory + + + Unknown + Nezne + + + This file is either corrupted or this isn't a torrent. + Tento súbor je buď poškodený alebo to nie je torrent. + + + Are you sure you want to delete all files in download list? + Určite chcete zmazať všetky súbory v zozname sťahovaných? + + + &Yes + &Áno + + + &No + &Nie + + + Are you sure you want to delete the selected item(s) in download list? + Určite chcete zmazať vybrané položky v zozname sťahovaných? + + + paused + pozastaven + + + started + spusten + + + Finished + Dokončené + + + Checking... + kontroluje sa... + + + Connecting... + pripája sa... + + + Downloading... + sťahuje sa... + + + Download list cleared. + Zoznam sťahovanch vyčistený. + + + All Downloads Paused. + Všetky sťahovania pozastavené. + + + All Downloads Resumed. + Všetky sťahovania znovu spustené. + + + DL Speed: + Rchlos sahovania: + + + started. + spustené. + + + UP Speed: + Rýchlosť nahrávania: + + + Couldn't create the directory: + Nebolo možné vytvoriť adresár: + + + Torrent Files + Torrent súbory + + + already in download list. + u sa nachza v zozname sahovanch. + + + added to download list. + pridaný do zoznamu sťahovaných. + + + resumed. (fast resume) + znovu spustené. (rýchle znovuspustenie) + + + Unable to decode torrent file: + Nemohol som dekódovať torrent súbor: + + + removed. + odstren. + + + paused. + pozastaven. + + + resumed. + znovu spusten. + + + Listening on port: + Počúvam na porte: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Ste si istý? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Speed: + + + <b>Connection Status:</b><br>Online + <b>Stav spojenia:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Stav spojenia:</b><br>Za firewallom?<br><i>Žiadne prichzajúce spojenia...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Stav spojenia:</b><br>Offline<br><i>Neboli nájdení rovesníci...</i> + + + has finished downloading. + skončilo sťahovanie. + + + Couldn't listen on any of the given ports. + Nepodarilo sa počúvať na žiadnom zo zadaných portov. + + + None + Žiadny + + + Empty search pattern + Prázdny vyhľadávací vzor + + + Please type a search pattern first + Prosím, najprv zadajte vyhľadávací vzor + + + No seach engine selected + Nebol zvolený vyhľadávač + + + You must select at least one search engine. + Musíte zvoliť aspoň jeden vyhľadávač. + + + Searching... + Hľadá sa... + + + Could not create search plugin. + Nemohol som vytvori plugin pre vyhadanie. + + + Stopped + Zastaven + + + Torrent file URL + URL torrent súboru + + + Torrent file URL: + URL torrent súboru: + + + Are you sure you want to quit? -- qBittorrent + Určite chcete ukončiť program? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Určite chcete ukončiť qBittorrent? + + + Timed out + as vypral + + + Error during search... + Chyba pos hadania... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Zastaven + + + removed. + <file> removed. + odstránený. + + + already in download list. + <file> already in download list. + už sa nacháza v zozname sťahovaných. + + + paused. + <file> paused. + pozastavené. + + + resumed. + <file> resumed. + znovu spustené. + + + Search is finished + Vyhľadávanie skočilo + + + An error occured during search... + Počas vyhľadávania sa vyskytla chyba... + + + Search aborted + Vyhľadávanie preušené + + + Search returned no results + Vyhľadávanie nevrátilo žiadne výsledky + + + Search plugin update -- qBittorrent + Aktualizácia zásuvného modulu vyhľadávania -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Je možné aktualizovať vyhľadávací zásuvný modul. Chete ho aktualizovať? + +Záznam zmien: + + + Sorry, update server is temporarily unavailable. + Je mi ľúto, aktualizačný server je dočasne nedostupný. + + + Your search plugin is already up to date. + Váš vyhľadávací zásuvný modul je aktuálny. + + + Results + Výsledky + + + Name + Názov + + + Size + Veľkosť + + + Progress + Priebeh + + + DL Speed + rýchlosť sťahovania + + + UP Speed + rýchlosť nahrávania + + + Status + Stav + + + ETA + Odhadovaný čas + + + Seeders + Seederi + + + Leechers + Leecheri + + + Search engine + Vyhľadávač + + + Stalled + state of a torrent whose DL Speed is 0 + Bez pohybu + + + Paused + Pozastavený + + + Transfers + Prenosy + + + Preview process already running + Proces náhľadu už beží + + + There is already another preview process running. +Please close the other one first. + Iný proces náhľadu už beží. +Najskôr ho prosím zatvorte. + + + Couldn't download + Couldn't download <file> + Nemohol som stiahnuť + + + reason: + Reason why the download failed + dôvod: + + + Downloading + Example: Downloading www.example.com/test.torrent + Sťahujem + + + Please wait... + Čakajte prosím... + + + Are you sure you want to quit qBittorrent? + Ste si istý, že chcete zatvoriť qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Ste si istý, že chcete zmazať vybrané položky v zozname sťahovaných a na pevnom disku? + + + Download finished + Sťahovanie dokončené + + + has finished downloading. + <filename> has finished downloading. + skončilo sťahovanie. + + + Search Engine + Vyhľadávač + + + I/O Error + V/V Chyba + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Stav spojenia: + + + Offline + Offline + + + No peers found... + Neboli nájdení rovesníci... + + + Name + i.e: file name + Názov + + + Size + i.e: file size + Veľkosť + + + Progress + i.e: % downloaded + Priebeh + + + DL Speed + i.e: Download speed + Rýchlosť sťahovania + + + UP Speed + i.e: Upload speed + Rýchlosť nahrávania + + + Seeds/Leechs + i.e: full/partial sources + Seederi/Leecheri + + + ETA + i.e: Estimated Time of Arrival / Time left + Odhadované + + + Seeders + i.e: Number of full sources + Seederi + + + Leechers + i.e: Number of partial sources + Leecheri + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 spustený. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Rýchlosť sťahovania: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Rýchlosť nahrávania: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + Skončené + + + Checking... + i.e: Checking already downloaded parts... + kontroluje sa... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Bez pohybu + + + Are you sure you want to quit? + Ste si istý, že chcete skončiť? + + + '%1' was removed. + 'xxx.avi' was removed. + „%1“ bol odstránený. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + „%1“ bol pridaný do zoznamu na sťahovanie. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + „%1“ bol obnovený. (rýchle obnovenie) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + „%1“ sa už nachádza v zozname sťahovaných. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nebol omožné dekodovať torrent súbor: „%1“ + + + None + i.e: No error message + Žiadna + + + Listening on port: %1 + e.g: Listening on port: 1666 + Počúvam na porte: %1 + + + All downloads were paused. + Všetky sťahovania pozastavené. + + + '%1' paused. + xxx.avi paused. + „%1“ pozastavené. + + + Connecting... + i.e: Connecting to the tracker... + pripája sa... + + + All downloads were resumed. + Všetky sťahovania obnovené. + + + '%1' resumed. + e.g: xxx.avi resumed. + „%1“ obnovené. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 je stiahnutý. + + + I/O Error + i.e: Input/Output Error + V/V Chyba + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Vyskytla sa chyba pri pokuse o čítanie alebo zapisovanie do %1. Disk je pravdepodobne plný, sťahovanie bolo pozastavené + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Vyskytla sa chyba (plný disk?), „%1“ pozastavené. + + + Connection Status: + Stav spojenia: + + + Online + Online + + + Firewalled? + i.e: Behind a firewall/router? + Za firewallom? + + + No incoming connections... + Žiadne prichádzajúce spojenia... + + + No search engine selected + Nebol zvolený žiadny vyhľadávač + + + Search plugin update + Aktualizácia zásuvného modulu vyhľadávača + + + Search has finished + Hľadanie skončené + + + Results + i.e: Search results + Výsledky + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Sťahuje sa „%1“;, čakajte prosím... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Vyskytla sa chyba (plný disk?), „%1“ pozastavené. + + + Search + Vyhľadávanie + + + RSS + + + + Downloads + Sťahovania + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Vyskytla sa V/V chyba pri torrente %1. + Dôvod: %2 + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Zoznam sťahovaní nie je prázdny. +Ste si istý, že chcete ukončiť qBittorrent? + + + Are you sure you want to delete the selected item(s) in finished list? + Ste si istý, že chcete zmazať vybrané položky zo zoznamu dokončených? + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent sa viaže (bind) na port: %1 + + + DHT support [ON], port: %1 + Podpora DHT [zapnutá], port: %1 + + + DHT support [OFF] + Podpora DHT [vypnutá] + + + UPnP support [ON] + Podpora UPnP [zapnutá] + + + PeX support [ON] + Podpora PeX [zapnutá] + + + PeX support [OFF] + Podpora PeX [vypnutá] + + + Be careful, sharing copyrighted material without permission is against the law. + Buďte opatrní, zdieľanie materiálu chráneného autorskými právami bez povolenia je protizákonné. + + + Encryption support [ON] + Podpora šifrovania [zapnuté] + + + Encryption support [FORCED] + Podpora šifrovania [vynútené] + + + Encryption support [OFF] + Podpora šifrovania [vypnuté] + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>bol zablokovaný</i> + + + Ratio + Pomer + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Chyba sťahovania url + + + Couldn't download file at url: %1, reason: %2. + Nebolo možné stiahnuť súbor z url: %1, dôvod: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Rýchle obnovenie torrentu torrent %1 bolo odmietnuté, skúšam znova... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Ste si istý, že chcete zmazať vybrané položky zo zoznamu sťahovaných a z pevného disku? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Ste si istý, že chcete zmazať vybrané položky zo zoznamu dokončených a z pevného disku? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + „%1“ bol permanentne odstránený. + + + Url seed lookup failed for url: %1, message: %2 + Vyhľadanie url seedu zlyhalo pre url: %1, správa: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent sa viaže na port: TCP/%1 + + + UPnP support [OFF] + Podpora UPnP [vypnutá] + + + NAT-PMP support [ON] + Podpora NAT-PMP [zapnutá] + + + NAT-PMP support [OFF] + Podpora NAT-PMP [vypnutá] + + + DHT support [ON], port: UDP/%1 + Podpora DHT [ZAP], port: UDP/%1 + + + Local Peer Discovery [ON] + Local Peer Discovery [zapnutá] + + + Local Peer Discovery support [OFF] + Podpora Local Peer Discovery support [vypnutá] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + „%1“ bol odstránený, pretože jeho pomer dosiahol maximálnu hodonotu, ktorú ste nastavili. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + + + DL: %1 KiB/s + Sťah: %1 KiB/s + + + UP: %1 KiB/s + Nahr: %1 KiB/s + + + Ratio: %1 + Pomer: %1 + + + DHT: %1 nodes + DHT: %1 uzlov + + + No direct connections. This may indicate network configuration problems. + Žiadne priame spojenia. To môže znamenať problém s pripojením. + + + Uploads + Nahrávania + + + Options were saved successfully. + Nastavenia boli úspešne uložené. + + + + MainWindow + + Log: + Záznam: + + + Total DL Speed: + Celková rýchlosť sťahovania: + + + Total UP Speed: + Celková rýchlosť nahrávania: + + + Name + Nov + + + Size + Vekos + + + % DL + sahovania + + + DL Speed + rchlos sahovania + + + UP Speed + rchlos nahrania + + + Status + Status + + + ETA + Odhadovan s + + + &Options + &Nastavenia + + + &Edit + &Úpravy + + + &File + &Súbor + + + &Help + &Pomocník + + + Open + Otvoriť + + + Exit + Ukončiť + + + Preferences + Nastavenia + + + About + O aplikácii + + + Start + Spustiť + + + Pause + Pozastaviť + + + Delete + Zmazať + + + Pause All + Pozastaviť všetky + + + Start All + Spustiť všetky + + + Documentation + Dokumentácia + + + Delete All + Zmazať všetky + + + Torrent Properties + Vlastnosti torrentu + + + Connection Status + Stav spojenia + + + Downloads + Sťahovania + + + Search + Vyhľadávanie + + + Search Pattern: + Vyhľadávací vzor: + + + Status: + Stav: + + + Stopped + Zastavený + + + Search Engines + Vyhľadávače + + + Results: + Výsledky: + + + Stop + Zastaviť + + + Seeds + Seedy + + + Leechers + Leecheri + + + Search Engine + Vyhad + + + Download from URL + Stiahnuť z URL + + + Download + Stiahnuť + + + Clear + Vyčistiť + + + KiB/s + KiB/s + + + Create torrent + Vytvoriť torrent + + + Update search plugin + Aktualizovať vyhľadávací zásuvný modul + + + Session ratio: + Pomer relácie: + + + Transfers + Prenosy + + + Preview file + Náhľad súboru + + + Clear log + Vyčistiť záznam + + + Delete Permanently + Trvalo zmazať + + + Visit website + Navštíviť webstránku + + + Report a bug + Oznámiť chybu + + + Set upload limit + Nastaviť limit nahrávania + + + Set download limit + Nastaviť limit sťahovania + + + Log + Záznam + + + IP filter + IP filter + + + Set global download limit + Nastaviť globálny limit sťahovania + + + Set global upload limit + Nastaviť globálny limit nahrávania + + + Options + Nastavenia + + + Decrease priority + Znížiť prioritu + + + Increase priority + Zvýšiť prioritu + + + Console + Konzola + + + + PropListDelegate + + False + Nie + + + True + Áno + + + Ignored + Ignorovaný + + + Normal + Normal (priority) + Normálna + + + High + High (priority) + Vysoká + + + Maximum + Maximum (priority) + Maximálna + + + + QTextEdit + + Clear + Vyčisti + + + + RSS + + Search + Vyhľadávanie + + + Delete selected streams + Zmazať vybrané streamy + + + Refresh RSS streams + Obnoviť RSS streamy + + + Add a new RSS stream + Pridať nový RSS stream + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Novinky:</b> <i>(dvojitým kliknutím otvoríte odkaz vo webovom prehliadači)</i> + + + Delete + Zmazať + + + Rename + Premenovať + + + Refresh + Obnoviť + + + Add RSS stream + Pridať RSS stream + + + Refresh all streams + Obnoviť všetky streamy + + + RSS streams: + RSS streamy: + + + 2 + 2 + + + Mark all as read + Označiť všetky ako prečítané + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrenty:</span> <span style=" font-style:italic;">(stiahnite dvojitým kliknutím)</span></p></body></html> + + + Download torrent + Stiahnuť torrent + + + Open news URL + Otvoriť URL kanála + + + Copy feed URL + Skopírovať URL kanála + + + RSS feed downloader + Sťahovanie RSS kanálov + + + New subscription + Nové predplatné + + + Mark items read + Označiť položku ako prečítané + + + Update all + Aktualizovať všetky + + + Update all feeds + Aktualizovať všetky kanálu + + + RSS feeds + RSS kanály + + + + Update + Aktualizovať + + + New folder + Nový priečinok + + + 1 + 1 + + + + Feed URL + URL kanála + + + Bullet + + + + Article title + + + + + RSSImp + + Are you sure? -- qBittorrent + Ste si istý? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Ste si istý, že chcete zmazať tento stream zo zoznamu? + + + &Yes + &Áno + + + &No + &Nie + + + Please choose a new name for this stream + Prosím, zvoľte nový názov pre tento stream + + + New stream name: + Nový názov streamu: + + + Please type a rss stream url + Prosím, napíšte URL RSS streamu + + + Stream URL: + URL streamu: + + + Are you sure you want to delete this stream from the list? + Ste si istý, že chcete zmazať tento stream zo zoznamu? + + + Description: + Popis: + + + url: + url: + + + Last refresh: + Posledné obnovenie: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Tento RSS kanál už je v zozname. + + + Date: + Dátum: + + + Author: + Autor: + + + Please choose a folder name + Prosím, vyberte názov priečinka + + + Folder name: + Názov priečinka: + + + New folder + Nový priečinok + + + Are you sure you want to delete these elements from the list? + Ste si istý, že chcete zmazať tieto prvky zo zoznamu? + + + Are you sure you want to delete this element from the list? + Ste si istý, že chcete zmazať tento prvok zo zoznamu? + + + Please choose a new name for this RSS feed + Prosím, vyberte nový názov pre tento RSS kanál + + + New feed name: + Nový názov kanála: + + + Name already in use + Názov sa už používa + + + This name is already used by another item, please choose another one. + Tento názov už používa iná položka. Prosím, zvoľte iný názov. + + + Overwrite attempt + Pokus o prepísanie + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Nemôžete prepísať položku %1. + + + Unread + Neprečítané + + + + RssItem + + No description available + Popis nie je dostupný + + + + RssStream + + %1 ago + 10min ago + pred %1 min + + + Never + Nikdy + + + Automatically downloading %1 torrent from %2 RSS feed... + Automaticky sa sťahuje torrent %1 z RSS kanála %2... + + + + SearchCategories + + All categories + Všetky kategórie + + + Movies + Filmy + + + TV shows + TV relácie + + + Music + Hudba + + + Games + Hry + + + Anime + Anime + + + Software + Softvér + + + Pictures + Obrázky + + + Books + Knihy + + + + SearchEngine + + Name + i.e: file name + Názov + + + Size + i.e: file size + Veľkosť + + + Seeders + i.e: Number of full sources + Seederi + + + Leechers + i.e: Number of partial sources + Leecheri + + + Search engine + Vyhľadávač + + + Empty search pattern + Prázdny vyhľadávací vzor + + + Please type a search pattern first + Prosím, najprv zadajte vyhľadávací vzor + + + No search engine selected + Nebol zvolený žiadny vyhľadávač + + + You must select at least one search engine. + Musíte zvoliť aspoň jeden vyhľadávač. + + + Results + Výsledky + + + Searching... + Hľadá sa... + + + Search plugin update -- qBittorrent + Aktualizácia zásuvného modulu vyhľadávania -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Je možné aktualizovať vyhľadávací zásuvný modul. Chete ho aktualizovať? + +Záznam zmien: + + + &Yes + &Áno + + + &No + &Nie + + + Search plugin update + Aktualizácia zásuvného modulu vyhľadávača + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Je mi ľúto, aktualizačný server je dočasne nedostupný. + + + Your search plugin is already up to date. + Váš vyhľadávací zásuvný modul je aktuálny. + + + Cut + Vystrihnúť + + + Copy + Kopírovať + + + Paste + Vložiť + + + Clear field + Vyčistiť pole + + + Clear completion history + Vyčistiť históriu dopĺňania + + + Search Engine + Vyhľadávač + + + Search has finished + Hľadanie skončené + + + An error occured during search... + Počas vyhľadávania sa vyskytla chyba... + + + Search aborted + Vyhľadávanie preušené + + + Search returned no results + Vyhľadávanie nevrátilo žiadne výsledky + + + Results + i.e: Search results + Výsledky + + + Search plugin download error + Chyba pri sťahovaní zásuvného modulu vyhľadávania + + + Couldn't download search plugin update at url: %1, reason: %2. + Nebolo možné stiahnuť zásuvný modul vyhľadávania z url: %1, dôvod: %2. + + + Unknown + Neznámy + + + + SearchTab + + Name + i.e: file name + Názov + + + Size + i.e: file size + Veľkosť + + + Seeders + i.e: Number of full sources + Seederi + + + Leechers + i.e: Number of partial sources + Leecheri + + + Search engine + Vyhľadávač + + + + TrackersAdditionDlg + + Trackers addition dialog + Dialóg pre pridanie torrentu + + + List of trackers to add (one per line): + Pridať nasledovné trackery (jeden tracker na riadok): + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Prosím, kontaktujte ma, ak chcete preložiť qBittorrent do vlastného jazyka. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Rád by som poďakoval nasledovným dobrovoľníkom, ktorí preložili qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + lt;ul><li>R by som pokoval serveru sourceforge.net za hosting projektu qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + lt;li>Tie by som r pokoval Jefferymu Fernandezovi (developer@jefferyfernandez.id.au), nu tvorcovi RPM balkov, za jeho skvel pru.</li></ul> + + + Preview impossible + Náhľad nemožný + + + Sorry, we can't preview this file + Prepáčte, tento súbor sa nedá otvoriť ako náhľad + + + Name + Názov + + + Size + Veľkosť + + + Progress + Priebeh + + + No URL entered + Nebolo zadané URL + + + Please type at least one URL. + Prosím, napíšte aspoň jedno URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Prosím, kontaktujte ma ak chcete preložiť qBittorrent do vášho jazyka. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Rád by som poďakoval nasledovným dobrovoľníkom, ktorí preložili qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Prosím, kontaktujte ma ak chcete preložiť qBittorrent do vášho jazyka. + + + + addTorrentDialog + + Torrent addition dialog + Dialóg pre pridanie torrentu + + + Save path: + Uložiť kam: + + + ... + ... + + + Torrent content: + Obsah torrentu: + + + File name + Názov súboru + + + File size + Veľkosť súboru + + + Selected + Vybrané + + + Download in correct order (slower but good for previewing) + Stiahnuť v správnom poradí (pomalšie ale lepšie pre náhľad) + + + Add to download list in paused state + Pridať do zoznamu sťahovaných v stave pozastavený + + + Add + Pridať + + + Cancel + Storno + + + select + vybrať + + + Unselect + nevybrať + + + Select + Vybrať + + + Ignored + Ignorovaný + + + Normal + Normálna + + + High + Vysoká + + + Maximum + Maximálna + + + Collapse all + Zbaliť všetko + + + Expand All + Rozbaliť všetko + + + Expand all + Rozbaliť všetko + + + Torrent size: + Veľkosť torrentu: + + + Unknown + Neznáma + + + Free disk space: + Voľné miesto na disku: + + + Download in sequential order (slower but good for previewing) + Sťahovať v postupnom poradí (pomalšie, ale lepšie pre náhľady) + + + + authentication + + Tracker authentication + Autentifikácia trackera + + + Tracker: + Tracker: + + + Login + Prihlásenie + + + Username: + Meno používateľa: + + + Password: + Heslo: + + + Log in + Prihásiť sa + + + Cancel + Storno + + + + bandwidth_dlg + + Bandwidth allocation + Vyhradenie pásma + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 dosiahol maximálny požadovaný pomer. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + „%1“ bol permanentne odstránený. + + + '%1' was removed. + 'xxx.avi' was removed. + „%1“ bol odstránený. + + + '%1' paused. + e.g: xxx.avi paused. + „%1“ pozastavený. + + + '%1' resumed. + e.g: xxx.avi resumed. + „%1“ obnovený. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + „%1“ sa už nachádza v zozname sťahovaných. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + „%1“ bol obnovený. (rýchle obnovenie) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + „%1“ bol pridaný do zoznamu na sťahovanie. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Nebolo možné dekódovať torrent súbor: „%1“ + + + This file is either corrupted or this isn't a torrent. + Tento súbor je buď poškodený alebo to nie je torrent. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>zablokoval váš filter IP adries</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>zablokovaný kvôli posielaniu poškodených častí</i> + + + Couldn't listen on any of the given ports. + Nepodarilo sa počúvať na žiadnom zo zadaných portov. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Zlyhanie mapovania portov, správa: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Mapovanie portov úspešné, správa: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Rýchle obnovenie torrentu torrent %1 bolo odmietnuté, prebieha opätovný pokus... + + + Url seed lookup failed for url: %1, message: %2 + Vyhľadanie url seedu zlyhalo pre url: %1, správa: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Sťahuje sa „%1“, čakajte prosím... + + + '%1' is not a valid magnet URI. + „%1“ nie je platný magnet URI. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Rekurzívne sťahovanie súboru %1 vnoreného v torrente %2 + + + Unable to decode %1 torrent file. + Nepodarilo sa dekódovať torrent súbor %1. + + + + createTorrentDialog + + Dialog + Dial + + + Create Torrent file + Vytvoriť Torrent súbor + + + Destination torrent file: + Cieľový torrent sbor: + + + Input file or directory: + Vstupn sbor alebo adres: + + + Comment: + Koment: + + + ... + ... + + + Create + Vytvoriť + + + Cancel + Storno + + + Announce url (Tracker): + Announce url (Tracker): + + + Directory + Adresár + + + Torrent Creation Tool + Nástroj na vytvorenie Torrentu + + + <center>Destination torrent file:</center> + <center>Cieľový torrent súbor:</center> + + + <center>Input file or directory:</center> + <center>Vstupný súbor alebo adresár:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Oznamujúce url:<br>(jedna na riadok)</center> + + + <center>Comment:</center> + <center>Komentár:</center> + + + Torrent file creation + Vytvorenie Torrent súboru + + + Input files or directories: + Vstupné súbory alebo adresáre: + + + Announce urls (trackers): + Announce url (trackery): + + + Comment (optional): + Komentár (voliteľné): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Súkromný (ak je voľba zapnutá, nebude distribuovaný na sieti bez trackera / DHT) + + + Web seeds urls (optional): + URL web seedov (voliteľné): + + + File or folder to add to the torrent: + Súbor alebo priečinok, ktorý sa má pridať do torrentu: + + + Add a file + Pridať súbor + + + Add a folder + Pridať priečinok + + + Piece size: + Veľkosť časti: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + Súkromný (ak je zapnuté, nebude sa šíriť pomocou siete DHT) + + + Start seeding after creation + Začať seedovanie po vytvorení + + + Create and save... + Vytvoriť a uložiť... + + + Progress: + Priebeh: + + + Add file + Pridať súbor + + + Add folder + Pridať priečinok + + + + createtorrent + + Select destination torrent file + Vybrať cieľový torrent súbor + + + Torrent Files + Torrent súbory + + + Select input directory or file + Vyberte vstupný adresár alebo súbor + + + No destination path set + Nebola nastavená cieľová cesta + + + Please type a destination path first + Napíšte prosím najprv cieľovú cestu + + + No input path set + Nebola zadaná vstupná cesta + + + Please type an input path first + Napíšte prosím najprv vstupnú cestu + + + Input path does not exist + Vstupná cesta neexistuje + + + Please type a correct input path first + Prosím, napíšte správnu vstupnú cestu + + + Torrent creation + Vytvorenie torrentu + + + Torrent was created successfully: + Torrent bol úspešne vytvorený: + + + Please type a valid input path first + Prosím, najprv napíšte platnú cestu pre vstup + + + Select a folder to add to the torrent + Vyberte adresár, ktorý sa má pridať do torrentu + + + Select files to add to the torrent + Vyberte súbory, ktoré sa majú pridať do torrentu + + + Please type an announce URL + Prosím, napíšte announce URL + + + Torrent creation was unsuccessful, reason: %1 + Torrent nebol vytvorený, dôvod: %1 + + + Announce URL: + Tracker URL + Announce URL: + + + Please type a web seed url + Prosím, napíšte web seed URL + + + Web seed URL: + Web seed URL: + + + Select a file to add to the torrent + Vyberte súbor, ktorý sa má pridať do torrentu + + + No tracker path set + Nebola nastavená cesta k trackeru + + + Please set at least one tracker + Prosím, nastavte aspoň jeden tracker + + + Created torrent file is invalid. It won't be added to download list. + Vytvorený torrent je neplatný. Nebude pridaný do zoznamu sťahovaných. + + + + downloadFromURL + + Download from urls + Stiahnuť z viacerých url + + + Download Torrents from URLs + Stiahnuť torrenty z viacerých URL + + + Only one URL per line + Iba jeden URL na riadok + + + Download + Stiahnuť + + + Cancel + Storno + + + No URL entered + Nebolo zadané URL + + + Please type at least one URL. + Prosím, napíšte aspoň jedno URL. + + + + downloading + + Search + Vyhľadávanie + + + Total DL Speed: + Celková rýchlosť sťahovania: + + + KiB/s + KiB/s + + + Session ratio: + Pomer relácie: + + + Total UP Speed: + Celková rýchlosť nahrávania: + + + Log + Záznam + + + IP filter + IP filter + + + Start + Spustiť + + + Pause + Pozastaviť + + + Delete + Zmazať + + + Clear + Vyčistiť + + + Preview file + Náhľad súboru + + + Set upload limit + Nastaviť limit nahrávania + + + Set download limit + Nastaviť limit sťahovania + + + Delete Permanently + Trvalo zmazať + + + Torrent Properties + Vlastnosti torrentu + + + Open destination folder + Otvoriť cieľový priečinok + + + Name + Názov + + + Size + Veľkosť + + + Progress + Priebeh + + + DLSpeed + Rýchlosť sťahovania + + + UpSpeed + Rýchlosť nahrávania + + + Seeds/Leechs + Seederi/Leecheri + + + Ratio + Pomer + + + ETA + Odh. čas + + + Buy it + Kúpiť + + + Priority + Priorita + + + Increase priority + Zvýšiť prioritu + + + Decrease priority + Znížiť prioritu + + + Force recheck + Vynútiť opätovnú kontrolu + + + Copy magnet link + Kopírovať magnet URI + + + + engineSelect + + Search plugins + Zásuvné moduly vyhľadávania + + + Installed search engines: + Nainštalované vyhľadávače: + + + Name + Názov + + + Url + Url + + + Enabled + Zapnuté + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Nové vyhľadávače môžete získať tu: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Nainštalovať nový + + + Check for updates + Skontrolovať aktualizácie + + + Close + Zatvoriť + + + Enable + Zapnúť + + + Disable + Vypnúť + + + Uninstall + Odinštalovať + + + + engineSelectDlg + + True + Áno + + + False + Nie + + + Uninstall warning + Upozornenie o odstránení + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Niektoré zásuvné moduly nebolo možné odstrániť, pretože sú súčasťou aplikácie qBittorrent. + Iba tie, ktoré ste sami pridali je možné odstrániť. +Tieto moduly však boli vypnuté. + + + Uninstall success + Odstránenie prebehlo úspešne + + + All selected plugins were uninstalled successfuly + Všetky zvolené zásuvné moduly boli úspešne odstránené + + + Select search plugins + Zvoliť zásuvné moduly vyhľadávačov + + + qBittorrent search plugins + Zásuvné moduly vyhľadávania qBittorrent + + + Search plugin install + Inštalácia zásuvného modulu vyhľadávača + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Novšia verzia zásuvného modulu vyhľadávača %1 je už nainštalovaná. + + + %1 search engine plugin was successfuly updated. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 bol úspešne aktualizovaný. + + + %1 search engine plugin was successfuly installed. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 bol úspešne nainštalovaný. + + + Search plugin update + Aktualizácia zásuvného modulu vyhľadávača + + + Sorry, update server is temporarily unavailable. + Je mi ľúto, aktualizačný server je dočasne nedostupný. + + + %1 search plugin was successfuly updated. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 bol úspešne aktualizovaný. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Je mi ľúto, aktualizácia zásuvného modulu vyhľadávača %1 zlyhala. + + + All your plugins are already up to date. + Všetky vaše vyhľadávacie zásuvné moduly sú už aktuálne. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 nebolo možné aktualizovať, zachovávam starú verziu. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 nebolo možné nainštalovať. + + + All selected plugins were uninstalled successfully + Všetky zvolené zásuvné moduly boli úspešne odinštalované + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 bol úspešne aktualizovaný. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Zásuvný modul vyhľadávača %1 bol úspešne nainštalovaný. + + + Search engine plugin archive could not be read. + Nebolo možné prečítať archív zásuvného modulu vyhľadávača. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Je mi ľúto, aktualizácia zásuvného modulu vyhľadávača %1 zlyhala. + + + New search engine plugin URL + URL zásuvného modulu nového vyhľadávača + + + URL: + URL: + + + Yes + Áno + + + No + Nie + + + + misc + + B + B + + + KiB + KiB + + + MiB + MiB + + + GiB + GiB + + + TiB + TiB + + + m + m + + + h + h + + + Unknown + Neznámy + + + h + h + + + d + d + + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + h + hours + h + + + Unknown + Unknown (size) + Neznáma + + + < 1m + < 1 minute + < 1m + + + %1m + e.g: 10minutes + %1m + + + %1h%2m + e.g: 3hours 5minutes + %1h%2m + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d%2h%3m + + + + options_imp + + Options saved successfully! + Nastavenia úspešne uložené! + + + Choose Scan Directory + Vyberte adresár, ktorý sa bude prehliadať + + + Choose save Directory + Vyberte adresár, kde sa bude ukladať + + + Choose ipfilter.dat file + Vyberte ipfilter.dat súbor + + + I/O Error + V/V Chyba + + + Couldn't open: + Nemohol som otvoriť: + + + in read mode. + na čítanie. + + + Invalid Line + neplatný riadok + + + Line + riadok + + + is malformed. + je v zlom tvare. + + + Range Start IP + Počiatočná IP rozsahu + + + Start IP: + Počiatočná IP: + + + Incorrect IP + Nesprávna IP + + + This IP is incorrect. + Táto IP je nesprávna. + + + Range End IP + Koncová IP rozsahu + + + End IP: + Koncová IP: + + + IP Range Comment + Komentár k IP rozsahu + + + Comment: + Komentár: + + + to + a + + + to + <min port> to <max port> + + + + Choose your favourite preview program + Zvoľte si obľúbený program pre náhľad + + + Invalid IP + Neplatná IP + + + This IP is invalid. + Táto IP je neplatná. + + + Options were saved successfully. + Nastavenia úspešne uložené. + + + Choose scan directory + Zvoliť adresár pre prezeranie + + + Choose an ipfilter.dat file + Vyberte súbor ipfilter.dat + + + Choose a save directory + Vyberte adresár, kde sa bude ukladať + + + I/O Error + Input/Output Error + V/V Chyba + + + Couldn't open %1 in read mode. + Nebolo možné otvoriť %1 v režime pre čítanie. + + + Choose an ip filter file + Zvoliť súbor IP filtra + + + Filters + Filtre + + + + pluginSourceDlg + + Plugin source + Zdroj zásuvného modulu + + + Search plugin source: + Zdroj zásuvného modulu vyhľadávača: + + + Local file + Lokálny súbor + + + Web link + Webový odkaz + + + + preview + + Preview selection + Výber náhľadu + + + File preview + Náhľad súboru + + + The following files support previewing, <br>please select one of them: + Nasledujúce súbory podporujú náhľad, <br>prosím vyberte jeden z nich: + + + Preview + Náhľad + + + Cancel + Storno + + + + previewSelect + + Preview impossible + Náhľad nemožný + + + Sorry, we can't preview this file + Prepáčte, tento súbor sa nedá otvoriť ako náhľad + + + Name + Názov + + + Size + Veľkosť + + + Progress + Priebeh + + + + properties + + Torrent Properties + Vlastnosti torrentu + + + Main Infos + Hlavninfo + + + File Name + Názov súboru + + + Current Session + Súčasná relácia + + + Total Uploaded: + Celkovo nahran: + + + Total Downloaded: + Celkovo stiahnut: + + + Download state: + Stav sťahovania: + + + Current Tracker: + Ssn tracker: + + + Number of Peers: + Pot rovesnov: + + + Torrent Content + Obsah torrentu + + + OK + OK + + + Total Failed: + Celkov pot zlyhan: + + + Finished + Skončené + + + Queued for checking + Zaradené frontu pre kontrolu + + + Checking files + Kontrolujem súbory + + + Connecting to tracker + Pripájam sa k trackeru + + + Downloading Metadata + Sťahujem metadáta + + + Downloading + Sťahujem + + + Seeding + Seedujem + + + Allocating + Alokujem + + + Unknown + Neznámy + + + Complete: + Dokončené: + + + Partial: + Čiastočne: + + + Files contained in current torrent: + Súbory obsiahnuté v súčasnom torrente: + + + Size + Veľkosť + + + Selected + Vybrané + + + Unselect + Odobrať + + + Select + Vybrať + + + You can select here precisely which files you want to download in current torrent. + Tu môžete presne vybrať, ktoré súbory zo súčasného torrentu chcete stiahnuť. + + + False + Nie + + + True + no + + + Tracker + Tracker + + + Trackers: + Trackery: + + + None - Unreachable? + Žiadne - Nedostupné? + + + Errors: + Chyby: + + + Progress + Priebeh + + + Main infos + Hlavné info + + + Number of peers: + Počet rovesníkov: + + + Current tracker: + Súčasný tracker: + + + Total uploaded: + Celkovo nahrané: + + + Main info + Hlavné info + + + Torrent information + Info o torrente + + + Total downloaded: + Celkovo stiahnuté: + + + Total failed: + Celkovo zlyhalo: + + + Torrent content + Obsah torrentu + + + Seeders: + Seederi: + + + Leechers: + Leecheri: + + + Share Ratio: + Pomer zdieľania: + + + Options + Nastavenia + + + Download in correct order (slower but good for previewing) + Stiahnuť v správnom poradí (pomalšie, ale lepšie pre náhľad) + + + Save path: + Uložiť kam: + + + Torrent infos + Info o torrente + + + Creator: + Tvorca: + + + Torrent hash: + Haš torrentu: + + + Comment: + Komentár: + + + Current session + Súčasná relácia + + + Share ratio: + Pomer zdieľania: + + + Trackers + Trackery + + + Priorities: + Priority: + + + Normal: normal priority. Download order is dependent on availability + Normálna: normálna priorita. Poradie sťahovania záleží na dostupnosti + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Vysoká: vyššia priorita ako normálna. Kúsky sa uprednostňujú pred kúskami s rovnakou dostupnosťou, ale nie pred kúskami s nižšou dostupnosťou + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximálna: maximálna priorita, na dostupnosť sa neberie ohľad, kúsky sú uprednostňované pred inými kúskami s nižšou prioritou + + + File name + Názov súboru + + + Priority + Priorita + + + New tracker + Nový tracker + + + New tracker url: + URL nového trackera: + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Zoznam trackerov nemôže byť prázdny. + + + Ignored: file is not downloaded at all + Ignorované: súbor sa vôbec nesťahuje + + + Ignored + Ignorované + + + Normal + Normálna + + + Maximum + Maximálna + + + High + Vysoká + + + Url seeds + Url seedy + + + New url seed: + Nový URL seed: + + + This url seed is already in the list. + Tento URL seed je už v zozname. + + + Hard-coded url seeds cannot be deleted. + Napevno zadané URL seedy nie je možné zmazať. + + + None + i.e: No error message + Žiadna + + + New url seed + New HTTP source + Nový URL seed + + + The following url seeds are available for this torrent: + Pre tento torrent sú dostupné nasledovné url seedy: + + + Priorities error + Chyba priorít + + + Error, you can't filter all the files in a torrent. + Chyba, nemôžete filtrovať všetky súbory v torrente. + + + Downloaded pieces + Stiahnuté časti + + + Collapse all + Zbaliť všetko + + + Expand all + Rozbaliť všetko + + + ... + ... + + + Choose save path + Zvoľte cestu pre uloženie + + + Save path creation error + Chyba pri vytváraní cesty pre uloženie + + + Could not create the save path + Nebolo možné vytvoriť cestu pre uloženie + + + + search_engine + + Search + Vyhľadávanie + + + Search Engines + Vyhľadávače + + + Search Pattern: + Vyhľadávací vzor: + + + Stop + Zastaviť + + + Status: + Stav: + + + Stopped + Zastavený + + + Results: + Výsledky: + + + Download + Stiahnuť + + + Clear + Vyčistiť + + + Update search plugin + Aktualizovať zásuvný modul vyhľadávania + + + Search engines... + Vyhľadávače... + + + Close tab + Zatvoriť záložku + + + + seeding + + Search + Vyhľadávanie + + + The following torrents are finished and shared: + Sťahovanie nasledovných torrentov skončilo a sú zdieľané: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Pozn.:</u> Pre dobro siete je dôležité, aby ste aj po skončení sťahovania naďalej naďalej stiahnuté torrenty zdieľali. + + + Start + Spustiť + + + Pause + Pozastaviť + + + Delete + Zmazať + + + Delete Permanently + Trvalo zmazať + + + Torrent Properties + Vlastnosti torrentu + + + Preview file + Náhľad súboru + + + Set upload limit + Nastaviť limit nahrávania + + + Open destination folder + Otvoriť cieľový priečinok + + + Name + Názov + + + Size + Veľkosť + + + Upload Speed + Rýchlosť nahrávania + + + Connected peers + Pripojení + + + Seeds / Leechers + Seederi/Leecheri + + + Leechers + Leecheri + + + Ratio + Pomer + + + Buy it + Kúpiť + + + Total uploaded + Celkovo nahrané + + + Priority + Priorita + + + Increase priority + Zvýšiť prioritu + + + Decrease priority + Znížiť prioritu + + + Force recheck + Vynútiť opätovnú kontrolu + + + Copy magnet link + Kopírovať magnet URI + + + + subDownloadThread + + Host is unreachable + Hostiteľ je nedostupný + + + File was not found (404) + Súbor nebol nájdený (404) + + + Connection was denied + Spojenie bolo odmietnuté + + + Url is invalid + URL je neplatné + + + Connection forbidden (403) + Spojenie zakázané (403) + + + Connection was not authorized (401) + Spojenie nebolo autorizované (401) + + + Content has moved (301) + Obsah sa presunul (301) + + + Connection failure + Chyba spojenia + + + Connection was timed out + Časový limit spojenia vypršal + + + Incorrect network interface + Nesprávne sieťové rozhranie + + + Unknown error + Neznáma chyba + + + Could not resolve proxy + Nebolo možné preložiť adresu proxy + + + I/O Error + V/V Chyba + + + + torrentAdditionDialog + + True + Áno + + + Unable to decode torrent file: + Nemohol som dekódovať torrent súbor: + + + This file is either corrupted or this isn't a torrent. + Tento súbor je buď poškodený alebo nie je torrent. + + + Choose save path + Zvoľte cestu pre uloženie + + + False + Nie + + + Empty save path + Prázdna cesta pre uloženie + + + Please enter a save path + Prosím, zadajte cestu pre uloženie + + + Save path creation error + Chyba pri vytváraní cesty pre uloženie + + + Could not create the save path + Nemohol som vytvoriť cestu pre uloženie + + + Invalid file selection + Neplatný výber súboru + + + You must select at least one file in the torrent + Musíte vybrať aspoň jeden súbor z torrentu + + + File name + Názov súboru + + + Size + Veľkosť + + + Progress + Priebeh + + + Priority + Priorita + + + Unknown + Neznáma + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (po stiahnutí torrentu zostane %1) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (na stiahnutie treba ďalších %1) + + + diff --git a/src/lang/qbittorrent_sv.qm b/src/lang/qbittorrent_sv.qm new file mode 100644 index 0000000000000000000000000000000000000000..fe830dd0fbf03028c2d096acc316d11ebee4c15a GIT binary patch literal 68214 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 + + + + AboutDlg + + About qBittorrent + Om qBittorrent + + + About + Om + + + Author + Upphovsman + + + Name: + Namn: + + + Country: + Land: + + + E-mail: + E-post: + + + Home page: + Hemsida: + + + Christophe Dumez + Christophe Dumez + + + France + Frankrike + + + Translation + Översättning + + + License + Licens + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + Födelsedag: + + + Occupation: + Yrke: + + + 03/05/1985 + 1985-05-03 + + + Student in computer science + Studerar datorvetenskap + + + Thanks to + Tack till + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + En bittorrent-klient som använder Qt4 och libtorrent, programmerad i C++.<br><br>Copyright © 2006 by Christophe Dumez<br><br> <u>Webbplats:</u> <i>http://www.qbittorrent.org</i><br> + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En Bittorrent-klient programmerad i C++, baserad på Qt4-verktygslådan </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">och libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Webbsida:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Sändningsgräns: + + + Download limit: + Hämtningsgräns: + + + Unlimited + Unlimited (bandwidth) + Obegränsat + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent-konsoll + + + General + Allmänt + + + Blocked IPs + Blockerade IP + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Inställningar -- qBittorrent + + + Port range: + Portintervall: + + + ... + ... + + + Port: + Port: + + + Authentication + Autentisering + + + Password: + Lösenord: + + + Activate IP Filtering + Aktivera IP-filtrering + + + Filter Settings + Filterinställningar + + + Misc + Diverse + + + Language: + Språk: + + + KiB/s + KiB/s + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Observera:</b> Ändringar kommer att verkställas efter att qBittorrent har startats om. + + + Connection + Anslutning + + + Plastique style (KDE like) + Plastisk stil (KDE-liknande) + + + CDE style (Common Desktop Environment like) + CDE-stil (Common Desktop Environment-liknande) + + + HTTP + HTTP + + + SOCKS5 + SOCKS 5 + + + Affected connections + Berörda anslutningar + + + Use proxy for connections to trackers + Använd proxy för anslutningar till bevakare + + + Use proxy for connections to regular peers + Använd proxy för anslutningar till vanliga klienter + + + Use proxy for connections to web seeds + Använd proxy för anslutningar till webbdistributörer + + + Use proxy for DHT messages + Använd proxy för DHT-meddelanden + + + Enabled + Aktiverad + + + Forced + Tvingad + + + Disabled + Inaktiverad + + + Preferences + Inställningar + + + General + Allmänt + + + Network + Nätverk + + + IP Filter + IP-filter + + + User interface settings + Inställningar för användargränssnitt + + + Visual style: + Visuell stil: + + + Cleanlooks style (Gnome like) + Cleanlooks-stil (Gnome-liknande) + + + Motif style (Unix like) + Motif-stil (Unix-liknande) + + + Ask for confirmation on exit when download list is not empty + Fråga efter bekräftelse vid avslut när hämtningslistan inte är tom + + + Display current speed in title bar + Visa aktuell hastighet i titellisten + + + System tray icon + Ikon i aktivitetsfältet + + + Disable system tray icon + Inaktivera ikon i aktivitetsfältet + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Stäng till aktivitetsfält + + + Minimize to tray + Minimera till aktivitetsfält + + + Show notification balloons in tray + Visa notifieringsballongtext i aktivitetsfält + + + Downloads + Hämtningar + + + Put downloads in this folder: + Lägg hämtningar i denna mapp: + + + Pre-allocate all files + Förallokera alla filer + + + When adding a torrent + När en torrent läggs till + + + Display torrent content and some options + Visa torrent-innehåll och några alternativ + + + Do not start download automatically + The torrent will be added to download list in pause state + Starta inte hämtningen automatiskt + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Mappbevakning + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Dubbelklick i överföringslistan + + + Download list: + Hämtningslista: + + + Seeding list: + Distributionslista: + + + Download folder: + Hämtningsmapp: + + + Temp folder: + Temporärmapp: + + + Automatically download torrents present in this folder: + Hämta automatiskt torrent-filer som finns i denna mapp: + + + Listening port + Lyssningsport + + + Enable UPnP port mapping + Aktivera UPnP-portmappning + + + Enable NAT-PMP port mapping + Aktivera NAT-PMP-portmappning + + + Global bandwidth limiting + Allmän bandbreddsbegränsning + + + Upload: + Sändning: + + + Download: + Hämtning: + + + Bittorrent features + Bittorrent-funktioner + + + Use the same port for DHT and Bittorrent + Använd samma port för DHT och Bittorrent + + + DHT port: + DHT-port: + + + Type: + Typ: + + + (None) + (Ingen) + + + Proxy: + Proxy: + + + Username: + Användarnamn: + + + Bittorrent + Bittorrent + + + Connections limit + Gräns för anslutningar + + + Global maximum number of connections: + Allmänt maximalt antal anslutningar: + + + Maximum number of connections per torrent: + Maximalt antal anslutningar per torrent: + + + Maximum number of upload slots per torrent: + Maximalt antal sändningsplatser per torrent: + + + Additional Bittorrent features + Ytterligare Bittorrent-funktioner + + + Enable DHT network (decentralized) + Aktivera DHT-nätverk (decentraliserat) + + + Enable Peer eXchange (PeX) + Aktivera Peer eXchange (PeX) + + + Enable Local Peer Discovery + Aktivera identifiering av lokala klienter + + + Encryption: + Kryptering: + + + Share ratio settings + Inställningar för utdelningsförhållande + + + Desired ratio: + Önskat förhållande: + + + Filter file path: + Sökväg för filterfil: + + + transfer lists refresh interval: + Uppdateringsintervall för överföringslistor: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + Uppdateringsintervall för RSS-kanaler: + + + minutes + minuter + + + Maximum number of articles per feed: + Maximalt antal inlägg per RSS-kanal: + + + File system + Filsystem + + + Remove finished torrents when their ratio reaches: + Ta bort färdiga torrent-filer när deras förhållande når: + + + System default + Systemets standard + + + to + i.e: 1200 to 1300 + till + + + Start minimized + Starta minimerad + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Åtgärd vid dubbelklick i överföringslistor + + + In download list: + I hämtningslista: + + + Pause/Start torrent + Pausa/Starta torrent-fil + + + Open destination folder + Öppna målmapp + + + Display torrent properties + Visa egenskaper för torrent-fil + + + In seeding list: + I distribueringslista: + + + Folder scan interval: + Mappavsökningsintervall: + + + seconds + sekunder + + + Spoof Azureus to avoid ban (requires restart) + Identifiera som Azureus för att undvika bannlysning (kräver omstart) + + + Web UI + Webbgränssnitt + + + Enable Web User Interface + Aktivera webbgränssnitt + + + HTTP Server + HTTP-server + + + Enable RSS support + Aktivera RSS-stöd + + + RSS settings + RSS-inställningar + + + Enable queueing system + Aktivera kösystem + + + Maximum active downloads: + Maximalt antal aktiva hämtningar: + + + Torrent queueing + Torrentkö + + + Maximum active torrents: + Maximalt antal aktiva torrent: + + + Display top toolbar + Visa övre verktygsrad + + + Proxy + Proxyserver + + + Search engine proxy settings + Proxyinställningar för sökmotor + + + Bittorrent proxy settings + Proxyinställningar för Bittorrent + + + Maximum active uploads: + Maximalt antal aktiva sändningar: + + + Spoof µtorrent to avoid ban (requires restart) + Simulera µtorrent för att undvika bannlysning (kräver omstart) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Åtgärd för dubbelklick + + + Start/Stop + Starta/Stoppa + + + Open folder + Öppna mapp + + + Show properties + Visa egenskaper + + + Port used for incoming connections: + Port att använda för inkommande anslutningar: + + + Random + Slumpmässigt + + + UI + Användargränssnitt + + + + DownloadingTorrents + + Name + i.e: file name + Namn + + + Size + i.e: file size + Storlek + + + Progress + i.e: % downloaded + Förlopp + + + DL Speed + i.e: Download speed + Hämtningshastighet + + + UP Speed + i.e: Upload speed + Sändningshastighet + + + Seeds/Leechs + i.e: full/partial sources + Dist/Repr + + + Ratio + Förhållande + + + ETA + i.e: Estimated Time of Arrival / Time left + Färdig om + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 startad. + + + Hide or Show Column + Dölj eller visa kolumn + + + Priority + Prioritet + + + Seeds/Leechers + i.e: full/partial sources + Distributörer/Reciprokörer + + + + FeedDownloader + + RSS Feed downloader + Hämta RSS-kanal + + + RSS feed: + RSS-kanal: + + + Feed name + Kanalnamn + + + Automatically download torrents from this feed + Hämta automatiskt torrentfiler från denna kanal + + + Download filters + Hämtningsfilter + + + Filters: + Filter: + + + Filter settings + Filterinställningar + + + Matches: + Matchar: + + + Does not match: + Matchar inte: + + + Destination folder: + Målmapp: + + + ... + ... + + + Filter testing + Testa filter + + + Torrent title: + Torrent-titel: + + + Result: + Resultat: + + + Test + Testa + + + Import... + Importera... + + + Export... + Exportera... + + + Rename filter + Byt namn på filter + + + Remove filter + Ta bort filter + + + Add filter + Lägg till filter + + + + FeedDownloaderDlg + + New filter + Nytt filter + + + Please choose a name for this filter + Välj ett namn för detta filter + + + Filter name: + Filternamn: + + + Invalid filter name + Ogiltigt filternamn + + + The filter name cannot be left empty. + Filternamnet får inte lämnas tomt. + + + This filter name is already in use. + Detta filternamn används redan. + + + Filter testing error + Fel vid test av filter + + + Please specify a test torrent name. + Ange ett torrentnamn för test. + + + matches + matchar + + + does not match + matchar inte + + + Select file to import + Välj en fil att importera + + + Filters Files + Filtrerar filer + + + Import successful + Import lyckades + + + Filters import was successful. + Filterimport lyckades. + + + Import failure + Importfel + + + Filters could not be imported due to an I/O error. + Filter kunde inte importeras på grund av ett in-/ut-fel. + + + Select destination file + Välj målfil + + + Overwriting confirmation + Bekräfta överskrivning + + + Are you sure you want to overwrite existing file? + Är du säker på att du vill skriva över den befintliga filen? + + + Export successful + Export lyckades + + + Filters export was successful. + Filterexport lyckades. + + + Export failure + Fel vid export + + + Filters could not be exported due to an I/O error. + Filter kunde inte exporteras på grund av ett in-/ut-fel. + + + + FeedList + + Unread + Oläst + + + + FilterParserThread + + I/O Error + Input/Output Error + In/Ut-fel + + + Couldn't open %1 in read mode. + Kunde inte öppna %1 i läsläge. + + + %1 is not a valid PeerGuardian P2B file. + %1 är inte en giltig PeerGuardian P2B-fil. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Name + i.e: file name + Namn + + + Size + i.e: file size + Storlek + + + UP Speed + i.e: Upload speed + Sändningshastighet + + + Seeds / Leechers + Distr. / Reciprokörer + + + Connected peers + Anslutna klienter + + + Total uploaded + i.e: Total amount of uploaded data + Totalt skickat + + + Ratio + Förhållande + + + Leechers + i.e: full/partial sources + Reciprokörer + + + Hide or Show Column + Dölj eller visa kolumn + + + Incomplete torrent in seeding list + Ej komplett torrent-fil i distribueringslista + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Det verkar som om tillståndet för torrent-filen \"%1\" ändrats från 'seeding' till 'downloading'. Vill du flytta tillbaka den till hämtningslistan? (om inte kommer torrent-filen helt enkelt att tas bort) + + + Priority + Prioritet + + + + GUI + + Open Torrent Files + Öppna Torrent-filer + + + &Yes + &Ja + + + &No + &Nej + + + Are you sure you want to delete the selected item(s) in download list? + Är du säker på att du vill ta bort de markerade post(erna) i hämtningslistan? + + + Torrent Files + Torrent-filer + + + Are you sure? -- qBittorrent + Är du säker? -- qBittorrent + + + Download finished + Hämtningen är färdig + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Anslutningsstatus: + + + qBittorrent + qBittorrent + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Hämtning: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Sändning: %1 KiB/s + + + Are you sure you want to quit? + Är du säker på att du vill avsluta? + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 har hämtats färdigt. + + + I/O Error + i.e: Input/Output Error + In/Ut-fel + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Ett fel inträffade vid försök att läsa eller skriva %1. Disken är antagligen full, hämtningen har pausats + + + Connection Status: + Anslutningsstatus: + + + Online + Ansluten + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Ett fel inträffade (full disk?), "%1" har pausats. + + + Search + Sök + + + RSS + RSS + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent är bunden till port: %1 + + + DHT support [ON], port: %1 + DHT-stöd [PÅ], port: %1 + + + DHT support [OFF] + DHT-stöd [AV] + + + PeX support [ON] + PeX-stöd [PÅ] + + + PeX support [OFF] + PeX-stöd [AV] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Hämtningslistan är inte tom. +Är du säker på att du vill avsluta qBittorrent? + + + Downloads + Hämtningar + + + Finished + Färdiga + + + Are you sure you want to delete the selected item(s) in finished list? + Är du säker på att du vill ta bort de markerade färdiga objekt(en) i listan? + + + UPnP support [ON] + UPnP-stöd [PÅ] + + + Encryption support [ON] + Krypteringsstöd [PÅ] + + + Encryption support [FORCED] + Krypteringsstöd [TVINGAD] + + + Encryption support [OFF] + Krypteringsstöd [AV] + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Fel vid url-hämtning + + + Couldn't download file at url: %1, reason: %2. + Kunde inte hämta fil från url:en: %1, anledning: %2. + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Är du säker på att du vill ta bort de markerade objekt(en) från hämtningslistan och från hårddisken? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Är du säker på att du vill ta bort de markerade färdiga objekt(en) från listan och från hårddisken? + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Ett in-/ut-fel inträffade för torrentfilen %1. + Anledning: %2 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent är bunden till port: TCP/%1 + + + UPnP support [OFF] + UPnP-stöd [AV] + + + NAT-PMP support [ON] + NAT-PMP-stöd [PÅ] + + + NAT-PMP support [OFF] + NAT-PMP-stöd [AV] + + + DHT support [ON], port: UDP/%1 + DHT-stöd [PÅ], port: UDP/%1 + + + Local Peer Discovery [ON] + Identifiering av lokala klienter [PÅ] + + + Local Peer Discovery support [OFF] + Stöd för identifiering av lokala klienter [AV] + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Ned: %2 KiB/s, Upp: %3 KiB/s) + + + DL: %1 KiB/s + Ned: %1 KiB/s + + + UP: %1 KiB/s + Upp: %1 KiB/s + + + Ratio: %1 + Förhållande: %1 + + + DHT: %1 nodes + DHT: %1 noder + + + No direct connections. This may indicate network configuration problems. + Inga direktanslutningar. Detta kan betyda problem med nätverkskonfigurationen. + + + Uploads + Sändningar + + + Options were saved successfully. + Inställningarna sparades. + + + + MainWindow + + &Edit + R&edigera + + + &File + &Arkiv + + + &Help + &Hjälp + + + Open + Öppna + + + Exit + Avsluta + + + Preferences + Inställningar + + + About + Om + + + Start + Starta + + + Pause + Gör paus + + + Delete + Ta bort + + + Pause All + Pausa alla + + + Start All + Starta alla + + + Torrent Properties + Egenskaper för torrent + + + Download from URL + Hämta från url + + + Create torrent + Skapa torrent + + + Preview file + Förhandsvisa fil + + + Clear log + Töm logg + + + Delete Permanently + Ta bort permanent + + + Visit website + Besök webbsidan + + + Report a bug + Rapportera ett fel + + + Set upload limit + Ställ in sändningsgräns + + + Set download limit + Ställ in hämtningsgräns + + + Documentation + Dokumentation + + + Set global download limit + Ställ in allmän hämtningsgräns + + + Set global upload limit + Ställ in allmän sändningsgräns + + + Options + Inställningar + + + Decrease priority + Sänk prioriteten + + + Increase priority + Öka prioriteten + + + Console + Konsoll + + + + PropListDelegate + + Ignored + Ignoreras + + + Normal + Normal (priority) + Normal + + + High + High (priority) + Hög + + + Maximum + Maximum (priority) + Maximal + + + + RSS + + Search + Sök + + + Delete + Ta bort + + + Rename + Byt namn + + + Refresh + Uppdatera + + + Delete selected streams + Ta bort markerade kanaler + + + Refresh RSS streams + Uppdatera RSS-kanaler + + + Add a new RSS stream + Lägg till en ny RSS-kanal + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Nyheter:</b> <i>(dubbelklicka för att öppna länken i din webbläsare)</i> + + + Add RSS stream + Lägg till RSS-kanal + + + Refresh all streams + Uppdatera alla kanaler + + + RSS streams: + RSS-kanaler: + + + 2 + 2 + + + Mark all as read + Markera alla som lästa + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrentar:</span> <span style=" font-style:italic;">(dubbelklicka för att hämta)</span></p></body></html> + + + Download torrent + Hämta torrent + + + Open news URL + Öppna URL för nyheter + + + Copy feed URL + Kopera URL för kanal + + + RSS feed downloader + Hämta RSS-kanal + + + New subscription + Ny prenumeration + + + Mark items read + Markera objekt som lästa + + + Update all + Uppdatera alla + + + Update all feeds + Uppdatera alla kanaler + + + RSS feeds + RSS-kanaler + + + Update + Uppdatera + + + New folder + Ny mapp + + + 1 + 1 + + + Feed URL + URL för kanal + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Ange en url för en RSS-kanal + + + Stream URL: + URL för kanal: + + + Please choose a new name for this stream + Välj ett nytt namn för den här kanalen + + + New stream name: + Nytt kanalnamn: + + + Are you sure? -- qBittorrent + Är du säker? -- qBittorrent + + + &Yes + &Ja + + + &No + &Nej + + + Are you sure you want to delete this stream from the list? + Är du säker på att du vill ta bort den här kanalen från listan? + + + Description: + Beskrivning: + + + url: + url: + + + Last refresh: + Senast uppdaterad: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Den här kanalen finns redan i listan. + + + Date: + Datum: + + + Author: + Upphovsman: + + + Please choose a folder name + Välj ett mappnamn + + + Folder name: + Mappnamn: + + + New folder + Ny mapp + + + Are you sure you want to delete these elements from the list? + Är du säker på att du vill ta bort dessa element från listan? + + + Are you sure you want to delete this element from the list? + Är du säker på att du vill ta bort detta element från listan? + + + Please choose a new name for this RSS feed + Välj ett nytt namn för denna RSS-kanal + + + New feed name: + Nytt kanalnamn: + + + Name already in use + Namnet används redan + + + This name is already used by another item, please choose another one. + Detta namn används redan av ett annat objekt. Välj ett annat namn. + + + Overwrite attempt + Överskrivningsförsök + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + Du kan inte skriva över %1 objekt. + + + Unread + Oläst + + + + RssItem + + No description available + Ingen beskrivning tillgänglig + + + + RssStream + + %1 ago + 10min ago + %1 sedan + + + Never + Aldrig + + + Automatically downloading %1 torrent from %2 RSS feed... + Hämtar automatiskt torrentfilen %1 från RSS-kanalen %2... + + + + SearchCategories + + All categories + Alla kategorier + + + Movies + Filmer + + + TV shows + TV-program + + + Music + Musik + + + Games + Spel + + + Anime + Anime + + + Software + Programvara + + + Pictures + Bilder + + + Books + Böcker + + + + SearchEngine + + Cut + Klipp ut + + + Copy + Kopiera + + + Paste + Klistra in + + + Clear field + Töm fältet + + + Clear completion history + Töm kompletteringshistorik + + + Empty search pattern + Tomt sökmönster + + + Please type a search pattern first + Ange ett sökmönster först + + + Results + Resultat + + + Searching... + Söker... + + + Search Engine + Sökmotor + + + Search has finished + Sökningen är färdig + + + An error occured during search... + Ett fel inträffade under sökningen... + + + Search aborted + Sökningen avbröts + + + Search returned no results + Sökningen returnerade inga resultat + + + Results + i.e: Search results + Resultat + + + Unknown + Okänt + + + + SearchTab + + Name + i.e: file name + Namn + + + Size + i.e: file size + Storlek + + + Seeders + i.e: Number of full sources + Distributörer + + + Leechers + i.e: Number of partial sources + Reciprokörer + + + Search engine + Sökmotor + + + + TrackersAdditionDlg + + Trackers addition dialog + Lägg till bevakare + + + List of trackers to add (one per line): + Lista över bevakare att lägga till (en per rad): + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Jag vill tacka följande personer som bidragit med att översätta qBittorrent: + + + Please contact me if you would like to translate qBittorrent into your own language. + Kontakta mig om du vill översätta qBittorrent till ditt språk. + + + + addTorrentDialog + + Torrent addition dialog + Lägg till torrent-fil + + + Save path: + Sökväg att spara i: + + + ... + ... + + + Torrent content: + Innehåll: + + + Download in correct order (slower but good for previewing) + Hämta i korrekt ordning (långsammare men bra för förhandsvisning) + + + Add to download list in paused state + Lägg till i hämtningslistan i pausat tillstånd + + + Add + Lägg till + + + Cancel + Avbryt + + + Ignored + Ignoreras + + + Normal + Normal + + + High + Hög + + + Maximum + Maximal + + + Collapse all + Fäll in alla + + + Expand All + Fäll ut alla + + + Expand all + Fäll ut alla + + + Torrent size: + Torrentstorlek: + + + Unknown + Okänd + + + Free disk space: + Ledigt diskutrymme: + + + Download in sequential order (slower but good for previewing) + Hämta i sekventiell ordning (långsammare men bra för förhandsvisning) + + + + authentication + + Tracker authentication + Autentisering för bevakare + + + Tracker: + Bevakare: + + + Login + Inloggning + + + Username: + Användarnamn: + + + Password: + Lösenord: + + + Log in + Logga in + + + Cancel + Avbryt + + + + bandwidth_dlg + + Bandwidth allocation + Bandbreddsallokering + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 har nått maximalt angivet förhållande. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + "%1" togs bort permanent. + + + '%1' was removed. + 'xxx.avi' was removed. + "%1" togs bort. + + + '%1' paused. + e.g: xxx.avi paused. + "%1" pausad. + + + '%1' resumed. + e.g: xxx.avi resumed. + "%1" återupptogs. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + "%1" finns redan i hämtningslistan. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + "%1" återupptogs. (snabbt läge) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + "%1" lades till i hämtningslistan. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Kunde inte avkoda torrent-fil: "%1" + + + This file is either corrupted or this isn't a torrent. + Denna fil är antingen skadad eller så är den inte en torrent-fil. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>blockerades på grund av ditt IP-filter</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>har bannlysts på grund av skadade delar</i> + + + Couldn't listen on any of the given ports. + Kunde inte lyssna på någon av de angivna portarna. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Fel i portmappning, meddelande: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Portmappning lyckades, meddelande: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Snabb återupptagning av data nekades för torrent-filen %1, kontrollerar igen... + + + Url seed lookup failed for url: %1, message: %2 + Uppslagning av url misslyckades för: %1, meddelande: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Hämtar "%1", vänta... + + + '%1' is not a valid magnet URI. + "%1" är inte en giltig magnet-URI. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + Rekursiv hämtning av filen %1 inbäddad i torrentfilen %2 + + + Unable to decode %1 torrent file. + Kunde inte avkoda torrentfilen %1. + + + + createTorrentDialog + + Cancel + Avbryt + + + Torrent Creation Tool + Verktyg för att skapa torrent + + + Torrent file creation + Skapa torrent-fil + + + Announce urls (trackers): + Annonserings-url:er (bevakare): + + + Comment (optional): + Kommentar (valfritt): + + + Web seeds urls (optional): + Url:er för webbdistribution (valfritt): + + + File or folder to add to the torrent: + Fil eller mapp att lägga till i torrent: + + + Add a file + Lägg till en fil + + + Add a folder + Lägg till en mapp + + + Piece size: + Delstorlek: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + Privat (kommer inte att distribueras på DHT-nätverk om aktiverat) + + + Start seeding after creation + Börja distribuera efter den skapats + + + Create and save... + Skapa och spara... + + + Progress: + Förlopp: + + + Add file + Lägg till fil + + + Add folder + Lägg till mapp + + + + createtorrent + + Select destination torrent file + Välj mål för torrent-fil + + + Torrent Files + Torrent-filer + + + No input path set + Ingen sökväg inställd för indata + + + Please type an input path first + Ange en sökväg för indata först + + + Torrent creation + Skapa torrent + + + Torrent was created successfully: + Torrentfilen skapades: + + + Select a folder to add to the torrent + Välj en mapp att lägga till i torrent-filen + + + Please type an announce URL + Ange en annonserings-url + + + Torrent creation was unsuccessful, reason: %1 + Skapandet av torrent-fil misslyckades, anledning: %1 + + + Announce URL: + Tracker URL + Annonserings-url: + + + Please type a web seed url + Ange en url för webbdistribution + + + Web seed URL: + Url för webbdistribution: + + + Select a file to add to the torrent + Välj en fil att lägga till i torrent + + + No tracker path set + Ingen sökväg för bevakare inställd + + + Please set at least one tracker + Ställ åtminstone in en bevakare + + + Created torrent file is invalid. It won't be added to download list. + Skapad torrentfil är ogiltig. Den kommer inte att läggas till i hämtningslistan. + + + + downloadFromURL + + Download from urls + Hämta från url:er + + + Download Torrents from URLs + Hämta torrent-filer från url:er + + + Only one URL per line + Endast en url per rad + + + Download + Hämta + + + Cancel + Avbryt + + + No URL entered + Ingen URL angavs + + + Please type at least one URL. + Ange åtminstone en url. + + + + downloading + + Search + Sök + + + Start + Starta + + + Pause + Gör paus + + + Delete + Ta bort + + + Preview file + Förhandsvisa fil + + + Set upload limit + Ställ in sändningsgräns + + + Set download limit + Ställ in hämtningsgräns + + + Delete Permanently + Ta bort permanent + + + Torrent Properties + Egenskaper för torrent + + + Open destination folder + Öppna målmapp + + + Name + Namn + + + Size + Storlek + + + Progress + Förlopp + + + DLSpeed + Hämtning + + + UpSpeed + Sändning + + + Seeds/Leechs + Dist/Repr + + + Ratio + Förhållande + + + ETA + Färdig om + + + Buy it + Köp den + + + Priority + Prioritet + + + Increase priority + Öka prioriteten + + + Decrease priority + Sänk prioriteten + + + Force recheck + Tvinga återkontroll + + + Copy magnet link + Kopiera magnetlänk + + + + engineSelect + + Search plugins + Sökinsticksmoduler + + + Installed search engines: + Installerade sökmotorer: + + + Name + Namn + + + Url + Url + + + Enabled + Aktiverad + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Du kan hämta nya sökmotorinstick här: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Installera ett nytt instick + + + Check for updates + Leta efter uppdateringar + + + Close + Stäng + + + Enable + Aktivera + + + Disable + Inaktivera + + + Uninstall + Avinstallera + + + + engineSelectDlg + + True + Sant + + + False + Falskt + + + Uninstall warning + Varning vid avinstallation + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Vissa insticksmoduler kunde inte avinstalleras därför att de är inkluderade i qBittorrent. +Endast de som du själv har lagt till kan avinstalleras. +Dock har dessa insticksmoduler blivit inaktiverade. + + + Uninstall success + Avinstallation lyckades + + + Select search plugins + Välj sökinsticksmoduler + + + qBittorrent search plugins + Sökinsticksmoduler för qBittorrent + + + Search plugin install + Installation av sökinsticksmoduler + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + En senare version av sökmotorinsticket %1 är redan installerat. + + + Search plugin update + Uppdatering av sökinstick + + + Sorry, update server is temporarily unavailable. + Tyvärr, uppdateringsservern är inte tillgänglig för tillfället. + + + All your plugins are already up to date. + Alla dina insticksmoduler är redan uppdaterade. + + + All selected plugins were uninstalled successfully + Alla markerade insticksmoduler avinstallerades + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Insticksmodulen för sökmotorn %1 kunde inte uppdateras, behåller gammal version. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Insticksmodulen för sökmotorn %1 kunde inte installeras. + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Insticksmodulen för sökmotorn %1 uppdaterades. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Insticksmodulen för sökmotorn %1 installerades. + + + Search engine plugin archive could not be read. + Insticksmodularkivet för sökmotorn kunde inte läsas. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Tyvärr, installationen av sökinsticket %1 misslyckades. + + + New search engine plugin URL + Url för nytt sökmotorinstick + + + URL: + Url: + + + Yes + Ja + + + No + Nej + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + Unknown + Unknown (size) + Okänd + + + < 1m + < 1 minute + < 1 min + + + %1m + e.g: 10minutes + %1 min + + + %1h%2m + e.g: 3hours 5minutes + %1h %2min + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1d %2h %3min + + + + options_imp + + Choose scan directory + Välj en avsökningskatalog + + + Choose a save directory + Välj en katalog att spara i + + + Choose an ip filter file + Välj en IP-filterfil + + + Filters + Filter + + + + pluginSourceDlg + + Plugin source + Insticksmodulkälla + + + Search plugin source: + Sök insticksmodulkälla: + + + Local file + Lokal fil + + + Web link + Webblänk + + + + preview + + Preview selection + Förhandsvisa markering + + + File preview + Förhandsvisa fil + + + The following files support previewing, <br>please select one of them: + Följande filer har stöd för förhandsvisning. <br>välj en av dem: + + + Preview + Förhandsvisa + + + Cancel + Avbryt + + + + previewSelect + + Preview impossible + Förhandsvisning inte möjlig + + + Sorry, we can't preview this file + Tyvärr, vi kan inte förhandsvisa den här filen + + + Name + Namn + + + Size + Storlek + + + Progress + Förlopp + + + + properties + + Torrent Properties + Egenskaper om torrent + + + OK + OK + + + Unknown + Okänd + + + Files contained in current torrent: + Filer i aktuell torrent: + + + Size + Storlek + + + Trackers: + Bevakare: + + + None - Unreachable? + Ingen - Ej nåbar? + + + Progress + Förlopp + + + Main infos + Information + + + Current tracker: + Aktuell bevakare: + + + Total uploaded: + Totalt skickat: + + + Main info + Allmän info + + + Torrent information + Torrentinformation + + + Total downloaded: + Totalt hämtat: + + + Total failed: + Totalt misslyckade: + + + Torrent content + Torrent-innehåll + + + Download in correct order (slower but good for previewing) + Hämta i korrekt ordning (långsammare men bra för förhandsvisning) + + + Save path: + Sökväg att spara i: + + + Torrent infos + Torrent-information + + + Creator: + Skapare: + + + Torrent hash: + Torrent-hash: + + + Comment: + Kommentar: + + + Current session + Aktuell session + + + Share ratio: + Utdelningsförhållande: + + + Trackers + Bevakare + + + Priorities: + Prioriteringar: + + + Normal: normal priority. Download order is dependent on availability + Normal: normal prioritet. Hämtningsordningen är beroende av tillgänglighet + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Hög: högre än normal prioritet. Delarna föredras över delar med samma tillgänglighet, men inte över delar med lägre tillgänglighet + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Maximal: maximal prioritet, tillgänglighet används inte, delen föredras över alla andra delar med lägre prioritet + + + File name + Filnamn + + + Priority + Prioritet + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Listan över bevakare får inte vara tom. + + + Ignored: file is not downloaded at all + Ignoreras: filen hämtas inte alls + + + Ignored + Ignoreras + + + Normal + Normal + + + Maximum + Maximal + + + High + Hög + + + Url seeds + Url-distributioner + + + New url seed: + Ny url-distribution: + + + This url seed is already in the list. + Den här url-distributionen finns redan i listan. + + + New url seed + New HTTP source + Ny url-distribution + + + The following url seeds are available for this torrent: + Följande url-distributioner finns tillgängliga för denna torrent: + + + Priorities error + Prioriteringsfel + + + Error, you can't filter all the files in a torrent. + Fel, du kan inte filtrera alla filerna i en torrent. + + + Downloaded pieces + Hämtade delar + + + Collapse all + Fäll in alla + + + Expand all + Fäll in alla + + + ... + ... + + + Choose save path + Välj sökväg att spara i + + + Save path creation error + Fel vid skapandet av sökväg + + + Could not create the save path + Kunde inte skapa sökväg att spara i + + + + search_engine + + Search + Sök + + + Search Pattern: + Sökmönster: + + + Stop + Stoppa + + + Status: + Status: + + + Stopped + Stoppad + + + Download + Hämta + + + Search engines... + Sökmotorer... + + + + seeding + + Search + Sök + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Observera:</u> Det är viktigt att du fortsätter dela ut dina torrent-filer efter att de är färdiga för att nätverket ska fungera. + + + Start + Starta + + + Pause + Gör paus + + + Delete + Ta bort + + + Delete Permanently + Ta bort permanent + + + Torrent Properties + Egenskaper för torrent + + + Preview file + Förhandsvisa fil + + + Set upload limit + Ställ in sändningsgräns + + + Open destination folder + Öppna målmapp + + + Name + Namn + + + Size + Storlek + + + Upload Speed + Sändningshastighet + + + Connected peers + Anslutna klienter + + + Seeds / Leechers + Distr. / Reciprokörer + + + Leechers + Reciprokörer + + + Ratio + Förhållande + + + Buy it + Köp den + + + Total uploaded + Totalt skickat + + + Priority + Prioritet + + + Increase priority + Öka prioriteten + + + Decrease priority + Sänk prioriteten + + + Force recheck + Tvinga återkontroll + + + Copy magnet link + Kopiera magnetlänk + + + + subDownloadThread + + Host is unreachable + Värden är inte nåbar + + + File was not found (404) + Filen kunde inte hittas (404) + + + Connection was denied + Anslutningen nekades + + + Url is invalid + Url:en är ogiltig + + + Connection failure + Anslutningsfel + + + Connection was timed out + Tidsgränsen för anslutningen överstegs + + + Incorrect network interface + Felaktigt nätverksgränssnitt + + + Unknown error + Okänt fel + + + Could not resolve proxy + Kunde inte slå upp proxy + + + I/O Error + In/Ut-fel + + + + torrentAdditionDialog + + Unable to decode torrent file: + Kunde inte avkoda torrent-fil: + + + This file is either corrupted or this isn't a torrent. + Denna fil är antingen skadad eller så är den inte en torrent-fil. + + + Choose save path + Välj sökväg att spara i + + + Empty save path + Tom sökväg för att spara i + + + Please enter a save path + Ange en sökväg att spara i + + + Save path creation error + Fel vid skapandet av sökväg + + + Could not create the save path + Kunde inte skapa sökväg att spara i + + + Invalid file selection + Ogiltig filmarkering + + + You must select at least one file in the torrent + Du måste välja åtminstone en fil i torrent-filen + + + File name + Filnamn + + + Size + Storlek + + + Progress + Förlopp + + + Priority + Prioritet + + + Unknown + Okänd + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (%1 kvar efter torrenthämtning) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (%1 ytterligare krävs för att hämta) + + + diff --git a/src/lang/qbittorrent_tr.qm b/src/lang/qbittorrent_tr.qm new file mode 100644 index 0000000000000000000000000000000000000000..78537a0d1bcc704d3aab006e6804426c10effd9b GIT binary patch literal 67544 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 rB{$QCEcW1GOIvMc!5keKgY + + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + About qBittorrent + qBittorrent Hakkında + + + About + Hakkında + + + Author + Yazar + + + Name: + Ad: + + + Country: + Ülke: + + + E-mail: + E-posta: + + + Home page: + Anasayfa: + + + Christophe Dumez + Christophe Dumez + + + France + Fransa + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Teşekkürler + + + Translation + Çeviri + + + License + Lisans + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Qt4 ve libtorrent kullanan, C++ da derlenmiş bir bittorrent istemcisi.<br> +<br> +Telif Hakkı © 2006 Christophe Dumez<br> +<br> <u>Anasayfa:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + qBittorrent Yazarı + + + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + Doğum Günü: + + + Occupation: + Meslek: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Bilgisayar mühendisliğinde öğrenci + + + Thanks to + Teşekkürler + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Qt4 ve libtorrent kullanan, C++ ile programlanan bir bittorrent istemcisidir.<br> +<br> +Telif Hakkı © 2006 Christophe Dumez<br> +<br> <u>Ana Sayfa:</u> <i>http://www.qbittorrent.org</i><br> + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt4 tabanlı, C++ da derlenmiş bir bittorrent istemcisi </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ve libtorrent-rasterbar kullanıyor. <br /><br />Telif hakkı ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Ana Sayfa:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + Gönderme Sınırı: + + + Download limit: + İndirme Sınırı: + + + Unlimited + Unlimited (bandwidth) + Sınırsız + + + KiB/s + KB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent uçbirimi + + + General + Genel + + + Blocked IPs + Engellenmiş IP'ler + + + + DLListDelegate + + KiB/s + KB/s + + + + Dialog + + Options -- qBittorrent + Seçenekler -- qBittorrent + + + Options + Ayarlar + + + Main + Ana + + + Save Path: + Kayıt Yolu: + + + Download Limit: + Download Limiti: + + + Upload Limit: + Upload Limiti: + + + Max Connects: + Max Bağlantı: + + + Port range: + Kapı erimi: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Etkisizleştir + + + connections + bağlantı + + + to + buraya + + + Proxy + Vekil + + + Proxy Settings + Proxy Ayarları + + + Server IP: + Sunucu Adresi: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Kapı: + + + Proxy server requires authentication + Proxy sunucusu kimlik denetimi gerektiriyor + + + Authentication + Kimlik Denetimi + + + User Name: + Kullanıcı Adı: + + + Password: + Parola: + + + Enable connection through a proxy server + Proxy sunucusu üzerinden bağlantı kurmayı etkinleştir + + + Language + Dil + + + Please choose your preferred language in the following list: + Lütfen aşağıdaki listeden tercih ettiğiniz dili seçin: + + + English + İngilizce + + + French + Fransızca + + + Simplified Chinese + Basitleştirilmiş Çince + + + OK + TAMAM + + + Cancel + İptal + + + Language settings will take effect after restart. + Dil ayarları program yeniden başlatıldıktan sonra devreye girecektir. + + + Scanned Dir: + Taranmış Klasör: + + + Enable directory scan (auto add torrent files inside) + Klasör taramayı etkinleştir (otomatik torrent dosyası ekleme) + + + Korean + Korece + + + Spanish + İspanyolca + + + German + Almanca + + + Connection Settings + Bağlantı Ayarları + + + Share ratio: + Paylaşım oranı: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + IP Süzgeçlemeyi Etkinleştir + + + Filter Settings + Süzgeç Ayarları + + + ipfilter.dat URL or PATH: + ipfilter.dat URL veya KLASÖR: + + + Start IP + Başlangıç IP + + + End IP + Bitiş IP + + + Origin + Merkez + + + Comment + Yorum + + + Apply + Uygula + + + IP Filter + IP Süzgeci + + + Add Range + Aralık Ekle + + + Remove Range + Aralığı Kaldır + + + Catalan + Catalan + + + ipfilter.dat Path: + ipfilter.dat KLASÖR: + + + Clear finished downloads on exit + Çıkarken biten downloadları temizle + + + Ask for confirmation on exit + Çıkarken onaylama sor + + + Go to systray when minimizing window + Pencereyi sistem çubuğuna küçült + + + Misc + Çeşitli + + + Localization + Yerelleştirme + + + Language: + Dil: + + + Behaviour + Davranış + + + OSD + OSD + + + Always display OSD + Her zaman OSD yi göster + + + Display OSD only if window is minimized or iconified + OSD yi sadece pencere küçültülmüşken ya da simge durumundayken göster + + + Never display OSD + OSD yi asla gösterme + + + KiB/s + KB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + DHT (Trackersız): + + + Disable DHT (Trackerless) support + DHT (Trackersız) desteğini etkisizleştir + + + Automatically clear finished downloads + Tamamlanan downloadları otomatik temizle + + + Preview program + Önizleme programı + + + Audio/Video player: + Ses/Video oynatıcısı: + + + DHT configuration + DHT ayarları + + + DHT port: + DHT portu: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Not:</b> Değişiklikler qBittorrent yeniden başlatıldıktan sonra uygulanacaktır. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>Çevirmenlerin notu:</b> Eğer qBittorrent dilinizde mevcut değilse,<br/>ve eğer anadilinize çevirmek istiyorsanız, <br/>lütfen iletişime geçin (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Her torrent eklendiğinde torrent ekleme penceresini görüntüle + + + Default save path + Varsayılan kayıt yolu + + + Systray Messages + Systray Mesajları + + + Always display systray messages + Her zaman systray mesajlarını göster + + + Display systray messages only when window is hidden + Systray mesajlarını sadece pencere gizlenmişken göster + + + Never display systray messages + Systray mesajlarını asla gösterme + + + Disable DHT (Trackerless) + DHT yi etkisizleştir (Trackersız) + + + Disable Peer eXchange (PeX) + Peer eXchange i (PeX) etkisizleştir + + + Go to systray when closing main window + Ana pencereyi kapatınca systray e küçült + + + Connection + Bağlantı + + + Plastique style (KDE like) + Plastik biçem (KDE benzeri) + + + CDE style (Common Desktop Environment like) + CDE biçemi (Common Desktop Environment benzeri) + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + Etkilenen bağlantılar + + + Use proxy for connections to trackers + İzleyicilere bağlantı için vekil kullan + + + Use proxy for connections to regular peers + Düzenli eşlere bağlantı için vekil kullan + + + Use proxy for connections to web seeds + Ağ göndericilerine bağlantı için vekil kullan + + + Use proxy for DHT messages + DHT iletileri için vekil kullan + + + Enabled + Etkin + + + Forced + Zorlandı + + + Disabled + Etkisiz + + + Preferences + Yeğlenenler + + + General + Genel + + + Network + + + + User interface settings + Kullanıcı arayüzü ayarları + + + Visual style: + Görsel biçem: + + + Cleanlooks style (Gnome like) + Temiz görünüşler biçemi (Gnome benzeri) + + + Motif style (Unix like) + Motif biçemi (Unix benzeri) + + + Ask for confirmation on exit when download list is not empty + İndirme listesi boş değilse çıkışta onay iste + + + Display current speed in title bar + Başlık çubuğunda şimdiki hızı göster + + + System tray icon + Sistem tepsisi simgesi + + + Disable system tray icon + Sistem tepsisi simgesini etkisizleştir + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Sistem tepsisine kapat + + + Minimize to tray + Sistem tepsisine küçült + + + Show notification balloons in tray + Sistem tepsisinde bildiri balonları göster + + + Media player: + Media player: + + + Downloads + İndirilenler + + + Put downloads in this folder: + İndirilenleri bu klasöre koy: + + + Pre-allocate all files + Bütün dosyalar için alan tahsisi yap + + + When adding a torrent + Bir torrent eklerken + + + Display torrent content and some options + Torrent içeriğini ve bazı seçenekleri göster + + + Do not start download automatically + The torrent will be added to download list in pause state + İndirmeyi otomatik olarak başlatma + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Klasör izleme + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + Aktarım listesinde çift-tıklamada yapılacak + + + Download list: + İndirme listesi: + + + Seeding list: + Gönderme listesi: + + + Download folder: + İndirme klasörü: + + + Temp folder: + Geçici klasör: + + + Automatically download torrents present in this folder: + Bu klasörde bulunan torrentleri otomatik indir: + + + Listening port + Kullanılan kapı + + + to + i.e: 1200 to 1300 + den + + + Enable UPnP port mapping + UPnP kapı haritalamayı etkinleştir + + + Enable NAT-PMP port mapping + NAT-PMP kapı haritalamayı etkinleştir + + + Global bandwidth limiting + Genel bant genişliği sınırlama + + + Upload: + Gönderme: + + + Download: + İndirme: + + + Bittorrent features + Bittorrent özellikleri + + + Use the same port for DHT and Bittorrent + DHT ve Bittorrent için aynı portu kullan + + + Type: + Tip: + + + (None) + (Hiçbiri) + + + Proxy: + Vekil: + + + Username: + Kullanıcı adı: + + + Bittorrent + Bittorrent + + + Connections limit + Bağlantıların sınırı + + + Global maximum number of connections: + Genel azami bağlantı sayısı: + + + Maximum number of connections per torrent: + Torrent başına azami bağlantı sayısı: + + + Maximum number of upload slots per torrent: + Torrent başına azami gönderme yuvası sayısı: + + + Additional Bittorrent features + İlave Bittorrent özellikleri + + + Enable DHT network (decentralized) + DHT ağını etkinleştir (dağıtılmış) + + + Enable Peer eXchange (PeX) + Eş Değişimini Etkinleştir (EşD) + + + Enable Local Peer Discovery + Yerel Eş Keşfini Etkinleştir + + + Encryption: + Şifreleme: + + + Share ratio settings + Oran ayarlarını paylaş + + + Desired ratio: + İstenen oran: + + + Filter file path: + Dosya yolunu süzgeçle: + + + transfer lists refresh interval: + aktarım listeleri yenileme süresi: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + RSS beslemeleri yenileme süresi: + + + minutes + dakika + + + Maximum number of articles per feed: + Besleme başına azami makale sayısı: + + + File system + Dosya sistemi + + + Remove finished torrents when their ratio reaches: + Tamamlanan torrentleri oranları erişince kaldır: + + + System default + Sistem varsayılanı + + + Start minimized + Küçültülmüş başlat + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + Aktarım listelerine çift tıklandığında yapılacak işlem + + + In download list: + İndirilen listesinde: + + + Pause/Start torrent + Torrenti duraklat/başlat + + + Open destination folder + Hedef klasörü aç + + + Display torrent properties + Torrent özelliklerini göster + + + In seeding list: + Gönderilen listesinde: + + + Folder scan interval: + Klasör tarama süresi: + + + seconds + saniye + + + Spoof Azureus to avoid ban (requires restart) + Yasaklamadan sakınmak için Azureus'u kandır (yeniden başlatma gerektirir) + + + Web UI + Web KA + + + Enable Web User Interface + Web Kullanıcı Arayüzünü Etkinleştir + + + HTTP Server + HTTP Sunucu + + + Enable RSS support + RSS desteğini etkinleştir + + + RSS settings + RSS ayarları + + + Enable queueing system + Sıralama sistemini etkinleştir + + + Maximum active downloads: + Azami etkin indirilen: + + + Torrent queueing + Torrent kuyruğu + + + Maximum active torrents: + Azami etkin torrent: + + + Display top toolbar + Üst araç çubuğunu göster + + + Search engine proxy settings + Arama motoru vekil ayarları + + + Bittorrent proxy settings + Bittorrent vekil ayarları + + + Maximum active uploads: + Azami etkin gönderimler: + + + Spoof µtorrent to avoid ban (requires restart) + Yasaktan korunmak için µtorrent'i kandır (yeniden başlatmak gerekli) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + Çift tıklama eylemi + + + Start/Stop + Başlat/Durdur + + + Open folder + Klasör aç + + + Show properties + Özellikleri göster + + + Port used for incoming connections: + Gelen bağlantılar için kullanılacak port: + + + Random + Rastgele + + + UI + Arabirim + + + + DownloadingTorrents + + Name + i.e: file name + Ad + + + Size + i.e: file size + Boyut + + + Progress + i.e: % downloaded + İlerleme + + + DL Speed + i.e: Download speed + İND Hızı + + + UP Speed + i.e: Upload speed + GÖN Hızı + + + Seeds/Leechs + i.e: full/partial sources + Gönderen/Çeken + + + Ratio + Oran + + + ETA + i.e: Estimated Time of Arrival / Time left + Kalan Zaman + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 başladı. + + + Be careful, sharing copyrighted material without permission is against the law. + Dikkat edin, telif hakkı olan materyalleri izinsiz paylaşmak yasalara aykırıdır. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>engellendi</i> + + + Fast resume data was rejected for torrent %1, checking again... + Fast resume verisi %1 torrent i için reddedildi, tekrar kontrol ediliyor... + + + Url seed lookup failed for url: %1, message: %2 + Url seed araması bu url için başarılamadı: %1, mesaj: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' download listesine eklendi. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' devam ettirildi. (fast resume) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' zaten download listesinde var. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent dosyası çözümlenemiyor: '%1' + + + This file is either corrupted or this isn't a torrent. + Bu dosya bozuk ya da torrent dosyası değil. + + + Couldn't listen on any of the given ports. + Verilen portların hiçbiri dinlenemedi. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Download ediliyor '%1', lütfen bekleyin... + + + Hide or Show Column + Sütunu Gizle ya da Göster + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Port mapping hatası, mesaj: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Port mapping başarıyla tamamlandı, mesaj: %1 + + + Priority + Öncelik + + + Seeds/Leechers + i.e: full/partial sources + Gönderen/Çeken + + + + FeedDownloader + + RSS Feed downloader + RSS Besleme indirici + + + RSS feed: + RSS beslemesi: + + + Feed name + Besleme adı + + + Automatically download torrents from this feed + Bu beslemeden torentleri kendiliğinden indir + + + Download filters + İndirme süzgeçleri + + + Filters: + Süzgeçler: + + + Filter settings + Süzgeç ayarları + + + Matches: + Eşleşmeler: + + + Does not match: + Eşleşmeyen: + + + Destination folder: + Hedef klasör: + + + ... + ... + + + Filter testing + Süzgeç sınama + + + Torrent title: + Torent başlığı: + + + Result: + Sonuç: + + + Test + Sına + + + Import... + İçe aktar... + + + Export... + Dışa aktar... + + + Rename filter + Süzgeci yeniden adlandır + + + Remove filter + Süzgeci kaldır + + + Add filter + Süzgeç ekle + + + + FeedDownloaderDlg + + New filter + Yeni süzgeç + + + Please choose a name for this filter + Lütfen bu süzgeç için yeni bir ad seçin + + + Filter name: + Süzgeç adı: + + + Invalid filter name + Geçersiz süzgeç adı + + + The filter name cannot be left empty. + Süzgeç adı boş bırakılamaz. + + + This filter name is already in use. + Bu süzgeç adı kullanımda. + + + Filter testing error + Süzgeç sınama hatası + + + Please specify a test torrent name. + Lütfen bir sınama torenti adı belirtin. + + + matches + eşleşmeler + + + does not match + eşleşme yok + + + Select file to import + İçe aktarmak için dosya seçin + + + Filters Files + Süzgeç Dosyaları + + + Import successful + İçe aktarma başarılı + + + Filters import was successful. + Süzgeçler başarıyla içe aktarıldı. + + + Import failure + İçe aktarma başarısız + + + Filters could not be imported due to an I/O error. + Süzgeçler bir Girdi/Çıktı hatası sebebiyle içe aktarılamadı. + + + Select destination file + Hedef dosyayı seçin + + + Overwriting confirmation + Açıklama üzerine yazılıyor + + + Are you sure you want to overwrite existing file? + Dosyanın üzerine yazmak istediğinize emin misiniz? + + + Export successful + Dışa aktarım başarılı + + + Filters export was successful. + Süzgeçler dışa başarıyla aktarıldı. + + + Export failure + Dışa aktarım başarısız + + + Filters could not be exported due to an I/O error. + Süzgeçler bir Girdi/Çıktı hatası sebebiyle dışa aktarılamadı. + + + + FeedList + + Unread + Okunmadı + + + + FilterParserThread + + I/O Error + Input/Output Error + I/O Hatası + + + Couldn't open %1 in read mode. + %1 okuma kipinde açılamadı. + + + %1 is not a valid PeerGuardian P2B file. + %1 geçerli bir PeerGuardian P2B dosyası değil. + + + + FinishedListDelegate + + KiB/s + KB/s + + + + FinishedTorrents + + Name + i.e: file name + Ad + + + Size + i.e: file size + Boyut + + + Seeds / Leechers + Gönderen / Çeken + + + Connected peers + Bağlı eşler + + + Progress + i.e: % downloaded + İlerleme + + + DL Speed + i.e: Download speed + DL Hızı + + + UP Speed + i.e: Upload speed + GÖN Hızı + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + Status + Durum + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Tamamlandı + + + Finished + Tamamlandı + + + None + i.e: No error message + Yok + + + Ratio + Oran + + + Leechers + i.e: full/partial sources + Çekenler + + + Total uploaded + i.e: Total amount of uploaded data + Gönderilen toplam veri + Toplam gönderilen + + + Hide or Show Column + Sütunu Gizle veya Göster + + + Incomplete torrent in seeding list + Gönderilen listesinde tamamlanmamış torrent + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + Görünüşe göre '%1' torrentinin durumu 'gönderilen'den 'indirilen'e değişmiş. Yeniden indirme listesine taşınmasını ister misiniz? (yoksa torrent silinecek) + + + Priority + Öncelik + + + + GUI + + Open Torrent Files + Torrent Dosyasını Aç + + + kb/s + kb/s + + + Unknown + Bilinmeyen + + + This file is either corrupted or this isn't a torrent. + Bu dosya bozuk ya da torrent dosyası değil. + + + Are you sure you want to delete all files in download list? + Download listesindeki bütün dosyaları silmek istediğinizden emin misiniz? + + + &Yes + &Evet + + + &No + &Hayır + + + Are you sure you want to delete the selected item(s) in download list? + İndirme listesindeki seçili öğeleri silmek istediğinize emin misiniz? + + + paused + duraklatıldı + + + started + başlatıldı + + + kb/s + kb/s + + + Finished + Tamamlandı + + + Checking... + Kontrol ediliyor... + + + Connecting... + Bağlanılıyor... + + + Downloading... + Download ediliyor... + + + Download list cleared. + Download listesi temizlendi. + + + All Downloads Paused. + Bütün Downloadlar Duraklatıldı. + + + All Downloads Resumed. + Bütün Downloadlar Devam Ettirildi. + + + DL Speed: + DL Hızı: + + + started. + başlatıldı. + + + UP Speed: + UP Hızı: + + + Couldn't create the directory: + Klasör yaratılamıyor: + + + Torrent Files + Torrent Dosyaları + + + already in download list. + <file> already in download list. + zaten download listesinde bulunuyor. + + + added to download list. + download listesine eklendi. + + + resumed. (fast resume) + devam ettirildi. (fast resume) + + + Unable to decode torrent file: + Torrent dosyası çözülemiyor: + + + removed. + <file> removed. + silindi. + + + paused. + <file> paused. + duraklatıldı. + + + resumed. + <file> resumed. + devam ettirildi. + + + m + minutes + d + + + h + hours + sa + + + d + days + g + + + Listening on port: + Port dinleniyor: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Emin misiniz? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Hızı: + + + :: By Christophe Dumez :: Copyright (c) 2006 + .: Cristophe Dumez tarafından hazırlanmıştır :: Telif Hakkı (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Bağlantı Durumu:</b><br> Bağlı + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Bağlantı Durumu:</b><br>Güvenlik Duvarınız mı açık?<br><i>Gelen bağlantı yok...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Bağlantı Durumu:</b><br>Bağlı Değil<br><i>Kullanıcı bulunamadı...</i> + + + /s + <unit>/seconds + /s + + + has finished downloading. + download tamamlandı. + + + Couldn't listen on any of the given ports. + Verilen portların hiçbiri dinlenemedi. + + + None + Yok + + + Empty search pattern + Boş arama sorgusu + + + Please type a search pattern first + Lütfen önce bir arama sorgusu girin + + + No seach engine selected + Arama motoru seçilmedi + + + You must select at least one search engine. + En az bir arama motoru seçmelisiniz. + + + Searching... + Aranıyor... + + + Could not create search plugin. + Arama eklentisi oluşturulamıyor. + + + Stopped + Durdu + + + I/O Error + I/O Hatası + + + Couldn't create temporary file on hard drive. + Sabit diskte geçici klasör oluşturulamıyor. + + + Torrent file URL + Torrent dosya URLsi + + + KB/s + KB/s + + + KB/s + KB/s + + + Downloading using HTTP: + HTTP kullanılarak download ediliyor: + + + Torrent file URL: + Torrent dosyası URLsi: + + + A http download failed... + Bir http download u başarısız... + + + A http download failed, reason: + Bir http download u başarısız, neden: + + + Are you sure you want to quit? -- qBittorrent + Çıkmak istediğinize emin misiniz? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + qBittorrentten çıkmak istediğinize emin misiniz? + + + Timed out + Zaman aşıldı + + + Error during search... + Arama yapılırken hata... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Hız kaybetti + + + Search is finished + Arama tamamlandı + + + An error occured during search... + Arama yapılırken bir hata oluştu... + + + Search aborted + Arama iptal edildi + + + Search returned no results + Arama sonuç bulamadı + + + Search is Finished + Arama Tamamlandı + + + Search plugin update -- qBittorrent + Arama plugini güncellemesi -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Arama plugini güncellenebilir, güncellemek ister misiniz? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Üzgünüz, güncelleme sunucusu geçici olarak servis dışı. + + + Your search plugin is already up to date. + Arama plugini zaten güncel durumda. + + + Results + Sonuçlar + + + Name + İsim + + + Size + Boyut + + + Progress + İlerleme + + + DL Speed + DL Hızı + + + UP Speed + UP Hızı + + + Status + Durum + + + ETA + ETA + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Arama motoru + + + Stalled + state of a torrent whose DL Speed is 0 + Hız kaybetti + + + Paused + Duraklatıldı + + + Preview process already running + Önizleme işlemi zaten çalışıyor + + + There is already another preview process running. +Please close the other one first. + Zaten başka bir önizleme işlemi çalışıyor. +Lütfen önce diğerini kapatın. + + + Couldn't download + Couldn't download <file> + Download edilemedi + + + reason: + Reason why the download failed + neden: + + + Downloading + Example: Downloading www.example.com/test.torrent + Download ediliyor + + + Please wait... + Lütfen bekleyin... + + + Transfers + Aktarımlar + + + Are you sure you want to quit qBittorrent? + qBittorrent ten çıkmak istediğinize emin misiniz? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Seçilenleri download listesinden ve sabit diskinizden silmek istediğinize emin misiniz? + + + Download finished + İndirme tamamlandı + + + has finished downloading. + <filename> has finished downloading. + download tamamlandı. + + + Search Engine + Arama Motoru + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Bağlantı durumu: + + + Offline + Çevrimdışı + + + No peers found... + Kullanıcı bulunamadı... + + + Name + i.e: file name + İsim + + + Size + i.e: file size + Boyut + + + Progress + i.e: % downloaded + İlerleme + + + DL Speed + i.e: Download speed + DL Hızı + + + UP Speed + i.e: Upload speed + UP Hızı + + + Seeds/Leechs + i.e: full/partial sources + Seeds/Leechs + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 başladı. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + İND hızı: %1 KB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + GÖN hızı: %1 KB/s + + + Finished + i.e: Torrent has finished downloading + Tamamlandı + + + Checking... + i.e: Checking already downloaded parts... + Kontrol ediliyor... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Hız kaybetti + + + Are you sure you want to quit? + Çıkmak istediğinize emin misiniz? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' silindi. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' download listesine eklendi. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' devam ettirildi. (fast resume) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' zaten download listesinde var. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent dosyası çözümlenemiyor: '%1' + + + None + i.e: No error message + Yok + + + Listening on port: %1 + e.g: Listening on port: 1666 + Port dinleniyor: %1 + + + All downloads were paused. + Bütün downloadlar duraklatıldı. + + + '%1' paused. + xxx.avi paused. + '%1' duraklatıldı. + + + Connecting... + i.e: Connecting to the tracker... + Bağlanılıyor... + + + All downloads were resumed. + Bütün downloadlar devam ettirildi. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' devam ettirildi. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 indirildi. + + + I/O Error + i.e: Input/Output Error + I/O Hatası + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + %1 okunmaya veya yazılmaya çalışılırken bir hata oluştu. Disk muhtemelen dolu, indirme duraklatıldı + + + Connection Status: + Bağlantı Durumu: + + + Online + Çevrimiçi + + + Firewalled? + i.e: Behind a firewall/router? + Firewall açık mı? + + + No incoming connections... + Gelen bağlantı yok... + + + No search engine selected + Arama motoru seçildi + + + Search plugin update + Eklenti güncellemesi ara + + + Search has finished + Arama bitti + + + Results + i.e: Search results + Sonuçlar + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Download ediliyor '%1', lütfen bekleyin... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Bir hata oluştu (disk dolu mu?), '%1' duraklatıldı. + + + Search + Arama + + + RSS + RSS + + + Downloads + İndirilenler + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + G/Ç: Girdi/Çıktı + %1 torrenti için bir G/Ç hatası meydana geldi. + Sebep: %2 + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + İndirme listesi boş değil. +qBittorrent'ten çıkmak istediğinize emin misiniz? + + + Are you sure you want to delete the selected item(s) in finished list? + Seçilenleri tamamlanan listesinden silmek istediğinize emin misiniz? + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent'in bağlandığı kapı: %1 + + + DHT support [ON], port: %1 + DHT desteği [AÇIK], kapı: %1 + + + DHT support [OFF] + DHT desteği [KAPALI] + + + PeX support [ON] + EşD desteği [AÇIK] + + + PeX support [OFF] + EşD desteği [KAPALI] + + + UPnP support [ON] + UPnP desteği [AÇIK] + + + Encryption support [ON] + Şifreleme desteği [AÇIK] + + + Encryption support [FORCED] + Şifreleme desteği [ZORLANDI] + + + Encryption support [OFF] + Şifreleme desteği [KAPALI] + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Adres indirme hatası + + + Couldn't download file at url: %1, reason: %2. + Adresteki dosya indirilemedi: %1, neden: %2. + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Seçilenleri indirme listesinden ve sabit diskinizden silmek istediğinize emin misiniz? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Seçilenleri tamamlanan listesinden ve sabit diskinizden silmek istediğinize emin misiniz? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' kalıcı olarak kaldırıldı. + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent'in bağlı olduğu port: TCP/%1 + + + UPnP support [OFF] + UPnP desteği [KAPALI] + + + NAT-PMP support [ON] + NAT-PMP desteği [AÇIK] + + + NAT-PMP support [OFF] + NAT-PMP desteği [KAPALI] + + + DHT support [ON], port: UDP/%1 + DHT desteği [Açık], port: UDP/%1 + + + Local Peer Discovery [ON] + Yerel Eş Keşfi [AÇIK] + + + Local Peer Discovery support [OFF] + Yerel Eş Keşfi desteği [KAPALI] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' kaldırıldı çünkü oranı ayarladığınız maksimum değere ulaştı. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (İND: %2KB/s, GÖN: %3KB/s) + + + DL: %1 KiB/s + İND: %1 KB/s + + + UP: %1 KiB/s + GÖN: %1 KB/s + + + Ratio: %1 + Oran: %1 + + + DHT: %1 nodes + DHT: %1 düğüm + + + No direct connections. This may indicate network configuration problems. + Doğrudan bağlantı yok. Bu, ağ yapılandırma problemi olduğunu gösteriyor. + + + Uploads + Gönderilenler + + + Options were saved successfully. + Seçenekler başarıyla kaydedildi. + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: By Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Toplam DL Hızı: + + + Kb/s + Kb/s + + + Total UP Speed: + Toplam UP Hızı: + + + Name + İsim + + + Size + Boyut + + + % DL + % DL + + + DL Speed + DL Hızı + + + UP Speed + UP Hızı + + + Status + Durum + + + ETA + ETA + + + &Options + &Ayarlar + + + &Edit + D&üzen + + + &File + &Dosya + + + &Help + &Yardım + + + Open + + + + Exit + Çıkış + + + Preferences + Yeğlenenler + + + About + Hakkında + + + Start + Başlat + + + Pause + Duraklat + + + Delete + Sil + + + Pause All + Hepsini Duraklat + + + Start All + Hepsini Başlat + + + Documentation + Belgeleme + + + Connexion Status + Bağlantı Durumu + + + Delete All + Hepsini Sil + + + Torrent Properties + Torrent Özellikleri + + + Connection Status + Bağlantı Durumu + + + Downloads + Downloadlar + + + Search + Arama + + + Search Pattern: + Arama Sorgusu: + + + Status: + Durum: + + + Stopped + Durdu + + + Search Engines + Arama Motorları + + + Results: + Sonuçlar: + + + Stop + Dur + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Arama Motoru + + + Download from URL + Adresten indir + + + Download + Download + + + Clear + Temizle + + + KiB/s + KiB/s + + + Create torrent + Torrent oluştur + + + Ratio: + Oran: + + + Update search plugin + Arama pluginini güncelle + + + Session ratio: + Oturum oranı: + + + Transfers + Aktarımlar + + + Preview file + Dosya önizleme + + + Clear log + Günlüğü temizle + + + Delete Permanently + Tamamen Sil + + + Visit website + Siteyi ziyaret et + + + Report a bug + Hatayı rapor et + + + Set upload limit + Gönderme sınırını ayarla + + + Set download limit + İndirme sınırını ayarla + + + Set global download limit + Genel indirme sınırını ayarla + + + Set global upload limit + Genel gönderme sınırını ayarla + + + Options + Seçenekler + + + Decrease priority + Önceliği düşür + + + Increase priority + Önceliği arttır + + + Console + Uçbirim + + + + PropListDelegate + + False + Hayır + + + True + Evet + + + Ignored + Önemsiz + + + Normal + Normal (priority) + Normal + + + High + High (priority) + Yüksek + + + Maximum + Maximum (priority) + En yüksek + + + + QTextEdit + + Clear + Temizle + + + + RSS + + Search + Arama + + + Delete + Sil + + + Rename + Yeniden adlandır + + + Refresh + Yenile + + + Create + Oluştur + + + Delete selected streams + Seçili akımları sil + + + Refresh RSS streams + RSS akımlarını yenile + + + Add a new RSS stream + Yeni bir RSS akımı ekle + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Haberler:</b> <i>(bağlantıyı tarayıcınızda açmak için çift tıklayın)</i> + + + Add RSS stream + RSS akımı ekle + + + Refresh all streams + Bütün akımları yenile + + + RSS streams: + RSS akımları: + + + 2 + 2 + + + Mark all as read + Tümünü okunmuş olarak işaretle + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torentler:</span> <span style=" font-style:italic;">(indirmek için çift tıklayın)</span></p></body></html> + + + Download torrent + Torenti indir + + + Open news URL + Haber adresini aç + + + Copy feed URL + Besleme adresini kopyala + + + RSS feed downloader + RSS besleme indirici + + + New subscription + Yeni abonelik + + + Mark items read + Öğeleri okundu olarak işaretle + + + Update all + Tümünü güncelle + + + Update all feeds + Tüm beslemeleri güncelle + + + RSS feeds + RSS beslemeleri + + + Update + Güncelle + + + New folder + Yeni klasör + + + 1 + 1 + + + Feed URL + Besleme adresi + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Lütfen bir rss akımı adresi yazın + + + Stream URL: + Akım adresi: + + + Please choose a new name for this stream + Lütfen bu akım için yeni bir ad seçin + + + New stream name: + Yeni akım adı: + + + Are you sure? -- qBittorrent + Emin misiniz? -- qBittorrent + + + &Yes + &Evet + + + &No + &Hayır + + + Are you sure you want to delete this stream from the list? + Bu akımı listeden silmek istediğinize emin misiniz? + + + Description: + Betimleme: + + + url: + adres: + + + Last refresh: + Son yenileme: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Bu rss beslemesi zaten listede var. + + + Date: + Tarih: + + + Author: + Yazar: + + + Please choose a folder name + Lütfen bir klasör adı seçin + + + Folder name: + Klasör adı: + + + New folder + Yeni klasör + + + Are you sure you want to delete these elements from the list? + Bu öğeleri listeden silmek istediğinize emin misiniz? + + + Are you sure you want to delete this element from the list? + Bu öğeyi listeden silmek istediğinize emin misiniz? + + + Please choose a new name for this RSS feed + Lütfen bu RSS beslemesi için yeni bir ad seçin + + + New feed name: + Yeni besleme adı: + + + Name already in use + Bu ad kullanımda + + + This name is already used by another item, please choose another one. + Bu ad başka bir öğe tarafından kullanılıyor, lütfen başka bir tane seçin. + + + Overwrite attempt + Üzerine yazma girişimi + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + %1 öğesi üzerine yazamazsınız. + + + Unread + Okunmadı + + + + RssItem + + No description available + Kullanılır betimleme yok + + + + RssStream + + %1 ago + 10min ago + %1 önce + + + Never + Asla + + + Automatically downloading %1 torrent from %2 RSS feed... + %2 beslemesinden %1 torent kendiliğinden indiriliyor... + + + + SearchCategories + + All categories + Tüm kategoriler + + + Movies + Filmler + + + TV shows + Televizyon programları + + + Music + Müzik + + + Games + Oyunlar + + + Anime + Canlandırma + + + Software + Yazılım + + + Pictures + Fotoğraflar + + + Books + Kitaplar + + + + SearchEngine + + Name + i.e: file name + İsim + + + Size + i.e: file size + Boyut + + + Seeders + i.e: Number of full sources + Seeders + + + Leechers + i.e: Number of partial sources + Leechers + + + Search engine + Arama motoru + + + Empty search pattern + Boş arama örüntüsü + + + Please type a search pattern first + Lütfen önce bir arama örüntüsü girin + + + No search engine selected + Arama motoru seçildi + + + You must select at least one search engine. + En az bir arama motoru seçmelisiniz. + + + Results + Sonuçlar + + + Searching... + Aranıyor... + + + Search plugin update -- qBittorrent + Arama plugini güncellemesi -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Arama plugini güncellenebilir, güncellemek ister misiniz? + +Changelog: + + + + &Yes + &Evet + + + &No + &Hayır + + + Search plugin update + Eklenti güncellemesi ara + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Üzgünüz, güncelleme sunucusu geçici olarak servis dışı. + + + Your search plugin is already up to date. + Arama plugini zaten güncel durumda. + + + Cut + Kes + + + Copy + Kopyala + + + Paste + Yapıştır + + + Clear field + Temizle + + + Clear completion history + Tamamlanma geçmişini temizle + + + Search Engine + Arama Motoru + + + Search has finished + Arama bitti + + + An error occured during search... + Arama yapılırken bir hata oluştu... + + + Search aborted + Arama iptal edildi + + + Search returned no results + Arama sonuç bulamadı + + + Results + i.e: Search results + Sonuçlar + + + Unknown + Bilinmeyen + + + + SearchTab + + Name + i.e: file name + Ad + + + Size + i.e: file size + Boyut + + + Seeders + i.e: Number of full sources + Gönderen + + + Leechers + i.e: Number of partial sources + Çeken + + + Search engine + Arama motoru + + + + TrackersAdditionDlg + + Trackers addition dialog + İzleyici ekleme kutusu + + + List of trackers to add (one per line): + Eklemek için izleyici listesi (satır başına bir tane): + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + qBittorrent için gönüllü olarak çevirmenlik yapanlara teşekkürlerimi sunarım: + + + Please contact me if you would like to translate qBittorrent to your own language. + Eğer qBittorrent i kendi dilinize çevirmek istiyorsanız lütfen benimle iletişim kurun. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + qBittorrent projesini barındırdıkları için sourceforge.net e teşekkürlerimi sunarım. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + qBittorrent için gönüllü olarak çevirmenlik yapanlara teşekkürlerimi sunarım: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>qBittorrent projesini barındırdıkları için sourceforge.net e teşekkürlerimi sunarım.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>RPM paketleyicimiz olan Jeffery Fernandez (developer@jefferyfernandez.id.au) e de ayrıca üstün çalışmalarından dolayı teşekkürlerimi sunarım.</li></ul> + + + Preview impossible + Önizleme yapılamıyor + + + Sorry, we can't preview this file + Üzgünüz, bu dosyaya önizleme yapılamıyor + + + Name + İsim + + + Size + Boyut + + + Progress + İlerleme + + + No URL entered + URL girilmedi + + + Please type at least one URL. + Lütfen en az bir URL girin. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Eğer qBittorrent i kendi dilinize çevirmek isterseniz benimle iletişim kurun. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + qBittorrent için gönüllü olarak çevirmenlik yapanlara teşekkürlerimi sunarım: + + + Please contact me if you would like to translate qBittorrent into your own language. + Eğer qBittorrent'i kendi dilinize çevirmek isterseniz benimle iletişim kurun. + + + + addTorrentDialog + + Torrent addition dialog + Torrent ekleme kutusu + + + Save path: + Kaydetme yolu: + + + ... + ... + + + Torrent content: + Torrent içeriği: + + + File name + Dosya adı + + + File size + Dosya boyutu + + + Selected + Seçildi + + + Download in correct order (slower but good for previewing) + Doğru düzende indir (yavaş ama önizleme için iyi) + + + Add to download list in paused state + İndirme listesine duraklatılmış durumda ekle + + + Add + Ekle + + + Cancel + Vazgeç + + + select + Seç + + + Unselect + Seçimi Kaldır + + + Select + Seç + + + Ignored + Önemsiz + + + Normal + Normal + + + High + Yüksek + + + Maximum + En Yüksek + + + Collapse all + Tümünü daralt + + + Expand all + Tümünü genişlet + + + Torrent size: + Torent boyutu: + + + Unknown + Bilinmeyen + + + Free disk space: + Boş disk alanı: + + + Download in sequential order (slower but good for previewing) + Doğru düzende indir (yavaş ama önizleme için iyi) + + + + authentication + + Tracker authentication + İzleyici kimlik denetimi + + + Tracker: + İzleyici: + + + Login + Oturum aç + + + Username: + Kullanıcı adı: + + + Password: + Parola: + + + Log in + Giriş + + + Cancel + Vazgeç + + + + bandwidth_dlg + + Bandwidth allocation + Bant genişliği tahsisi + + + KiB/s + KB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1, ayarladığınız azami orana ulaştı. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' tamamen kaldırıldı. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' kaldırıldı. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' duraklatıldı. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' devam ettirildi. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' zaten indirme listesinde var. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' devam ettirildi. (hızlı devam ettir) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' indirme listesine eklendi. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Torrent dosyası çözümlenemiyor: '%1' + + + This file is either corrupted or this isn't a torrent. + Bu dosya bozuk ya da torrent dosyası değil. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font>, <i>IP süzgeciniz tarafından engellendi</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font>, <i>bozuk parçalar sebebiyle engellendi</i> + + + Couldn't listen on any of the given ports. + Verilen kapıların hiçbiri tanınmadı. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: Kapı haritalama hatası, ileti: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: Kapı haritalama başarıyla tamamlandı, ileti: %1 + + + Fast resume data was rejected for torrent %1, checking again... + Hızlı devam ettirme verisi %1 torrenti için reddedildi, yeniden denetleniyor... + + + Url seed lookup failed for url: %1, message: %2 + Gönderen adresi araması bu adres için başarılamadı: %1, ileti: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1' indiriliyor, lütfen bekleyin... + + + '%1' is not a valid magnet URI. + '%1' geçerli bir adres değil. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + %1 dosyasının özyineli indirmesi %2 torenti içine gömülü + + + Unable to decode %1 torrent file. + %1 torent dosyası çözümlenemiyor. + + + + createTorrentDialog + + Create Torrent file + Torrent dosyası oluştur + + + Destination torrent file: + Kaynak torrent dosyası: + + + Input file or directory: + Girdi dosyası veya klasör: + + + Comment: + Yorum: + + + ... + ... + + + Create + Oluştur + + + Cancel + Vazgeç + + + Announce url (Tracker): + İlan URLsi (Tracker): + + + Directory + Klasör + + + Torrent Creation Tool + Torrent Oluşturma Aracı + + + <center>Destination torrent file:</center> + <center>Kaynak Torrent dosyası:</center> + + + <center>Input file or directory:</center> + <center>Girdi dosyası ya da klasörü:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Announce url:<br>(Satır başına bir tane)</center> + + + <center>Comment:</center> + <center>Yorum:</center> + + + Torrent file creation + Torrent dosyası oluşumu + + + Announce urls (trackers): + Duyuru adresleri (izleyiciler): + + + Comment (optional): + Yorum (seçime bağlı): + + + Web seeds urls (optional): + Ağda gönderenlerin adresleri (seçime bağlı): + + + File or folder to add to the torrent: + Torrente eklemek için bir dosya veya klasör: + + + Add a file + Dosya ekle + + + Add a folder + Klasör ekle + + + Piece size: + Parça boyutu: + + + 32 KiB + 32 KB + + + 64 KiB + 64 KB + + + 128 KiB + 128 KB + + + 256 KiB + 256 KB + + + 512 KiB + 512 KB + + + 1 MiB + 1 MB + + + 2 MiB + 2 MB + + + 4 MiB + 4 MB + + + Private (won't be distributed on DHT network if enabled) + Özel (etkinleştirildiğinde DHT ağında dağıtılmaz) + + + Start seeding after creation + Oluşturmadan sonra göndermeye başla + + + Create and save... + Oluştur ve kaydet... + + + Progress: + İlerleme: + + + Add file + Dosya ekle + + + Add folder + Klasör ekle + + + + createtorrent + + Select destination torrent file + Hedef Torrent dosyasını seç + + + Torrent Files + Torrent Dosyaları + + + Select input directory or file + Girdi klasörü veya dosyası seç + + + No destination path set + Kaynak yolu seçilmemiş + + + Please type a destination path first + Lütfen önce bir kaynak yolu seçin + + + No input path set + Ayarlanmış girdi yolu yok + + + Please type an input path first + Lütfen önce bir girdi yolu yazın + + + Input path does not exist + Kayıt yolu bulunamadı + + + Please type a correct input path first + Lütfen önce düzgün bir girdi yolu seçin + + + Torrent creation + Torrent oluşturma + + + Torrent was created successfully: + Torrent başarıyla oluşturuldu: + + + Please type a valid input path first + Lütfen önce geçerli bir kayıt yolu seçin + + + Select a folder to add to the torrent + Torrente eklemek için bir klasör seçin + + + Please type an announce URL + Lütfen bir duyuru adresi yazın + + + Torrent creation was unsuccessful, reason: %1 + Torrent oluşturma başarısızlıkla sonuçlandı, neden: %1 + + + Announce URL: + Tracker URL + Duyuru adresi: + + + Please type a web seed url + Lütfen bir ağ göndereni adresi yazın + + + Web seed URL: + Ağ göndereni adresi: + + + Select a file to add to the torrent + Torrente eklemek için bir dosya seçin + + + No tracker path set + Ayarlanmış izleyici yolu yok + + + Please set at least one tracker + Lütfen en azından bir izleyici ayarlayın + + + Created torrent file is invalid. It won't be added to download list. + Oluşturulmuş torrent dosyası geçersiz. İndirme listesine eklenmeyecek. + + + + downloadFromURL + + Download Torrents from URLs + Adreslerden Torrentleri İndir + + + Only one URL per line + Her satırda bir Adres + + + Download + İndir + + + Cancel + Vazgeç + + + Download from urls + Adreslerden İndir + + + No URL entered + Girilmiş adres yok + + + Please type at least one URL. + Lütfen en az bir adres girin. + + + + downloading + + Search + Ara + + + Total DL Speed: + Toplam DL Hızı: + + + KiB/s + KiB/s + + + Session ratio: + Oturum oranı: + + + Total UP Speed: + Toplam UP Hızı: + + + Log + Log + + + IP filter + IP filtresi + + + Start + Başlat + + + Pause + Duraklat + + + Delete + Sil + + + Clear + Temizle + + + Preview file + Dosya önizleme + + + Set upload limit + Gönderme sınırını ayarla + + + Set download limit + İndirme sınırını ayarla + + + Delete Permanently + Kalıcı Olarak Sil + + + Torrent Properties + Torrent Özellikleri + + + Open destination folder + Hedef klasörü aç + + + Name + Ad + + + Size + Boyut + + + Progress + İlerleme + + + DLSpeed + İND Hızı + + + UpSpeed + GÖN Hızı + + + Seeds/Leechs + Gönderen/Çeken + + + Ratio + Oran + + + ETA + Kalan Zaman + + + Buy it + Satın al + + + Priority + Öncelik + + + Increase priority + Önceliği arttır + + + Decrease priority + Önceliği düşür + + + Force recheck + Yeniden denetlemeye çalış + + + Copy magnet link + Çeken bağlantıyı kopyala + + + + engineSelect + + Search plugins + Arama eklentileri + + + Installed search engines: + Yüklenmiş arama motorları: + + + Name + Ad + + + Url + Adres + + + Enabled + Etkinleştirildi + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Buradan yeni arama motoru eklentileri bulabilirsiniz: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Yeni bir tane yükle + + + Check for updates + Güncellemeler için denetle + + + Close + Kapat + + + Enable + Etkinleştir + + + Disable + Etkisizleştir + + + Uninstall + Yüklemeyi kaldır + + + + engineSelectDlg + + True + Evet + + + False + Hayır + + + Uninstall warning + Yüklemeyi kaldırma uyarısı + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Bazı eklentiler kaldırılamadı çünkü bunlar qBittorrent'te kullanılıyor. + Sadece kendi ekledikleriniz kaldırılabilir. +Bununla birlikte, o eklentiler devre dışı. + + + Uninstall success + Yükleme kaldırılması başarılı + + + Select search plugins + Arama eklentilerini seç + + + qBittorrent search plugins + qBittorrent arama eklentileri + + + Search plugin install + Arama eklentisi yüklemesi + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + %1 arama motoru eklentisinin daha güncel sürümü zaten yüklü durumda. + + + Search plugin update + Eklenti güncellemesi ara + + + Sorry, update server is temporarily unavailable. + Üzgünüz, güncelleme sunucusu geçici olarak servis dışı. + + + All your plugins are already up to date. + Bütün eklentileriniz zaten güncel durumda. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 arama motoru eklentisi güncellenemedi, eski sürüm tutulacak. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 arama motoru eklentisi yüklenemedi. + + + All selected plugins were uninstalled successfully + Bütün seçili eklentiler başarıyla kaldırıldı + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 arama motoru eklentisi başarıyla güncellendi. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1 arama motoru eklentisi başarıyla yüklendi. + + + Search engine plugin archive could not be read. + Arama motoru eklenti arşivi okunamadı. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Üzgünüz, %1 arama eklenti yüklemesi başarısız oldu. + + + New search engine plugin URL + Yeni arama motoru eklentisi adresi + + + URL: + Adres: + + + Yes + Evet + + + No + Hayır + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KB + + + MiB + mebibytes (1024 kibibytes) + MB + + + GiB + gibibytes (1024 mibibytes) + GB + + + TiB + tebibytes (1024 gibibytes) + TB + + + m + minutes + d + + + h + hours + sa + + + d + days + g + + + Unknown + Bilinmeyen + + + h + hours + sa + + + d + days + g + + + Unknown + Unknown (size) + Bilinmeyen + + + < 1m + < 1 minute + < 1d + + + %1m + e.g: 10minutes + %1d + + + %1h%2m + e.g: 3hours 5minutes + %1sa%2d + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1gü%2sa%3d + + + + options_imp + + Options saved successfully! + Ayarlar başarıyla kaydedildi! + + + Choose Scan Directory + Taranacak Klasörü Seçin + + + Choose save Directory + Kayıt klasörünü seçin + + + Choose ipfilter.dat file + IPfilter.dat dosyasını seçin + + + I/O Error + I/O Hatası + + + Couldn't open: + Açılamadı: + + + in read mode. + salt okunur durumda. + + + Invalid Line + Geçersiz Satır + + + Line + Satır + + + is malformed. + bozulmuş. + + + Range Start IP + IP Başlangıç Aralığı + + + Start IP: + Başlangıç IP: + + + Incorrect IP + Yanlış IP + + + This IP is incorrect. + Bu IP Adresi yanlıştır. + + + Range End IP + IP Bitiş Aralığı + + + End IP: + Bitiş IP: + + + IP Range Comment + IP Aralığı Yorumu + + + Comment: + Yorum: + + + to + <min port> to <max port> + dan + + + Choose your favourite preview program + Favori önizleme programınızı seçin + + + Invalid IP + Geçersiz IP + + + This IP is invalid. + Bu IP geçersizdir. + + + Options were saved successfully. + Ayarlar başarıyla kaydedildi. + + + Choose scan directory + Tarama dizinini seçin + + + Choose an ipfilter.dat file + Bir ipfilter.dat dosyası seç + + + Choose a save directory + Bir kayıt dizini seçin + + + I/O Error + Input/Output Error + I/O Hatası + + + Couldn't open %1 in read mode. + %1 okuma modunda açılamadı. + + + Choose an ip filter file + Bir ip süzgeç dosyası seçin + + + Filters + Süzgeçler + + + + pluginSourceDlg + + Plugin source + Eklenti kaynağı + + + Search plugin source: + Eklenti kaynağı ara: + + + Local file + Yerel dosya + + + Web link + Ağ bağlantısı + + + + preview + + Preview selection + Önizleme seçimi + + + File preview + Dosya önizlemesi + + + The following files support previewing, <br>please select one of them: + Aşağıdaki dosyalar önizlemeyi destekliyor, <br>lütfen birini seçin: + + + Preview + Önizleme + + + Cancel + Vazgeç + + + + previewSelect + + Preview impossible + Önizleme yapılamıyor + + + Sorry, we can't preview this file + Üzgünüz, bu dosyanın önizlemesi yapılamıyor + + + Name + Ad + + + Size + Boyut + + + Progress + İlerleme + + + + properties + + Torrent Properties + Torrent Özellikleri + + + Main Infos + Ana Bilgiler + + + File Name + Dosya Adı + + + Current Session + Şimdiki Oturum + + + Total Uploaded: + Toplam Upload: + + + Total Downloaded: + Toplam Download: + + + Download state: + Download durumu: + + + Current Tracker: + Şimdiki Tracker: + + + Number of Peers: + Kullanıcı Sayısı: + + + Torrent Content + Torrent İçeriği + + + OK + TAMAM + + + Total Failed: + Toplam Başarısız: + + + Finished + Tamamlandı + + + Queued for checking + Kontrol işlemi için sıralandırıldı + + + Checking files + Dosyalar kontrol ediliyor + + + Connecting to tracker + Tracker a bağlanılıyor + + + Downloading Metadata + Metadata Download Ediliyor + + + Downloading + Download ediliyor + + + Seeding + Oluşturuluyor + + + Allocating + Ayrılıyor + + + Unknown + Bilinmeyen + + + Complete: + Tamamlandı: + + + Partial: + Kısmi: + + + Files contained in current torrent: + Şimdiki torrentteki dosya içeriği: + + + Size + Boyut + + + Selected + Seçildi + + + Unselect + Seçimi kaldır + + + Select + Seç + + + You can select here precisely which files you want to download in current torrent. + Şimdiki torrentte özellikle hangi dosyaları download edeceğinizi buradan seçebilirsiniz. + + + False + Hayır + + + True + Evet + + + Tracker + Tracker + + + Trackers: + İzleyiciler: + + + None - Unreachable? + Yok - Erişilemez? + + + Errors: + Hata(lar): + + + Progress + İlerleme + + + Main infos + Genel bilgiler + + + Number of peers: + Kullanıcı sayısı: + + + Current tracker: + Şimdiki izleyici: + + + Total uploaded: + Toplam gönderilen: + + + Main info + Ana bilgi + + + Torrent information + Torrent bilgisi + + + Total downloaded: + Toplam indirilen: + + + Total failed: + Toplam başarısız: + + + Torrent content + Torrent içeriği + + + Options + Ayarlar + + + Download in correct order (slower but good for previewing) + Doğru düzende indir (yavaş ama önizleme için iyi) + + + Share Ratio: + Paylaşım Oranı: + + + Seeders: + Seeders: + + + Leechers: + Leechers: + + + Save path: + Kayıt yolu: + + + Torrent infos + Torrent bilgileri + + + Creator: + Oluşturan: + + + Torrent hash: + Torrent adresleme: + + + Comment: + Yorum: + + + Current session + Şimdiki oturum + + + Share ratio: + Paylaşım oranı: + + + Trackers + İzleyiciler + + + New tracker + Yeni tracker + + + New tracker url: + Yeni tracker url: + + + Priorities: + Öncelikler: + + + Normal: normal priority. Download order is dependent on availability + Normal: normal öncelik. İndirme düzeni bulunabilmeye bağlı + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Yüksek: normal öncelikden daha yüksek. Parçalar aynı bulunurlukta olan parçaların arasında tercih edilir, ama daha düşük bulunurlukta olan parçalar arasında değil + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + En yüksek: en yüksek öncelik, bulunurluk önemsenmez, bu parça kendinden düşük önemdeki her parça arasında tercih edilir + + + File name + Dosya adı + + + Priority + Öncelik + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + İzleyici listesi boş olamaz. + + + Ignored: file is not downloaded at all + Yoksayıldı: dosya hiç indirilmedi + + + Ignored + Yoksayıldı + + + Normal + Normal + + + Maximum + En yüksek + + + High + Yüksek + + + Url seeds + Gönderen adresleri + + + New url seed: + Yeni gönderen adresi: + + + This url seed is already in the list. + Bu gönderen adresi zaten listede. + + + None + i.e: No error message + Yok + + + New url seed + New HTTP source + Yeni gönderen adresi + + + The following url seeds are available for this torrent: + Bu gönderen adresleri bu torrent için kullanılabilir: + + + Priorities error + Öncelik hatası + + + Error, you can't filter all the files in a torrent. + Hata, torrentteki bütün dosyaları süzgeçleyemezsiniz. + + + Downloaded pieces + İndirilmiş parçalar + + + Collapse all + Tümünü daralt + + + Expand all + Tümünü genişlet + + + ... + ... + + + Choose save path + Kayıt yolunu seçin + + + Save path creation error + Kayıt yolu oluşturulmada hata + + + Could not create the save path + Kayıt yolu oluşturulamadı + + + + search_engine + + Search + Ara + + + Search Engines + Arama Motorları + + + Search Pattern: + Arama Örüntüsü: + + + Stop + Dur + + + Status: + Durum: + + + Stopped + Durdu + + + Results: + Sonuçlar: + + + Download + İndir + + + Clear + Temizle + + + Update search plugin + Arama pluginini güncelle + + + Search engines... + Arama motorları... + + + Close tab + Sekmeyi kapat + + + + seeding + + Search + Ara + + + The following torrents are finished and shared: + Aşağıdaki torrentler tamamlandı ve paylaşıldı: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Not:</u> Torrentlerinizi bittikten sonra da paylaşmak ağın iyi olması açısından önemlidir. + + + Start + Başlat + + + Pause + Duraklat + + + Delete + Sil + + + Delete Permanently + Kalıcı Olarak Sil + + + Torrent Properties + Torrent Özellikleri + + + Preview file + Dosya önizleme + + + Set upload limit + Gönderme sınırını ayarla + + + Open destination folder + Hedef klasörü aç + + + Name + Ad + + + Size + Boyut + + + Upload Speed + Gönderme Hızı + + + Connected peers + Bağlı eş + + + Seeds / Leechers + Gönderen / Çeken + + + Leechers + Çeken + + + Ratio + Oran + + + Buy it + Satın al + + + Total uploaded + Toplam gönderilen + + + Priority + Öncelik + + + Increase priority + Önceliği arttır + + + Decrease priority + Önceliği düşür + + + Force recheck + Yeniden denetlemeye çalış + + + Copy magnet link + Çeken bağlantıyı kopyala + + + + subDownloadThread + + Host is unreachable + Sunucuya erişilemiyor + + + File was not found (404) + Dosya bulunamadı (404) + + + Connection was denied + Bağlantı reddedildi + + + Url is invalid + Adres geçersiz + + + Connection forbidden (403) + Bağlantı yasak (403) + + + Connection was not authorized (401) + Bağlantıya izin verilmedi (401) + + + Content has moved (301) + İçerik taşındı (301) + + + Connection failure + Bağlantı hatası + + + Connection was timed out + Bağlantı zaman aşımına uğradı + + + Incorrect network interface + Geçersiz ağ arayüzü + + + Unknown error + Bilinmeyen hata + + + Could not resolve proxy + Vekil çözümlenemedi + + + I/O Error + Girdi/Çıktı Hatası + + + + torrentAdditionDialog + + True + Evet + + + Unable to decode torrent file: + Torrent dosyası çözülemiyor: + + + This file is either corrupted or this isn't a torrent. + Bu dosya bozuk ya da torrent dosyası değil. + + + Choose save path + Kayıt klasörünü seçin + + + False + Hayır + + + Empty save path + Boş kayıt yolu + + + Please enter a save path + Lütfen bir kayıt yolu girin + + + Save path creation error + Kayıt yolu oluşturulmada hata + + + Could not create the save path + Kayıt yolu oluşturulamıyor + + + Invalid file selection + Geçersiz dosya seçimi + + + You must select at least one file in the torrent + Torrent içinde en az bir dosya seçmek zorundasınız + + + File name + Dosya adı + + + Size + Boyut + + + Progress + İlerleme + + + Priority + Öncelik + + + Unknown + Bilinmeyen + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (torentin indirilmesinden sonra %1 kalacak) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (indirilmesi için %1 daha gerekli) + + + diff --git a/src/lang/qbittorrent_uk.qm b/src/lang/qbittorrent_uk.qm new file mode 100644 index 0000000000000000000000000000000000000000..983305b60fe3ace07e65ee5fb95231f7724ef9a3 GIT binary patch literal 45276 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 aYQm|7fKBV4?qzll0#Qe_9Vs;p#Qz7BOhpj@ literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_uk.ts b/src/lang/qbittorrent_uk.ts new file mode 100644 index 000000000..1bd2f00aa --- /dev/null +++ b/src/lang/qbittorrent_uk.ts @@ -0,0 +1,4770 @@ + + + + + @default + + b + bytes + б + + + KB + КБ + + + MB + МБ + + + GB + ГБ + + + KB + kilobytes + КБ + + + MB + megabytes + МБ + + + GB + gigabytes + ГБ + + + + AboutDlg + + About qBittorrent + Про qBittorrent + + + About + Про програму + + + Author + Автор + + + Name: + Ім'я: + + + Country: + Країна: + + + E-mail: + E-mail: + + + Home page: + Домашня сторінка: + + + Christophe Dumez + Крістоф Думез + + + France + Франція + + + Thanks To + Подяки + + + Translation + Переклад + + + License + Ліцензія + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Bittorrent-клієнт на базі Qt4 та libtorrent, написаний на C++.<br> +<br> +Захищено авторським правом © 2006 Крістоф Думез<br> +<br> <u>Домашня сторінка:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + День народження: + + + Occupation: + Рід занять: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + Студент комп'ютерних наук + + + Thanks to + Подяки + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + + BandwidthAllocationDialog + + Upload limit: + Ліміт віддачі: + + + Download limit: + Ліміт прийому: + + + Unlimited + Unlimited (bandwidth) + Необмежено + + + KiB/s + КіБ/с + + + + ConsoleDlg + + qBittorrent console + + + + General + Загальні + + + Blocked IPs + + + + + DLListDelegate + + KiB/s + КіБ/с + + + + Dialog + + Options -- qBittorrent + Опції -- qBittorrent + + + Options + Опції + + + Main + Головні + + + Save Path: + Шлях збереження: + + + Download Limit: + Ліміт прийому: + + + Upload Limit: + Ліміт віддачі: + + + Max Connects: + Макс. з'єднань: + + + Port range: + Діапазон портів: + + + ... + ... + + + Kb/s + Кб/с + + + Disable + Заборонити + + + connections + з'єднання + + + Proxy + Проксі + + + Proxy Settings + Налаштування проксі + + + Server IP: + IP сервера: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Порт: + + + Proxy server requires authentication + Проксі-сервер вимагає аутентифікації + + + Authentication + Аутентифікація + + + User Name: + Ім'я користувача: + + + Password: + Пароль: + + + Enable connection through a proxy server + Дозволити з'єднання через проксі-сервер + + + Language + Мова + + + Please choose your preferred language in the following list: + Будь-ласка виберіть бажану мову з наступного списку: + + + OK + OK + + + Cancel + Відміна + + + Language settings will take effect after restart. + Налаштування мови вступлять у дію після перезапуску. + + + Scanned Dir: + Просканована директорія: + + + Enable directory scan (auto add torrent files inside) + Дозволити сканування директорії (автоматично додавати torrent-файли, що знаходяться всередині) + + + Connection Settings + Налаштування з'єднання + + + Share ratio: + Коефіцієнт розподілу: + + + 1 KB DL = + 1 КБ DL = + + + KB UP max. + КБ UP макс. + + + Activate IP Filtering + Активувати фільтрацію по IP + + + Filter Settings + Налаштування фільтру + + + Start IP + Початковий IP + + + End IP + Кінцевий IP + + + Origin + Джерело + + + Comment + Коментарій + + + Apply + Примінити + + + IP Filter + IP-фільтр + + + Add Range + Додати діапазон + + + Remove Range + Видалити діапазон + + + ipfilter.dat Path: + Шлях до ipfilter.dat: + + + Clear finished downloads on exit + Очищати закінчені завантаження при виході + + + Ask for confirmation on exit + Питати підтвердження при виході + + + Go to systray when minimizing window + Мінімізувати в системний трей + + + Misc + Різне + + + Localization + Локалізація + + + Language: + Мова: + + + Behaviour + Поведінка + + + OSD + OSD + + + Always display OSD + Завжди показувати OSD + + + Display OSD only if window is minimized or iconified + Показувати OSD лише коли вікно мінімізовано + + + Never display OSD + Ніколи не показувати OSD + + + KiB/s + КіБ/с + + + 1 KiB DL = + 1 КіБ DL = + + + KiB UP max. + КіБ UP макс. + + + DHT (Trackerless): + DHT (Безтрекерний): + + + Disable DHT (Trackerless) support + Відключити підтримку DHT (Безтрекерний) + + + Automatically clear finished downloads + Автоматично очищати закінчені завантаження + + + Preview program + Програма перегляду + + + Audio/Video player: + Аудіо/Відео плеєр: + + + DHT configuration + Конфігурація DHT + + + DHT port: + Порт DHT: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>Увага:</b>Зміни вступлять у дію після перезапуску qBittorrent. + + + <b>Translators note:</b> If qBittorrent is not available in your language, <br/>and if you would like to translate it in your mother tongue, <br/>please contact me (chris@qbittorrent.org). + <b>До перекладачів:</b> Якщо qBittorrent не доступний на вашій мові, <br/>і ви хочете перекласти його, <br/>будь-ласка зв'яжіться зі мною (chris@qbittorrent.org). + + + Display a torrent addition dialog everytime I add a torrent + Показувати діалог при додаванні торренту + + + Default save path + Шлях збереження за замовчанням + + + Systray Messages + Повідомлення в системному треї + + + Always display systray messages + Завжди показувати повіомлення в системному треї + + + Display systray messages only when window is hidden + Показувати повідомлення в системному треї лише коли вікно приховане + + + Never display systray messages + Ніколи не показувати повідомлення в системному треї + + + Disable DHT (Trackerless) + Відключити DHT (Безтрекерний режим) + + + Disable Peer eXchange (PeX) + Відключити Peer eXchange (PeX) + + + Go to systray when closing main window + Згортати до системного трею при закритті головного вікна + + + Connection + З'єднання + + + Peer eXchange (PeX) + Peer eXchange (PeX) + + + DHT (trackerless) + DHT (безтрекерний) + + + Torrent addition + Додавання торренту + + + Main window + Головне вікно + + + Systray messages + Повідомлення системного трею + + + Directory scan + Сканування директорії + + + Style (Look 'n Feel) + Стиль (зовнішній вигляд) + + + Plastique style (KDE like) + Стиль Plastique (KDE-подібний) + + + Cleanlooks style (GNOME like) + Стиль Cleanlooks (GNOME-подібний) + + + Motif style (default Qt style on Unix systems) + Стиль Motif (Стиль Qt по замовчанню на системах Unix) + + + CDE style (Common Desktop Environment like) + Стиль CDE (Common Desktop Environment-подібний) + + + MacOS style (MacOSX only) + Стиль MacOS (лише MacOSX) + + + Exit confirmation when the download list is not empty + Підтвердження виходу якщо список завантажень не порожній + + + Disable systray integration + Відключити інтеграцію до системного трею + + + WindowsXP style (Windows XP only) + Стиль WindowsXP (лише Windows XP) + + + Server IP or url: + IP сервера або url: + + + Proxy type: + Тип проксі: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + З'єднання, на які це вплине + + + Use proxy for connections to trackers + Використовувати проксі при з'єднанні з трекерами + + + Use proxy for connections to regular peers + Використовувати проксі при з'єднанні із звичайними пірами + + + Use proxy for connections to web seeds + Використовувати проксі при з'єднанні з web-роздачами + + + Use proxy for DHT messages + Використовувати проксі для DHT повідомлень + + + Encryption + Шифрування + + + Encryption state: + Стан шифрування: + + + Enabled + Увімкнено + + + Forced + Примусовий + + + Disabled + Вимкнено + + + Preferences + Налаштування + + + General + Загальні + + + User interface settings + Налаштування інтерфейсу + + + Visual style: + Візуальний стиль: + + + Cleanlooks style (Gnome like) + Стиль Cleanlooks (Gnome-подібний) + + + Motif style (Unix like) + Стиль Motif (Unix-подібний) + + + Ask for confirmation on exit when download list is not empty + Питати підтвердження при виході, коли список завантажень не порожній + + + Display current speed in title bar + Показувати поточну швидкість в заголовку вікна + + + System tray icon + Іконка в системному треї + + + Disable system tray icon + Відключити іконку в системному треї + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + Закривати до трею + + + Minimize to tray + Мінімізувати до трею + + + Show notification balloons in tray + Показувати сповіщення в треї + + + Media player: + Медіа плеєр: + + + Downloads + Завантаження + + + Put downloads in this folder: + Класти завантаження в цю папку: + + + Pre-allocate all files + Попередньо виділяти місце для всіх файлів + + + When adding a torrent + Під час додавання торренту + + + Display torrent content and some options + Показувати вміст торренту та деякі опції + + + Do not start download automatically + The torrent will be added to download list in pause state + Не починати завантаження автоматично + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + Спостерігати за папкою + + + Download list: + + + + Seeding list: + + + + Download folder: + + + + Temp folder: + + + + Automatically download torrents present in this folder: + Автоматично завантажувати торренти, присутні у цій папці: + + + Listening port + Прослуховування порту + + + to + i.e: 1200 to 1300 + до + + + Enable UPnP port mapping + Увімкнути відображення портів UPnP + + + Enable NAT-PMP port mapping + Увімкнути відображення портів NAT-PMP + + + Global bandwidth limiting + Глобальний ліміт пропускної здатності + + + Upload: + Віддача: + + + Download: + Прийом: + + + Bittorrent features + + + + Use the same port for DHT and Bittorrent + + + + Type: + Тип: + + + (None) + (Ніякого) + + + Proxy: + Проксі: + + + Username: + Ім'я користувача: + + + Bittorrent + Bittorrent + + + Connections limit + Ліміт кількості з'єднань + + + Global maximum number of connections: + Глобальне максимальне число з'єднань: + + + Maximum number of connections per torrent: + Максимальне число з'єднань для одного торрента: + + + Maximum number of upload slots per torrent: + Максимальне число слотів віддачі для одного торрента: + + + Additional Bittorrent features + Додаткові можливості Bittorrent'а + + + Enable DHT network (decentralized) + Увімкнути мережу DHT (децентралізовану) + + + Enable Peer eXchange (PeX) + Увімкнути Peer eXchange (PeX) + + + Enable Local Peer Discovery + Увімкнути локальний пошук пірів + + + Encryption: + Шифрування: + + + Share ratio settings + Налаштування коефіціентів розподілення + + + Desired ratio: + Бажаний коефіціент: + + + Filter file path: + Фільтр шляхів до файлу: + + + transfer lists refresh interval: + інтервал оновлення списків передачі: + + + ms + мс + + + RSS + RSS + + + RSS feeds refresh interval: + Інтервал оновлення RSS-фідів: + + + minutes + хвилин + + + Maximum number of articles per feed: + Максимальне число записів у одному фіді: + + + File system + Файлова система + + + Remove finished torrents when their ratio reaches: + Видаляти закінчені торренти, коли їхній коефіціент розподілу досягає: + + + System default + + + + Start minimized + + + + Web UI + + + + Enable Web User Interface + + + + HTTP Server + + + + Enable RSS support + + + + RSS settings + + + + Enable queueing system + + + + Maximum active downloads: + + + + Torrent queueing + + + + Maximum active torrents: + + + + Display top toolbar + + + + Search engine proxy settings + + + + Bittorrent proxy settings + + + + Maximum active uploads: + + + + Spoof µtorrent to avoid ban (requires restart) + + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + + + + Start/Stop + + + + Open folder + + + + Show properties + + + + Port used for incoming connections: + + + + Random + + + + UI + + + + + DownloadingTorrents + + Name + i.e: file name + Ім'я + + + Size + i.e: file size + Розмір + + + Progress + i.e: % downloaded + Прогрес + + + DL Speed + i.e: Download speed + Швидкість зкачкування + + + UP Speed + i.e: Upload speed + Швидкість закачування + + + Seeds/Leechs + i.e: full/partial sources + Сідерів/Лічерів + + + Ratio + Коефіціент + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 запущено. + + + Be careful, sharing copyrighted material without permission is against the law. + Будьте обережні, розповсюдження захищеного матеріалу без дозволу є протизаконним. + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>було заблоковано</i> + + + Fast resume data was rejected for torrent %1, checking again... + Було відмовлено у швидкому відновленні данних для torrent'у %1, перевіряю знову... + + + Url seed lookup failed for url: %1, message: %2 + Пошук url роздачі невдалий для url: %1, повідомлення: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' додано до списку завантажень. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' відновлено. (швидке відновлення) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вже є у списку завантажень. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Неможливо декодувати торрент-файл: '%1' + + + This file is either corrupted or this isn't a torrent. + Цей файл пошкоджено, або він не є торрент-файлом. + + + Couldn't listen on any of the given ports. + Не можу слухати по жодному з вказаних портів. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Завантажуєсться '%1', будь-ласка зачекайте... + + + Hide or Show Column + + + + Priority + Пріоритет + + + Seeds/Leechers + i.e: full/partial sources + + + + + FeedDownloader + + RSS Feed downloader + + + + RSS feed: + + + + Feed name + + + + Automatically download torrents from this feed + + + + Download filters + + + + Filters: + + + + Filter settings + + + + Matches: + + + + Does not match: + + + + Destination folder: + + + + ... + ... + + + Filter testing + + + + Torrent title: + + + + Result: + + + + Test + + + + Import... + + + + Export... + + + + Rename filter + + + + Remove filter + + + + Add filter + + + + + FeedDownloaderDlg + + New filter + + + + Please choose a name for this filter + + + + Filter name: + + + + Invalid filter name + + + + The filter name cannot be left empty. + + + + This filter name is already in use. + + + + Filter testing error + + + + Please specify a test torrent name. + + + + matches + + + + does not match + + + + Select file to import + + + + Filters Files + + + + Import successful + + + + Filters import was successful. + + + + Import failure + + + + Filters could not be imported due to an I/O error. + + + + Select destination file + + + + Overwriting confirmation + + + + Are you sure you want to overwrite existing file? + + + + Export successful + + + + Filters export was successful. + + + + Export failure + + + + Filters could not be exported due to an I/O error. + + + + + FeedList + + Unread + + + + + FilterParserThread + + I/O Error + Input/Output Error + + + + Couldn't open %1 in read mode. + Не вдалося відкрити %1 у режимі читання. + + + %1 is not a valid PeerGuardian P2B file. + + + + + FinishedListDelegate + + KiB/s + КіБ/с + + + + FinishedTorrents + + Finished + Закінчено + + + Name + i.e: file name + Ім'я + + + Size + i.e: file size + Розмір + + + Seeds / Leechers + + + + Connected peers + + + + Progress + i.e: % downloaded + Прогрес + + + UP Speed + i.e: Upload speed + Швидкість віддачі + + + Seeds/Leechs + i.e: full/partial sources + Сідерів/Лічерів + + + Status + Статус + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Finished + i.e: Torrent has finished downloading + Закінчено + + + None + i.e: No error message + Немає + + + Ratio + Коефіціент + + + Leechers + i.e: full/partial sources + Лічери + + + Total uploaded + i.e: Total amount of uploaded data + + + + Hide or Show Column + + + + Priority + Пріоритет + + + + GUI + + Open Torrent Files + Відкрити Torrent-файли + + + Unknown + Невідомо + + + This file is either corrupted or this isn't a torrent. + Цей файл пошкоджено, або він не є torrent-файлом. + + + Are you sure you want to delete all files in download list? + Ви впевнені що хочете видалити всі файли зі списку завантажень? + + + &Yes + &Так + + + &No + &Ні + + + Are you sure you want to delete the selected item(s) in download list? + Ви впевнені що хочете видалити вибрані файли зі списку завантажень? + + + paused + зупинено + + + started + почато + + + Finished + Закінчено + + + Checking... + Перевіряю... + + + Connecting... + З'єднуюсь... + + + Downloading... + Завантажую... + + + Download list cleared. + Список завантажень очищено. + + + All Downloads Paused. + Всі завантаження зупинено. + + + All Downloads Resumed. + Всі завантаження відновлено. + + + DL Speed: + DL швидкість: + + + started. + почато. + + + UP Speed: + UP швидкість: + + + Couldn't create the directory: + Неможливо створити директорію: + + + Torrent Files + Torrent файли + + + already in download list. + <file> already in download list. + вже в списку завантажень. + + + added to download list. + додано до списку завантажень. + + + resumed. (fast resume) + відновлено. (швидке відновлення) + + + Unable to decode torrent file: + Неможливо декодувати torrent-файл: + + + removed. + <file> removed. + видалено. + + + paused. + <file> paused. + зупинено. + + + resumed. + <file> resumed. + відновлено. + + + m + minutes + хв + + + h + hours + г + + + d + days + д + + + Listening on port: + Слухаю порт: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Ви впевнені? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL швидкість: + + + <b>Connection Status:</b><br>Online + <b>Статус з'єднання:</b><br>Онлайн + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Статус з'єднання:</b><br>Заборонено файерволом?<br><i>Немає вхідних з'єднаннь...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Статус з'єднання:</b><br>Оффлайн<br><i>Не знайдено пірів...</i> + + + /s + <unit>/seconds + + + + has finished downloading. + завантажено. + + + Couldn't listen on any of the given ports. + Не можу слухати по жодному з вказаних портів. + + + None + Немає + + + Empty search pattern + Пустий шаблон пошуку + + + Please type a search pattern first + Будь-ласка спочатку введіть шаблон пошуку + + + No seach engine selected + Не вибрано пошуковика + + + You must select at least one search engine. + Ви повинні вибрати хоча б один пошуковик. + + + Searching... + Шукаю... + + + Could not create search plugin. + Неможливо створити плагін пошуку. + + + Stopped + Зупинено + + + I/O Error + Помилка I/O + + + Couldn't create temporary file on hard drive. + Неможливо створити тимчасовий файл на диску. + + + Torrent file URL + URL torrent-файлу + + + KB/s + КБ/с + + + KB/s + КБ/с + + + Downloading using HTTP: + Завантажую використовуючи HTTP: + + + Torrent file URL: + URL torrent-файлу: + + + A http download failed... + http завантаження невдале... + + + A http download failed, reason: + http завантаження невдале, причина: + + + Are you sure you want to quit? -- qBittorrent + Ви впевнені що хочете вийти? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Ви впевнені що хочете вийти з qbittorrent? + + + Timed out + Вичерпано час + + + Error during search... + Помилка при пошуку... + + + KiB/s + КіБ/с + + + KiB/s + КіБ/с + + + Stalled + Заглохло + + + Search is finished + Пошук завершено + + + An error occured during search... + Під час пошуку сталася помилка... + + + Search aborted + Пошук скасовано + + + Search returned no results + Пошук не дав результів + + + Search is Finished + Пошук завершено + + + Search plugin update -- qBittorrent + Оновлення пошукового плагіну -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Пошуковий плагін може бути оновлений, ви хочете його оновити? + +Список змін: + + + + Sorry, update server is temporarily unavailable. + Пробачте, сервер оновлень тимчасово недоступний. + + + Your search plugin is already up to date. + Ви вже маєте останню версію пошукового плагіну. + + + Results + Результати + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + DL Speed + DL швидкість + + + UP Speed + UP швидкість + + + Status + Статус + + + ETA + ETA + + + Seeders + Сідери + + + Leechers + Лічери + + + Search engine + Пошуковик + + + Stalled + state of a torrent whose DL Speed is 0 + Заглохло + + + Paused + Призупинено + + + Preview process already running + Процес перегляду вже запущений + + + There is already another preview process running. +Please close the other one first. + Вже запущений інший процес перегляду. +Будь-ласка, спочатку закрийте його. + + + Couldn't download + Couldn't download <file> + Не зміг завантажити + + + reason: + Reason why the download failed + причина: + + + Downloading + Example: Downloading www.example.com/test.torrent + Завантажую + + + Please wait... + Будь-ласка, зачекайте... + + + Transfers + Трансфери + + + Are you sure you want to quit qBittorrent? + Ви впевнені, що хочете вийти з qBittorrent? + + + Are you sure you want to delete the selected item(s) in download list and in hard drive? + Ви впевнені, що хочете видалити вибрані завантаження зі списку та з вінчестера? + + + Download finished + Завантаження завершено + + + has finished downloading. + <filename> has finished downloading. + завантажено. + + + Search Engine + Пошуковик + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + Статус з'єднання: + + + Offline + Офлайн + + + No peers found... + Не знайдено пірів... + + + Name + i.e: file name + Ім'я + + + Size + i.e: file size + Розмір + + + Progress + i.e: % downloaded + Прогрес + + + DL Speed + i.e: Download speed + Швидкість прийому + + + UP Speed + i.e: Upload speed + Швидкість віддачі + + + Seeds/Leechs + i.e: full/partial sources + Сідерів/Лічерів + + + ETA + i.e: Estimated Time of Arrival / Time left + ETA + + + Seeders + i.e: Number of full sources + Сідери + + + Leechers + i.e: Number of partial sources + Лічери + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 запущено. + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + Швидкість прийому: %1 КіБ/с + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + Швидкість віддачі: %1 КіБ/с + + + Finished + i.e: Torrent has finished downloading + Закінчено + + + Checking... + i.e: Checking already downloaded parts... + Перевіряю... + + + Stalled + i.e: State of a torrent whose download speed is 0kb/s + Заглохло + + + Are you sure you want to quit? + Ви впевнені, що хочете вийти? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' було видалено. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' додано до списку завантажень. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' відновлено. (швидке відновлення) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вже є у списку завантажень. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Неможливо декодувати торрент-файл: '%1' + + + None + i.e: No error message + Немає + + + Listening on port: %1 + e.g: Listening on port: 1666 + Прослуховую порт: %1 + + + All downloads were paused. + Всі завантаження були призупинені. + + + '%1' paused. + xxx.avi paused. + '%1' призупинено. + + + Connecting... + i.e: Connecting to the tracker... + З'єднуюсь... + + + All downloads were resumed. + Всі завантаження було відновлено. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' відновлено. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + Завантаження '%1' закінчилось. + + + I/O Error + i.e: Input/Output Error + Помилка вводу/виводу + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + Сталася помилка під час запису чи зчитування %1. Можливо диск заповнено, завантаження було призупинено + + + An error occured (full fisk?), '%1' paused. + e.g: An error occured (full fisk?), 'xxx.avi' paused. + Сталася помилка (заповнено диск?), '%1' призупинено. + + + Connection Status: + Статус з'єднання: + + + Online + Онлайн + + + Firewalled? + i.e: Behind a firewall/router? + Захищено фаєрволом? + + + No incoming connections... + Немає вхідних з'єднань... + + + No search engine selected + Не вибрано пошуковик + + + Search plugin update + Оновити пошуковий плагін + + + Search has finished + Пошук закінчено + + + Results + i.e: Search results + Результати + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + Завантажую '%1', будь-ласка зачекайте... + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + Сталася помилка (заповнено диск?), '%1' призупинено. + + + Search + Пошук + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent прив'язаний до порту: %1 + + + DHT support [ON], port: %1 + Підтримка DHT (Увімкнена), порт: %1 + + + DHT support [OFF] + Підтримка DHT (Вимкнена) + + + PeX support [ON] + Підтримка PeX (Увімкнена) + + + PeX support [OFF] + Підтримка PeX (Вимкнена) + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + Список завантажень не порожній. +Ви впевнені, що хочете вийти з qBittorrent? + + + Downloads + Завантаження + + + Are you sure you want to delete the selected item(s) in finished list? + Ви впевнені що хочете видалити вибрані пункти зі списку завершених завантажень? + + + UPnP support [ON] + Підтримка UNnP (Увімкнена) + + + Be careful, sharing copyrighted material without permission is against the law. + Будьте обережні, ділення захищеним матеріалом без дозволу є протизаконним. + + + Encryption support [ON] + Підтримка шифрування (Увімкнена) + + + Encryption support [FORCED] + Підтримка шифрування (Примусова) + + + Encryption support [OFF] + Підтримка шифрування (Вимкнена) + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>було заблоковано</i> + + + Ratio + КоеКоефіціент + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + Помилка завантаження url + + + Couldn't download file at url: %1, reason: %2. + Неможливо завантажити файл з url: %1, причина: %2. + + + Fast resume data was rejected for torrent %1, checking again... + Було відмовлено у швидкому відновленні данних для torrent'у %1, перевіряю знову... + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + Ви впевнені що хочете видалити вибрані пункти зі списку завантажень та зі жорсткого диску? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + Ви впевнені що хочете видалити вибрані пункти зі списку завершених завантажень та зі жорсткого диску? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' було назавжди видалено. + + + Url seed lookup failed for url: %1, message: %2 + Пошук url роздачі невдалий для url: %1, повідомлення: %2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + + + + UPnP support [OFF] + Підтримка UPnP [Вимкнено] + + + NAT-PMP support [ON] + Підтримка NAT-PMP [Увімкнено] + + + NAT-PMP support [OFF] + Підтримка NAT-PMP [Вимкнено] + + + DHT support [ON], port: UDP/%1 + + + + Local Peer Discovery [ON] + Пошук Локальних Пірів [Увімкнено] + + + Local Peer Discovery support [OFF] + Пошук Локальних Пірів [Вимкнено] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' було видалено, тому що його коефіціент досяг максимального значення встановленого вами. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (Прийом: %2КіБ/с, Віддача: %3КіБ/с) + + + DL: %1 KiB/s + + + + UP: %1 KiB/s + + + + Ratio: %1 + + + + DHT: %1 nodes + + + + No direct connections. This may indicate network configuration problems. + + + + Uploads + + + + Options were saved successfully. + Опції були успішно збережені. + + + + MainWindow + + Log: + Лог: + + + Total DL Speed: + Загальна DL швидкість: + + + Kb/s + Кб/с + + + Total UP Speed: + Загальна UP швидкість: + + + Name + Ім'я + + + Size + Розмір + + + % DL + % DL + + + DL Speed + DL швидкість + + + UP Speed + UP швидкість + + + Status + Статус + + + ETA + ETA + + + &Options + &Опції + + + &Edit + &Редагувати + + + &File + &Файл + + + &Help + &Допомога + + + Open + Відкрити + + + Exit + Вихід + + + Preferences + Налаштування + + + About + Про програму + + + Start + Почати + + + Pause + Призупинити + + + Delete + Видалити + + + Pause All + Призупинити всі + + + Start All + Почати всі + + + Documentation + Документація + + + Delete All + Видалити всі + + + Torrent Properties + Властивості Torrent + + + Connection Status + Статус з'єднання + + + Downloads + Завантаження + + + Search + Пошук + + + Search Pattern: + Шаблон пошуку: + + + Status: + Статус: + + + Stopped + Зупинено + + + Search Engines + Пошуковики + + + Results: + Результати: + + + Stop + Зупинити + + + Seeds + Роздачі + + + Leechers + Лічери + + + Search Engine + Пошуковик + + + Download from URL + Завантажити з URL + + + Download + Завантажити + + + Clear + Очистити + + + KiB/s + КіБ/с + + + Create torrent + Створити torrent + + + Ratio: + Коефіціент: + + + Update search plugin + Оновити пошуковий плагін + + + Session ratio: + Коефіціент сесії: + + + Transfers + Трансфери + + + Preview file + Файл перегляду + + + Clear log + Очистити лог + + + Delete Permanently + Видалити назовсім + + + Visit website + Відвідати веб-сайт + + + Report a bug + Повідомити про помилку + + + Set upload limit + Встановити ліміт віддачі + + + Set download limit + Встановити ліміт прийому + + + Log + Лог + + + IP filter + Фільтер IP + + + Set global download limit + Встановити глобальний ліміт прийому + + + Set global upload limit + Встановити глобальний ліміт віддачі + + + Options + Опції + + + Decrease priority + + + + Increase priority + + + + Console + + + + + PropListDelegate + + False + Ні + + + True + Так + + + Ignored + Ігнорувати + + + Normal + Normal (priority) + Нормальний + + + High + High (priority) + Високий + + + Maximum + Maximum (priority) + Максимальний + + + + QTextEdit + + Clear + Очистити + + + + RSS + + Search + Пошук + + + Delete + Видалити + + + Rename + Переіменувати + + + Refresh + Обновити + + + Create + Створити + + + Delete selected streams + Видалити вибрані потоки + + + Refresh RSS streams + Обновити потоки RSS + + + Add a new RSS stream + Додати новий потік RSS + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>Новини:</b> <i>(подвійний клік відкриє посилання у вашому броузері)</i> + + + Add RSS stream + Додать потік RSS + + + Refresh all streams + Обновити всі потоки + + + RSS streams: + Потоки RSS: + + + 2 + 2 + + + Mark all as read + Позначити всі як прочитані + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + Download torrent + + + + Open news URL + + + + Copy feed URL + + + + RSS feed downloader + + + + New subscription + + + + Mark items read + + + + Update all + + + + Update all feeds + + + + RSS feeds + + + + Update + + + + New folder + + + + Feed URL + + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + Будь-ласка, введіть url потоку rss + + + Stream URL: + URL потоку: + + + Please choose a new name for this stream + Будь-ласка, виберіть нове ім'я для цього потоку + + + New stream name: + Нове ім'я потоку: + + + Are you sure? -- qBittorrent + Ви впевнені? -- qBittorrent + + + Are you sure you want to delete this stream from the list ? + Ви впевнені що хочете видалити цей потік зі списку? + + + &Yes + &Так + + + &No + &Ні + + + Are you sure you want to delete this stream from the list? + Ви впевнені що хочете видалити цей потік зі списку? + + + Description: + Опис: + + + url: + url: + + + Last refresh: + Останнє обновлення: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + Цей rss-стрічка вже є в списку. + + + Date: + Дата: + + + Author: + Автор: + + + Please choose a folder name + + + + Folder name: + + + + New folder + + + + Are you sure you want to delete these elements from the list? + + + + Are you sure you want to delete this element from the list? + + + + Please choose a new name for this RSS feed + + + + New feed name: + + + + Name already in use + + + + This name is already used by another item, please choose another one. + + + + Overwrite attempt + + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + + + + Unread + + + + + RssItem + + No description available + Опис відсутній + + + + RssStream + + %1 ago + 10min ago + %1 тому + + + Never + Ніколи + + + Automatically downloading %1 torrent from %2 RSS feed... + + + + + SearchCategories + + All categories + + + + Movies + + + + TV shows + + + + Music + + + + Games + + + + Anime + + + + Software + + + + Pictures + + + + Books + + + + + SearchEngine + + Name + i.e: file name + Ім'я + + + Size + i.e: file size + Розмір + + + Seeders + i.e: Number of full sources + Сідери + + + Leechers + i.e: Number of partial sources + Лічери + + + Search engine + Пошуковик + + + Empty search pattern + Пустий шаблон пошуку + + + Please type a search pattern first + Будь-ласка, спочатку введіть шаблон пошуку + + + No search engine selected + Не вибрано пошуковик + + + You must select at least one search engine. + Ви повинні вибрати хоча б один пошуковик. + + + Results + Результати + + + Searching... + Шукаю... + + + Search plugin update -- qBittorrent + Оновлення пошукового плагіну -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Пошуковий плагін може бути оновлений, ви хочете його оновити? + +Список змін: + + + + &Yes + &Так + + + &No + &Ні + + + Search plugin update + Оновити пошуковий плагін + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + Пробачте, сервер оновлень тимчасово недоступний. + + + Your search plugin is already up to date. + Ви вже маєте останню версію пошукового плагіну. + + + Cut + + + + Copy + + + + Paste + + + + Clear field + + + + Clear completion history + + + + Search Engine + Пошуковик + + + Search has finished + Пошук закінчено + + + An error occured during search... + Під час пошуку сталася помилка... + + + Search aborted + Пошук скасовано + + + Search returned no results + Пошук не дав результів + + + Results + i.e: Search results + Результати + + + Search plugin download error + Помилка при завантаженні пошукового плагіну + + + Couldn't download search plugin update at url: %1, reason: %2. + Неможливо завантажити пошуковий плагін з url: %1, причина: %2. + + + Unknown + Невідомо + + + + SearchTab + + Name + i.e: file name + Ім'я + + + Size + i.e: file size + Розмір + + + Seeders + i.e: Number of full sources + Сідери + + + Leechers + i.e: Number of partial sources + Лічери + + + Search engine + Пошуковик + + + + TrackersAdditionDlg + + Trackers addition dialog + + + + List of trackers to add (one per line): + + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Бідь-ласка зв'яжіться зі мною якщо ви бажаєте перекласти qBittorrent на вашу мову. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хотів би подякувати наступним людям, які переклали qBittorrent на власні мови: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Я хотів би подякувати sourceforge.net за розміщення проекту qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>І також я хотів би подякувати Джефрі Фернандезу (developer@jefferyfernandez.id.au), нашому RPM-пакувальнику, за його чудову роботу.</li></ul> + + + Preview impossible + Перегляд неможливий + + + Sorry, we can't preview this file + Пробачте, неможливо переглянути цей файл + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + No URL entered + Не введено URL + + + Please type at least one URL. + Буд-ласка, введіть хоча б один URL. + + + qBittorrent + qBitorrent + + + Please contact me if you would like to translate qBittorrent into your own language. + Будь-ласка зв'яжітся зі мною, якщо ви бажаєте перекласти qBittorrent на вашу мову. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хотів би подякувати наступним людям, які переклали qBittorrent на власні мови: + + + Please contact me if you would like to translate qBittorrent into your own language. + Будь-ласка зв'яжітся зі мною, якщо ви бажаєте перекласти qBittorrent на вашу мову. + + + + addTorrentDialog + + Torrent addition dialog + Діалог додавання торренту + + + Save path: + Шлях збереження: + + + ... + ... + + + Torrent content: + Вміст торренту: + + + File name + Ім'я файлу + + + File size + Розмір файлу + + + Selected + Вибрано + + + Download in correct order (slower but good for previewing) + Завантажувати в правильному порядку (повільніше, але краще для перегляду) + + + Add to download list in paused state + Додати до списку завантажень у призупиненому стані + + + Add + Додати + + + Cancel + Відміна + + + select + вибрати + + + Unselect + Зняти вибір + + + Select + Вибрати + + + Ignored + Проігноровано + + + Normal + Нормально + + + High + Високий + + + Maximum + Максимальний + + + Collapse all + + + + Expand all + + + + Torrent size: + + + + Unknown + Невідомо + + + Free disk space: + + + + Download in sequential order (slower but good for previewing) + + + + + authentication + + Tracker authentication + Аутентификация на трекере + + + Tracker: + Трекер: + + + Login + Логін + + + Username: + Ім'я користувача: + + + Password: + Пароль: + + + Log in + Увійти + + + Cancel + Відміна + + + + bandwidth_dlg + + Bandwidth allocation + Виділена пропускна здатність + + + KiB/s + КіБ/с + + + + bittorrent + + %1 reached the maximum ratio you set. + + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' було назавжди видалено. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' було видалено. + + + '%1' paused. + e.g: xxx.avi paused. + '%1' призупинено. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' відновлено. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' вже є у списку завантажень. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' відновлено. (швидке відновлення) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' додано до списку завантажень. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + Неможливо декодувати торрент-файл: '%1' + + + This file is either corrupted or this isn't a torrent. + + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + + + + Couldn't listen on any of the given ports. + Не можу слухати по жодному з вказаних портів. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + + + + Fast resume data was rejected for torrent %1, checking again... + Було відмовлено у швидкому відновленні данних для torrent'у %1, перевіряю знову... + + + Url seed lookup failed for url: %1, message: %2 + Пошук url роздачі невдалий для url: %1, повідомлення: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + + + + '%1' is not a valid magnet URI. + + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + + + + Unable to decode %1 torrent file. + + + + + createTorrentDialog + + Create Torrent file + Створити torrent-файл + + + Destination torrent file: + Цільовий torrent-файл: + + + Input file or directory: + Вхідний файл чи директорія: + + + Comment: + Коментарій: + + + ... + ... + + + Create + Створити + + + Cancel + Відміна + + + Announce url (Tracker): + url оповіщення (Трекер): + + + Directory + Директорія + + + Torrent Creation Tool + Інструмент для створення Torrent'ів + + + <center>Destination torrent file:</center> + <center>Цільовий torrent-файл:</center> + + + <center>Input file or directory:</center> + <center>Вхідний файл чи директорія:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Оповістити url:<br>(Одна на лінію)<center> + + + <center>Comment:</center> + <center>Комментарій:</center> + + + Torrent file creation + Створення torrent-файлу + + + Input files or directories: + Вхідні файли чи директорії: + + + Announce urls (trackers): + urls анонсу (трекери): + + + Comment (optional): + Коментарій (необов'язково): + + + Private (won't be distributed on trackerless network / DHT if enabled) + Приватно (якщо увімкнено, не буде передаватись через безтрекерну мережу / DHT) + + + Web seeds urls (optional): + Urls web-роздачі (необов'язково): + + + File or folder to add to the torrent: + Файл або папка для додавання в торрент: + + + Add a file + Додати файл + + + Add a folder + Додати папку + + + Piece size: + Розмір частини: + + + 32 KiB + 32 КіБ + + + 64 KiB + 64 КіБ + + + 128 KiB + 128 КіБ + + + 256 KiB + 256 КіБ + + + 512 KiB + 512 КіБ + + + 1 MiB + 1 МіБ + + + 2 MiB + 2 МіБ + + + 4 MiB + 4 МіБ + + + Private (won't be distributed on DHT network if enabled) + Приватно (не буде передаватись через мережу DHT, якщо увімкнено) + + + Start seeding after creation + Почати роздачу одразу після створення + + + Create and save... + Створити і зберегти... + + + Progress: + + + + Add file + + + + Add folder + + + + + createtorrent + + Select destination torrent file + Виберіть цільовий torrent-файл + + + Torrent Files + Torrent файли + + + Select input directory or file + Виберіть вхідну директорію чи файл + + + No destination path set + Не задано шлях призначення + + + Please type a destination path first + Будь-ласка, спочатку введіть шлях призначення + + + No input path set + Не задано вхідний шлях + + + Please type an input path first + Будь-ласка, спочатку введіть вхідний шлях + + + Input path does not exist + Вхідний шлях не існує + + + Please type a correct input path first + Будь-ласка, спочатку введіть правильний вхідний шлях + + + Torrent creation + Створення торренту + + + Torrent was created successfully: + Торрент було успішно створено: + + + Please type a valid input path first + Будь-ласка, спочатку введіть правильний вхідний шлях + + + Select a folder to add to the torrent + Виберіть папку для додавання в torrent + + + Select files to add to the torrent + Виберіть файли для додавання в torrent + + + Please type an announce URL + Будб-ласка, введіть URL анонсу + + + Torrent creation was unsuccessful, reason: %1 + Створення torrent'у було невдалим, причина: %1 + + + Announce URL: + Tracker URL + URL анонсу: + + + Please type a web seed url + Будб-ласка, введіть url web-роздачі + + + Web seed URL: + URL web-роздачі: + + + Select a file to add to the torrent + Виберіть файл для додавання в торрент + + + No tracker path set + Не встановлено шлях трекера + + + Please set at least one tracker + Будь-ласка, встановіть хоча б один трекер + + + Created torrent file is invalid. It won't be added to download list. + + + + + downloadFromURL + + Download Torrents from URLs + Завантажити торренти з URL-ів + + + Only one URL per line + Лише один URL на лінію + + + Download + Завантажити + + + Cancel + Відміна + + + Download from urls + Завантажити з url-ів + + + No URL entered + Не введено URL + + + Please type at least one URL. + Буд-ласка, введіть хоча б один URL. + + + + downloading + + Search + ПошукПошук + + + Total DL Speed: + Загальна швидкість зкачування: + + + KiB/s + КіБ/с + + + Session ratio: + Коефіціент сесії: + + + Total UP Speed: + Загальна швидкість закачування: + + + Log + Лог + + + IP filter + Фільтр IP + + + Start + Почати + + + Pause + Призупинити + + + Delete + Видалити + + + Clear + Очистити + + + Preview file + Файл попереднього перегляду + + + Set upload limit + Встановити ліміт закачування + + + Set download limit + Встановити ліміт зкачування + + + Delete Permanently + Видалити назавжди + + + Torrent Properties + Властивості торенту + + + Open destination folder + + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + DLSpeed + + + + UpSpeed + + + + Seeds/Leechs + Сідерів/Лічерів + + + Ratio + + + + ETA + ETA + + + Buy it + + + + Priority + Пріоритет + + + Increase priority + + + + Decrease priority + + + + Force recheck + + + + Copy magnet link + + + + + engineSelect + + Search plugins + Пошукові плагіни + + + Installed search engines: + Встановлені пошуковики: + + + Name + Ім'я + + + Url + Url + + + Enabled + Увімкнено + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Ви можете отримати нові пошукові плагіни тут: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + Встановити новий + + + Check for updates + Перевірити оновлення + + + Close + Закрити + + + Enable + Дозволити + + + Disable + Заборонити + + + Uninstall + Видалити + + + + engineSelectDlg + + True + Так + + + False + Ні + + + Uninstall warning + Попередження про видалення + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + Деякі плагіни не можуть бути видалені, тому що вони є частиною qBittorrent. +Можна видалити лише ті плагіни, які ви встановили власноруч. +Тим не менше, ті плагіни вимкнено. + + + Uninstall success + Видалення успішне + + + Select search plugins + Вибрати пошукові плагіни + + + qBittorrent search plugins + Пошукові плагіни qBittorrent + + + Search plugin install + Встановити пошуковий плагін + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + Більш нова версія пошукового плагіну %1 вже є встановлена. + + + Search plugin update + Оновити пошуковий плагін + + + Sorry, update server is temporarily unavailable. + Пробачте, сервер оновлень тимчасово недоступний. + + + Sorry, %1 search plugin update failed. + %1 is the name of the search engine + Вибачте, не вдалося оновити пошуковий плагін %1. + + + All your plugins are already up to date. + Всі ваші плагіни мають останню версію. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + Пошуковий плагін не може бути оновлено, залишено стару версію. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + Неможливо встановити пошуковий плагін %1. + + + All selected plugins were uninstalled successfully + Всі вибрані пошукові плагіни було успішно видалено + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + Пошуковий плагін %1 було успішно оновлено. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + Пошуковий плагін %1 було успішно встановлено. + + + %1 search plugin was successfully updated. + %1 is the name of the search engine + Пошуковий плагін %1 було успішно оновлено. + + + Search engine plugin archive could not be read. + Архів пошукового плагіну не може бути прочитаний. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + Вибачте, встановлення пошукового плагіну %1 невдале. + + + New search engine plugin URL + Новий URL пошукового плагіну + + + URL: + URL: + + + Yes + + + + No + + + + + misc + + B + bytes + Б + + + KiB + kibibytes (1024 bytes) + КіБ + + + MiB + mebibytes (1024 kibibytes) + МіБ + + + GiB + gibibytes (1024 mibibytes) + ГіБ + + + TiB + tebibytes (1024 gibibytes) + ТіБ + + + m + minutes + хв + + + h + hours + г + + + d + days + д + + + Unknown + Невідомо + + + h + hours + г + + + d + days + д + + + Unknown + Unknown (size) + Невідомо + + + < 1m + < 1 minute + < 1хв + + + %1m + e.g: 10minutes + %1хв + + + %1h%2m + e.g: 3hours 5minutes + %1г%2хв + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1д%2г%3хв + + + + options_imp + + Options saved successfully! + Опції успішно збережено! + + + Choose Scan Directory + Виберіть директорію сканування + + + Choose save Directory + Виберіть директорію збереження + + + Choose ipfilter.dat file + Виберіть файл ipfilter.dat + + + I/O Error + Помилка I/O + + + Couldn't open: + Не можу відкрити: + + + in read mode. + в режимі читання. + + + Invalid Line + Неправильна лінія + + + Line + Лінія + + + is malformed. + сформована неправильно. + + + Range Start IP + Початокова IP-адреса діапазону + + + Start IP: + Початкова IP-адреса: + + + Incorrect IP + Невірний IP + + + This IP is incorrect. + Цей IP невірний. + + + Range End IP + Кінцева IP-адреса + + + End IP: + Кінцева IP-адреса діапазону: + + + IP Range Comment + Коментарій для діапазону IP-адрес + + + Comment: + Коментарій: + + + to + <min port> to <max port> + до + + + Choose your favourite preview program + Виберіть вашу улюблену програму перегляду + + + Invalid IP + Неправильний IP + + + This IP is invalid. + Цей IP неправильний. + + + Options were saved successfully. + Опції були успішно збережені. + + + Choose scan directory + Виберіть ддиректорію для сканування + + + Choose an ipfilter.dat file + Виберіть файл ipfilter.dat + + + Choose a save directory + Виберіть директорію для збереження + + + I/O Error + Input/Output Error + Помилка вводу/виводу + + + Couldn't open %1 in read mode. + Не вдалося відкрити %1 у режимі читання. + + + Choose an ip filter file + + + + Filters + + + + + pluginSourceDlg + + Plugin source + Джерело плагіну + + + Search plugin source: + Джерело пошукового плагіну: + + + Local file + Локальний файл + + + Web link + Веб-посилання + + + + preview + + Preview selection + Вибір перегляду + + + File preview + Перегляд файлу + + + The following files support previewing, <br>please select one of them: + Наступні файли підтримують перегляд, <br>будь-ласка, виберітьб один з них: + + + Preview + Перегляд + + + Cancel + Відміна + + + + previewSelect + + Preview impossible + Перегляд неможливий + + + Sorry, we can't preview this file + Пробачте, неможливо переглянути цей файл + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + + properties + + Torrent Properties + Властивості Torrent + + + Main Infos + Головна інформація + + + File Name + Ім'я файлу + + + Current Session + Поточна сесія + + + Total Uploaded: + Загалом віддано: + + + Total Downloaded: + Загалом прийнято: + + + Download state: + Стан завантаження: + + + Current Tracker: + Поточний трекер: + + + Number of Peers: + Кількість пірів: + + + Torrent Content + Вміст Torrent'у + + + OK + OK + + + Total Failed: + Загалом невдалих: + + + Finished + Закінчено + + + Queued for checking + Поставлено в чергу для перевірки + + + Checking files + Перевірка файлів + + + Connecting to tracker + З'єднуюсь з трекером + + + Downloading Metadata + Завантажую метадані + + + Downloading + Завантажую + + + Seeding + Роздаю + + + Allocating + Виділяю + + + Unknown + Невідомо + + + Complete: + Завершено: + + + Partial: + Частково: + + + Files contained in current torrent: + Файли в поточному torrent'і: + + + Size + Розмір + + + Selected + Вибрано + + + Unselect + Відмінити вибір + + + Select + Вибрати + + + You can select here precisely which files you want to download in current torrent. + Тут ви можете вибрати окремі файли для завантаження в поточному torrent'і. + + + False + Ні + + + True + Так + + + Tracker + Трекер + + + Trackers: + Трекери: + + + None - Unreachable? + Немає - Недосяжний? + + + Errors: + Помилки: + + + Progress + Прогрес + + + Main infos + Головна інформація + + + Number of peers: + Кількість пірів: + + + Current tracker: + Поточний трекер: + + + Total uploaded: + Загалом закачано: + + + Main info + + + + Torrent information + + + + Total downloaded: + Загалом зкачано: + + + Total failed: + Загалом невдало: + + + Torrent content + Вміст Torrent'у + + + Options + Опції + + + Download in correct order (slower but good for previewing) + Завантажувати в правильному порядку (повільніше, але краще для перегляду) + + + Share Ratio: + Коефіціент розподілення: + + + Seeders: + Сідери: + + + Leechers: + Лічери: + + + Save path: + Шлях збереження: + + + Torrent infos + Інформація torrent'у + + + Creator: + Автор: + + + Torrent hash: + Хеш torrent'у: + + + Comment: + Коментарій: + + + Current session + Поточна сесія + + + Share ratio: + Коефіцієнт розподілу: + + + Trackers + Трекери + + + New tracker + Новий трекер + + + New tracker url: + Url нового трекера: + + + Priorities: + Пріорітети: + + + Normal: normal priority. Download order is dependent on availability + Нормальний: нормальний пріорітет. Порядок завантажень залежить від доступності + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + Високий: вище, ніж нормальний пріорітет. Ці частини переважають над частинами з такою ж доступністю, але не над менш доступними частинами + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + Максимальний: максимальний пріоритет, доступність нехтується, ця частина переважає над будь-якою іншою з нижчим пріоритетом + + + File name + Ім'я файлу + + + Priority + Пріоритет + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Список трекерів не може бути порожнім. + + + Ignored: file is not downloaded at all + Ігнорувати: файл взагалі не завантажується + + + Ignored + Ігнорувати + + + Normal + Нормальний + + + Maximum + Максимальний + + + High + Високий + + + Url seeds + Url роздачі + + + New url seed: + Новий url роздачі: + + + This url seed is already in the list. + Цей url роздачі вже існує в списку. + + + Hard-coded url seeds cannot be deleted. + Жорстко запрограмовані url роздачі не можуть бути видалені. + + + None + i.e: No error message + Немає + + + New url seed + New HTTP source + Новий url роздачі + + + The following url seeds are available for this torrent: + Наступні url роздачі доступні для цього torrent'а: + + + Priorities error + Помилка пріоритетів + + + Error, you can't filter all the files in a torrent. + Помилка, ви не можете відфільтрувати всі файли в торренті. + + + Downloaded pieces + + + + Collapse all + + + + Expand all + + + + ... + ... + + + Choose save path + Виберіть шлях збереження + + + Save path creation error + Помилка при створенні шляху збереження + + + Could not create the save path + Неможливо створити шлях збереження + + + + search_engine + + Search + Пошук + + + Search Engines + Пошуковики + + + Search Pattern: + Шаблон пошуку: + + + Stop + Зупинити + + + Status: + Статус: + + + Stopped + Зупинено + + + Results: + Результати: + + + Download + Завантажити + + + Clear + Очистити + + + Update search plugin + Оновити пошуковий плагін + + + Search engines... + Пошуковики... + + + + seeding + + Search + Пошук + + + The following torrents are finished and shared: + Наступні torrent'и закінчені і є загально використовувані: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>Примітка:</u> Важливо, щоб ви зберігали загальний доступ до закінчених torrent'ів доки існує з'єднання. + + + Start + Почати + + + Pause + Призупинити + + + Delete + Видалити + + + Delete Permanently + Видалити назавжди + + + Torrent Properties + Властивості torrent'у + + + Preview file + Переглянути файл + + + Set upload limit + Встановити ліміт віддачі + + + Open destination folder + + + + Name + Ім'я + + + Size + Розмір + + + Upload Speed + + + + Connected peers + + + + Seeds / Leechers + + + + Leechers + Лічери + + + Ratio + + + + Buy it + + + + Total uploaded + + + + Priority + Пріоритет + + + Force recheck + + + + Copy magnet link + + + + + subDownloadThread + + Host is unreachable + Хост недоступний + + + File was not found (404) + Файл не знайдено (404) + + + Connection was denied + Відмовлено у з'єднанні + + + Url is invalid + Неправильний URL + + + Connection forbidden (403) + З'єднання заборонено (403) + + + Connection was not authorized (401) + З'єднання не авторизовано (401) + + + Content has moved (301) + Контент переміщено (301) + + + Connection failure + Відмовлено у з'єднанні + + + Connection was timed out + Вичерпано час на з'єднання + + + Incorrect network interface + Неправильний мережевий інтерфейс + + + Unknown error + Невідома помилка + + + Could not resolve proxy + + + + I/O Error + + + + + torrentAdditionDialog + + True + Так + + + Unable to decode torrent file: + Неможливо декодувати torrent-файл: + + + This file is either corrupted or this isn't a torrent. + Цей файл пошкоджено, або він не є torrent-файлом. + + + Choose save path + Виберіть шлях збереження + + + False + Ні + + + Empty save path + Пустий шлях збереження + + + Please enter a save path + Будь-ласка, введіть шлях збереження + + + Save path creation error + Помилка при створенні шляху збереження + + + Could not create the save path + Неможливо створити шлях збереження + + + Invalid file selection + Невірно вибрано файл + + + You must select at least one file in the torrent + Ви маєте вибрати хоча б один файл в торренті + + + File name + Ім'я файлу + + + Size + Розмір + + + Progress + Прогрес + + + Priority + Пріоритет + + + Unknown + Невідомо + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + + + + diff --git a/src/lang/qbittorrent_zh.qm b/src/lang/qbittorrent_zh.qm new file mode 100644 index 0000000000000000000000000000000000000000..0e44d2cf0af0c6b9719ad8e9f879fe8e250fcfa3 GIT binary patch literal 51126 zcmeIb34ByVwm)7Z-JR}ErxU`C2-nCGFdM57A_7TRG;~%rSv#GZq@~jxdPxW>i-Lkd zzzxt*XWT&?b;dX9=&0j5tJ^p_&YR7R8Fd_e4}JR7r~JOB>fYP;-oD-7y!Ze7f1ls) zCm&Otbk(U-Ri{p!bLyN^Rgbg{|K-OwUH`%vqn=!U>*If#&)A?x7-J}}`x|5S*^J%# z6O{Fg?W;t217qV>GnP}$Sn*Hs|0Sq*6JuxL`^x)8x$EVAllZ;zMNzJNkY&F^c>a{x?&?E7waoUCjj_5s zX8Zkq#!g$wY#+bDSp61JUbs$_H($@}i>3q5cSSjCyeQ?lqTG4DD0hEfl!u-cSQfw>&YrqaCi+{~s?**lQU;N_ES z#>g-Q}^>4&XCx z23vboGh=5iWgV+_GdAq+Y|}Q-^0o$c@PLi6As4YjvoX)Z2C>_Ay~Nnc*V&PaMgys* z*n@WgpZfFIkADX|ztg}TFMf`(1HWcZ2hU?{RggWq66NFq_KU+GFm~Z6_SVJOjLo`C zlt&}%t*7c3t9XTd@aTn%6&++B-h=sUYiD0RS;^SV|6hpm-tGZ+luW_8Upe6JeZ7orXd3X)`GYZEQBhtoSCmKZAMkL#kFm?n81Uma zurF#B4|ws_d5kUEI^dNLKg2p58SvVMOEFKk4S2m4-`~_S;O&VwFy{aDfcNiiVeF25 z15R87{PPEAIX4c$yxf@OnYx9su~%meEe77VkIowB`z`p*zh_n5SH{>hIqTdhqrtCQ zv(9~f5@QcKvlboy2k3rr)&*hUH|ak_Sve)Er+6u2_r9Ffn>!uzH9(XQ%7Vy^8v~!&t<*V2ELPjJnMJIrh#YOoAp-Pa?Iz?vc7l@>+QKA+qUdo?1O8v z-S>^ddS0KM8^QNuzsNqzwvVxM24zoPb}wVW@uIwOPWFrl#y{}S+2^dT#yZ_0$|J4W z=f1EQ`(TRZNL4GDBrVPu@v)s%Zs)>_qQ^Z8?qf*{1cp4pNldii?Xjyl-q9> z<-u*Xn;y1-zBh^TNR{oj!&fqPZZpbzP+noX?cOCius=2nKdp~1r?gZPt zC3j+dW{Yy!A4R!ifhdps&h~`ci~YIT_EW!)v9r&!J=+KR*!8mQ`QX!x?Tm@?o;|h~ zpZ^H^r_%Ov9OFCfA=~S_|An!Uhiz}{!1{S=ZGSI!V?MmLe|xHou{9srhtyUwcBs-m z{lGWitJm1))!l~uSYWSlVP2&1_60A2uGe2`KmP~MV&0F6@`^0`vTMQj8eF2h@B>la z>aoiewb<7$*h3#qWo$(N<(G_={i{9vDCTqDYxa%T9ARwqo%X)SF9H8C`_`*LKer#Z zU$#xg{yEdWbNCmS|Kavs=dS@h_S<*SI`uBH@1gT|#jotwEXMdF%kAIUb%?RruSL1y zV^LmyNR)T)7v<5#_ItCzhp*pg|KU&3@A++_+|ez{BVXH}YkLrU`#W_DTuS|2qX8i)^%pphb8TWv0e&^Wy48}R(D#t~RZ19C^9T#uH`Mr3VW7jt9+v}z~ z_Wky3#)kjIamRwEu|8ioepvqm#?j+=ycGN@xX$t1;}>EdeCYU9PZRiRspHpkK__QD z>UeR)RLs*F$1Cml`|^XLT%F^1kMx5dJvg1HGdUOiZ{C(O^WJrgEf|v%Jm(w8H>c$U z=b?RBX->5NQS=|mi4|_fc{M_mxBWdQF?0)KUBAmoOzD6eS(ejt81sMEw4B~o_kw?) zpVRve%E_$ocy43pmH#aJuh5hV!M%Iq=g);PGeY>BE8F z)o(jXK8fJGc+fe2To`g%hjadsI;`U{QQq{jvwACyf0(m|@2}6C=Rb&cu|GKL!-Fus z>zqw_kT3JrIh&sR1p98Uv#$blHT^+n-zPE9`8?<55ocn)zeb61b#*!~j*r24_^@+N z9OIat?L07g56=JBoVVSEa^+O#k@qjaya$~3KlC7Dxyt{;3p`JEO}h>IWa|%IRW+E8EpuFR2ce&J zkGtlsMgI$VWH#s?9j(hr70&K!4x= zj_Zoqn78QjuKV8lCD!>`*JJlS!*)tE-)CIldgfoyes!noH=#j{mHgTD`Znx~ zvg=&0e-Gt~V%NX6{TXs-!1a+0`)f(9D0jXk%6pExj<=1&`E{M^n^(7h9!I#@Hpny8 zA-DanpJSYHxA&7xjQ!vV_s}Wt0^jxS;-8g4{$JvrdIsoXZNyzW9OEr~)V<;lcATrP zyH|e~{q_CKE#D>Md_LrE|25`yQJ+LHUw+IunYGjo6Z{)3>ig4`!YodbIKN$#_UvLTOr zl>7XOO-&Z`f4OrjpUwIZ@gZ(+;a#8O3%G0zA^U(IL zC_~dldDqW97i_?IcMbGx+==>IKJdhrPr`Y<9pyXNumAA$to$wXt*yCNu_s_*T5Ai(QbvAfJYQG554vp5%f1);AZ|tf+ zgC4%l8@KlvoKp{ra$A1hjMu)wdY+cIsQgRFN1O6i-8U9|p(t-{H_}kLF&;fiu??~Py*Tryd{XXw9*B!w7Xx^ShuR+h9lXuhGn2+h-tI)04^>60=Zp;?oxhC(8LdaJ)-Xh8eZp!=ea%0SZVLY4O@{S&JAKK-4XA}c(e~)+JclN?waf@52_L#5@h_7UjG@dY3*m8teF#_ksx4ablTwef1OI&(pnqf18T)^SF2W zn_qygKK1Up9OvKs0p4o@gCXDC?!C@&3FzSg?~REIF~4_t?>-Ohx7^@;aNdJh*Vnxd z9$gFj#k1bWW@A2g2fV*N@iq2&!h7sDgFsJ5y#M$N@=I*B_jm~P&cE4vLdN&=FU`-t z>RsrKq5NT<81|JTf0!3#>1FwR{p9xi@h`VQ{#%wm;V|L7Ab-}OPjT**<=3pnx|Fo$ zFZ==a?V%6zSNs8Z73St|U2y{E&r^S!^bozBbOLcR1Np`Ir-bW)A%Cu9#Y0F}-~9teMku@T+rPYa|h` z33UuWL&qDeik-n~SUsy|Eo>!gV6{wQi|}~~tHY-TwiKqpI<^?!ORR{MvU2=e&Zgpb z`c#9OHHH?`SQ)F}-_}X~%jjPj{-27U5f)_~_D2VOeJ;^{_h2T zK@PbTHM)UG0Ie(WO*b%+G0t9;e*88Yf4c;Dm!qEAAC03N5R#*61*UDlLDJPCd?nVd zjG+{tXuLsS(TAQUV0C16A^x_EB~Y&!pTcN8f%lkf6+?^79JiUkCT{w+7vBW2N;Gek zd`&7$HIi6Y0zR#27kUbzmRP553!JG2t$h$JN&z{7o-485-B=l#599YVcA}yP{+_-T zty4S4G94VEBXuOnI;EhEIIw61&JnEA27D&G+5nHJf_fyJ)KyRYR$xt|osX6R(RFLq**LWp*Vw-EMm^g>*Q z_I`qomBvD&4Wky{CBE5*68K*500DgtYFDAP#PKA`raovFrgGDbn2i*=)A*~{h5yr7 z3*JdPCJM~Y=w-o2b9QF9iK2UW= zO?`FC%7$8LQOlA#sbT5-y2aH}QE7Sk@~PG3IaOV9+%JXw zUGh0a8&Rh-E^mq#Nr6Z>E{Egi6iqIY%I8$Y;(Z}miuZM+7F8$@#9{!{T_S~o(nV5l zXD}|8#=89hxl-zm%B8(gfA?(Z5_c6kM$0)><)X9JNL!!8|8!1~)Q&z%+x=a^P+#SQ z8u>#1vV_#^5633V7GK4Jo8`)x-ErmDUOCv&8LymHQK5cMpew_XXqP`Un}*e`f$s80 zJA&cTc%-|sqI=V9N%_4s5|2l^41WsA?Qz2&qP!R0s&r$#v^5k7Y$y$e+b|oI=$S^Z z{R+@UbLL6&g8&#5(#Yx z#-*zA?*HHL_J`ZBdaVlPrBQz@E=ODa(K4y3HA;)le^y7j`}mYdPam05Q8A+wKW0hQ zozY+nv)d_4HHj{Hv%WPM&>`lkDfR#|4n?AsXI4~9Kif|o>b8jqs)9gOxnCJL zElpK95iC(JZ5Wd%dIJBcTb7+x)j1Un=WI;U0vc1xspfVNXl;!#-(Ib)or||7=%_V{ zYJrh%v^t)()&qHKN!M{IBwPLJZFa4NV_qWO8HuJ=b0o&d$5^FS(KSC9jd!;B`zlR! z4MQ(56N9NTM&elZ^{R(-fSuKmL^vKzfs3l{#Pn4S`|tC8rmLP)TiWFhhRj&dM222l z_O*tuV?op(4#*b$i-St5=;nmiO@wDrx&M*okNcm}D(BP%19CWK1$O1DEqOXT?LM$k zD~Q|bd?R)Ba_a+uM7P)vsr`HVZ@uVXN2PC&Z{(`>#25{a)0*Q6;zGnx0+Fun1h%Ub z3xMBP4cX=&v!_UF>uTxrhd0E)cT)SaZT+hM6|H7&3+6Bu;>elm8diNsfLOp>(=N)? zVz6%Wwei+va>CSr2*8)S?~(%zO*3>8mR}R;4TmCrVpv_lIG^GX^TEJ+gKhE7c_Hv< zj&M!TABsRrG+=5!KRCZUMjd5pg0CI&o7As16|SXW-kscb3XR=9cfDjnJ8xX14b5{*hYkoP}~&j`~A{vAO0b zYfcilyJ<%AziAK#={O0A0o0cjG&egR!rOd^H8HJia;m*Gb#*u)YUGgI;g8FtxI?oq zmfvI(wc3tiUnDF~B;XEp2UqX<;7ROAV0A0l~a^{&0sJlX`=pkkl$m{_buZ(QT5yowkpDtihNRm1A*#G%mN5 znUV4||GM$3){b3uU9+1GYh4YS7obB8;!0F%izHehBS8QNY%sU>Mt<5gn^tw-&%*C6 z>(ts0q4qtPA1to4AQ%El!ElGU^svG31;J2e=C=e4)X0pLuF z6~-qZ#0f<|rz2@oH4WR<>C5v~Zr&_^wx2bAd5~=i_urubs+t$uz()c&?Li1td}tV* zya|#@Z>Jo_7`1H}10RY>;YeJPySn3jW}Iy|?$NPOFP%7GT|u!;&6US)|DfqGVYs19 zzQXs}%2~eBo*i7jNorKdQ|W8~ix74Je<;+K#7PlkVkCgZ6h0a61d{EM5JV2nH1u;a zIODPEP9EfDbVph>WKz?2w~1f!8~7fp01xFK~Lm!WquZIH@I>Q)3j z#{_On;@B<3H-w*j!o?(Qyr)-(WIvdF1jm(7JBk;ENlvuv#nTwO{vS;h(TCO#=*-t( z_$jAHZE$DKp+lYdzS8zNeU(r_{7jO>IF&~=;yL&0D{7YB^ z?Xq@hwM|1#h3A{sQrfVjfp0k||J~gd$EugZYl3~bSuPI@&|nlQI5jmlOR+>Z?OOBt z4(3gl0*SB%62lb$OB=$OF(@Q3G|6$Ln_Juo|eeYp3p@UUjD6 z=I(iA_w!<3YGck{z{LZp*B=jbT9AotU8PPZa4d*K141Ftvr6~+*{dF3JKmr^j93_o zw1TQzRXs%<7#3Z4*U#=?D<{xtBjY|nLv5S_q07H1*p=v#!ila{P(q|#FY2WX(n;qJ z{v}li+oG112J_4psMVMxuSUjWqSQ2jLRB} zkEP5kIu>w@=Mamfz#MLZsmi7)AR*f;s6l;90W-`5Cc*W|RK!MZc*!@Z|F#46@P7G< z&2P%xJs%OQhAQ1K$EvWBR0LHg7zjZ*>IPM{F~>&r0n?OotQ;MdD%%>3Z>Yu+{m^LsR6$f+fK)3<{gmii$-z zW#|qshuhVM`+MV7n@_E)54aS&OXh*5-B0#DsF|yP;kQvB12E z9IKw+G(fkIt_FWBhGRE%wZ`K>3PIqe`<)>4d3D^bO*OP_aHA z^1h{6H5@k1MM%K-h43_nonq1zMJPZ4GuHykj?hq-9hF2hnENUiHms@PgL z_6E|p%q!wa*3_+wgV#+NfddW#5HU26*^n#D0Ede@UAxvt`d(Po&~&!^!1bRVxK0QB zG?GSWi;|I|9m-@UW*GuOk6)NYjU1BqXgE_nT$)L9pxO@X>qxR*M-vXLNS7JM@#~sN zP1*NEQ-%Cl-&Y6PR_$pm$e^ZAX_C7j$6;N>t^Cj3_`GXi;-# zq?dG$V7p>Cfh+-%hkb{uSr)3TlK`z=yMBTOB%cGpn8D-Y!Bna*X;|1WhW*IMfIJ9b%D}^%m|jMw8uA1{!B1)-EQ@?z$li^?oPxcnv$)@leC%JAI)QPO6i&H=mrRzZD2y1l;u#wycge!zZo{*w6Q>2FX zNT?{v#-am&bi*z=7K8kj!jif4mIOiPNmE5*kMDI7&Q{&ldbS31k`buxFd=e_${mT2 zKMLtWj;3@n)@U*noq)#4uYo*e$de&ywjP(UBdk5_@2P!Q4n!5IiH&Om8J`h;FEqRu zadz_pDOz~T9xFQ`4Y0-IV+J|6m^uPym14Mv63VZ-9Ap4VS`y7&c~pWi@UUS3N2j@> zc&0Txa&j}=gt@3CITfT(lY95`yMI9jN*(3pEepmH(3H5jFQtWtG~~7y>Q@^G+QAj$ z6rvv7^;OgNjLb|fe{|o8Rpy8^EeVPtQl4IVorJAQ;zieIjnR zbcR?f2u@#K^Q^0v=vWnQq9NAMwHI!n0>Z*%)smZXO>?BP|MH3AbZyyq)qgd9X<86h z?Itp9WLOpl4Yegtn?)Bb9rx@?w<4L0Z+el{5=Sw(uJij}(|YtO1~_m_x}Zwety47B z&8ky06dHhKZFA7bJrqW<9A4K{SpU^ht4pi92 zte|+3Fmz*dsTv$V;H=uYo1_D6CYs69v?#h9PB)_-i07BIzv1C_S1L;&`NSbKuIWu)m^*^CA;%A;&3O_EB}mRrP^ zb<)aQKcfF*4f(;w4JpadsPOwr14qGus9%GTr|eDgPY_a2n#M)@uEicL$ImYbiTbUA z9DRA)zTS0Ia5N3*6cuP7k_drGfuF)RL*^_FOsfqRDbgsz(&F-Zfi*vk{>h%fIZo1Z zkh79+-*bT&BaMz$Uf0iPb%bJ2xL&|@wnhh;Mw5gor-Lcb{T48Zu4N-#3+{P}bj>l* z=5V0WHaVUQ+rlHiDK8S!q&u7jEe^wU1$#j|KMJ*DD$NQz;R9rJopJl*UL9vk*N!|~ zh;?YV53g6af?}W4JY6yj!Q21&epl=JDT5f>09OTQT!GFAxf=*KYHk4)vWX@RrNM4= z|L1|6RX5VMHL5HmHtT5VOr;;(um^(eedvfzSXF)DbC-#rJcPU|3uzNEtQo#pfwyrx)FMad~_uDFME`_Hvw#i(rwZ z5IC8eI2PgxfC84g@Us+_@mJATi~tjZ{uhTm){J%w!FCiE3%{ca_N?X5Yu%t8g9R#w(x{FyfC1L zQ>S4v{41BUhl@5TE;=A;)nhGP>&(82I3%mgFq}PP40i{uctt&g$&n7Kc zn^4GsaTtHZWu7o+ST{V0@@(B`Ft)=4PKOh?fpO1<*K`y)3N+Y>lUci@P^EjE4xHGt z7cO1QsoTcJw~W_t&K~dMCI)#@4=f!)+x5CVv*2tkts53&qcxO#9iQ z+7x58DQT)rHCCINrrI=PwP}WGGmVFjFe)&q@ypl)#$5*m%-#ImWpDD3uyHJjV#Pe2 zq$Wk+-A>+XWO|G%_Uv(!%iK~EPD=^_8D|{LcAP=>yXqIjBPk~Vu>_i+~f)H{{SBse!SZ3maIQ4lnLL9Lg)N)pkS;{t6;R@1ci3N4X*q!#h{^XbQQ-YO58-DQWLlG zaUV4PXWR@y#*M<+fa@Yw_|fIs|M&Q5WKY*xC&zEBI)5}<>J0iy)6Cm~e`?-vA{b`P zI70>u)H(W}$G|WzMhv{5pj&otC;w>!m5fe1T3m(2jWEU%6@tVi__3AZr=@LA+p(kc zkk6G$OZ8sshK{93T6UpwT#=hPF3aKxVPw&0?qqFXJxpmcUYzt>8<)=oDgmX-^Oe)tSTL*NIKOGpe*c!QDedT{?s_ckH0&IQ_>II82( z&{+!%qc0Rrix6($&39sUW9-B^TK$1^Bc(X=NvrA?ELdY`TB2`?1z82rWeo+!3m*mi zWhrXFTug)2fQ~i-^{pupF22&znuhXmM#er^>4Ac2Nhp%GyxRR^4N@K;(KJ92hB$6O zZ4}KdS&S8?i>4NV7lpVC;QqH9iWcyqt@3b!k`aQZrY=oeI9yTdRX8~{ga_8BkpSve zF(94E*Hpu)fSd}&T9J#LZnfaWsk#>?7i~d(Q*~{PaoxO05QgQ32WBdOlvUTYUdMFZ z53_9TGj?qw?xW2I446WMG)#kq&^jzwh7j4sVMK40*C*mAg!D>TFO0IRHcy3m&sjm5 zTE8Q#9A`n`CS-@|LC}=5RgE#WMgvo12`2r18HqF*IyYR)EjL8jkrb|ggnDqV8J#l9q(P_ayWz)OBi^?zEm!ekSY>V-qQ)C;#J-23)G21(jwLVZR&2XobMg}Pv@p80fy zU(g`0NNzYY5v6lv(uU|3VGITy>EgF>#90hG!)EXTcL)a^LyZ~4b4UUb5lhUi${u}> zfjL{An1=KCJTf9^#|@Wn^zlk%ZvCms?Z>Lwn9ghc5okq^cx#y!^6IQ#?(K z2OX~Ym(Qg|H(0O>mqsDjtA~wdzt(7Os5L2QoGn*(8ET-fG{KPKc-ESGb{ z%PXsH)TEgf2vufjW~{zLY!#$jg3Ac3@N~&mDYaCm$TSW%e(TVES8J1HA79%R3`P-wtbgLNKQQtzuD z-nd9>G_XbvkR(jbRKW=DuDI{18ATiEUs@XnnXKZLv*`@Y^wkL%9O=_EzEv|rj(XVun5`jpnj zR*Q&Jt7^^_w={jvIAMz+>79JS=t4o|Ed4 z^RiYK-rJ}v%?t6nK=aC;%wO4D-+5@q?w=dBmIofrJwb6dVvSPkoh|1Xc&w*Mrag{p zh1P`SmhkjHvFb+RW`_8dLd54JSu>B6x0(VkHHOL0++Am?6N-2{lv~sBbk08~NC1YiQ?Qr&jfxRL{8Hyl%SnHr@Z)mk`i;(h$MpHojq!__%>%LCN zTIHO@9mu$&m}#x+Q|Lyrz7n>P0se--+L>B?hmYs;Nn71kg7i}VFa6*D$?5-2p73un z(sup7lz;!dlz*8L!X=X|8q+Aw;OWvtf<%KV3t`rn0*#WurBB_Kgr7`BSBX1HN`FZS z<^oC*#$w94vF{JN>bNL9(bUJcNU4@p`hQ_cwUk_HlPmtWPo`!}?Zq?1DS6*!An#kz z9OXoeB@>1ja)I#%!i_wLOT}OSO^QWkmQtRXg%lc9+L);2{IbgQMR8hOdGW5yYnnka z7S!h^R;Qg*d6XKB$7HEet=1&1fUeaj-0WGmJdF#Y;uO z*8ZvdKoZ8%?l!281{hANVURA}q80@}8ftpfng-pVAX!_)5*pfA-*7vC9^AduJ8-K@ zZhe(e>IEw|-SKNxm}I|msLx=WJ14F2EqSF1B?)>hX`Hy87yjOq112W!()4|fOzm?+ zo2kdyC+`t952eGC^!Gn}eWxFalM?ljWk{m~C#6n84nv97%1~84)-lFV)lmb2Nv+5k z#>!bH$5N5>KyxhBL-vsSnd&&DAu`BEzQjg9DKk!P!8{CIdAXyW>WVI+dvr8)QhuYy z%vnER**6AvzJaPcA5e>fqjht;fxeC6yeF8N&I9o@v-6&a1<*VZ^)L$iKPUg{{$myl zWs(^VxEKeLbOa>6L43+EU4|TWqZA;NVHJ9KGzMo;&S>a@)X<1tB=u%KrV47JpG>&*CVGs-33W4zX>72(EG)aGlkR&*F!ksAu5KS z9=Pr_`ade)A*ma`bTVLn0o!prA?6b$t3tIFKuDhDo<^a!>N8w3hdyu?iFs2cKv z#XuENL$JPaQzVsUm4Fi$un;81@o>^9bn!(^XKC!g3yT(JFfMn%Y$@)pU|FHK>uT+f z;t**%97#5_&qK5?A7`4{zV?fgK9lzOlopI;B~9({%+_Q$mVF_JI8*J!^mQAx0XUXK zU^mND{op6Q2Cce%Ng@^uWI$!vH_?S!ZD#|rFRMA=(%`-?qVu|UHb>gyy?zmJVBNr( zn7;e@OE2yDDA`NPGAV|b@eG3)Oc!syQqAMa81;2Vif2_@f-({!@{?9lp#_gv*IFJ< z&)3vLHg-kI9Q zMzXoqp^YSRS`v$jO&2!hXce=o6a1V=tp{&)8V9n*%8+}uf%M9CJk?vNpYCs`0wVZ8{vl`#rIY2|N)0a_f8skriH z2KSReN;AFdrgfKYLR5a!Ff${y(PB%6aju0anw*c^8irUJjp{P#1>#a+m-QsT*eAGI&)>JF~LWyh`gp0XJN*h; zu%^msJbz8KChgu%F{3@@Bmh>t;U!pjm~Rq%K9gxkCXgYTa$TwM_oTWbbXzKh ze8F=Hk&nehF6|6zQDXEFg&HJIqsDWMRKmdxov!+#|4*9_YRfWQZOjA1IiG^lyK+02 z7IFpUSN0u)pF2)M>r2<39qWGQKbNvAlT5Gm*RojZYX(ClhMCw7DHA3*=-odY9dE_|qGs}7(1wIRQ?4pDS37EF>(vF+z*RTHsk8fG} zN(5f6{|;f+|GCfGI&fRd#b4>9p%#S$!Sf}Kq*zGhAR)04#n_n;S5ieAP@#MQ5vq(t zWxZi3q~!79LX-}}Z!1ITnx>0YE&z2X_90z5VH=TvHu>405TbeOx+8tZ=)#U%D5+Ib z1zBl?l&V1(3kZ5ElJMEUzjed00oS3;Yxi+8Q!)7ucDP#SHooLt@KFI~rs77N5gQZ9;& z$a_gdCSUN)o3H;=w{;2@L}hsOz|R{_GW6I)`lYnK;IgKW^cP&#_0wN)S=Uc{!DU(9 zO8OizfR_<2X)3Q19ijzBP`XKXDuDQ^Sz&Rqye^h)C=Vv3Y}4ju z@O&)+CN{m2sh_aTYgNBk*CyU}LrUsQ2_r2Uj8K60;45k4*p%YwUAdu@bM#c;I;9TwA*-#+7!^Ln zR;potUH%Rv^@S0BF+Z@)m}}F`Br+X|%p>r4D_-~a{bO|J$!Q!m3DtN4r%WnthZ@9X z>@JZg+zfYcaz@ByiPFpIFg=|^qX_CK&nZWdcbfZ>C7uOIcqUi_&9E%nFT+)%dP%8& zG3p$^r8mCXP|hJc62FpEYl^q8f^5#RHv{XI*KgVzUAXIL-*!CcKv$LcyEgaLRdiDY z4`e(~bIt@vb`$1|n_N{+f5aO&!8tTm><&^+lvsE?pc74W<7J^BQZ2`-%7gq_8S^|| z@ZZCG*U|NdA*5>$74XL>%(&N_3hvnF^k#*EJeLNMB^FU1(45mDU(h;t%kRlYQGT=K zg|*k|2w;*HKtcvUgpR_N;1Bn4?Ess(1Cdmazo0@2w`}vQX#0)!8T7c4{?9L3yl$sS zpOaJ>h~#gg63xEZ>kq1lSInSi65*>`LGBJv{(N0>H{lFQDlaQ(ylTT4oj>h3X6p9b z1B5*oQd*B+r90mWssgbVH8!x{&EhZx)8XuH|$i`a*$k zAbbv+-tweglipxwru3mw5>Z(t-*zM#n5VO-b&D^rse&#(c-}4^bw-}l%GBwDQOn6? zJVqBz^oT?Pc^F|$$8WTgv~V*eJ0X^j$D*41b5n>Ga{uCi8*O{oCre9$^9j2_F9 z72#K>YkJXa3f{C;LbSA|Ig_W%l;EwMv9TLXQ~I283Vlvt)A2}TN}p4v&p2tH9(bQq zuUzWV&~;3ma?+M=ys4Uk?X*+Cb~>LUbC)^OC!f4e4~9v-ny{TQ?WEW`Nq8fg)W+zX zClZ$NyN9$3%2Sjl1q-{G1l2@2NaYC>xz3LbbKMv5iA&Zj}zt;I@|E34uVtFr!-(_gYyXP{=_pHY5R9j zszlw4xZsP+lO<*zwU?Hw#Y=*F!v%fG8;()JO_|sx7cThgSe)DxZ~wH23^gYCBKY*Y zi?-2*s5Syl4s;9Df)`#ga>AiJtioW(Fzj6oBo|Fi4NF=YIyz_*TG0JSN+(LAk10Fv z6v=<6LgaS>ax{HI#WM#*HNPiN;eYP zG}rLy1wH8xRJy?ribP9g(qcG-s|1)qS+&5=i##+?tm&?b>{42v195L1q)=9FnZoq( zOEn7sL;F9c#$@ByuY(2%iRgI@hvNRAX2eyUA1ojub&?8^XSSi2q;zangRFXa2*{*0 zDEw6kM6m!}K=*Q6e&6_I%6P{Z&7t%M)2+8DlMi! z#9|qkhK7@tR$I?2EMOF+G9IBRXlV_S+ES^?*HoBXZ%c&rvN;Ywk<@@kzgl!SoK%3+ zPIY|!47D3F2?*9<4DjXr-U75&zteO8^Hfepo|fqvrxhsjRSVPtxa0wVFr1RAsZF+1 z)uU;pE$ff+y(s)Ysh#oo(4|y9O@)I4gKL|LA0T?=m)e$~J$ld@N`)FI?ny|pRa)dc z9g}F|n;cZVV0GviXEO{K;-cEJ|3ZG3`CRkI9WEa;!5D(DaM&zxdr6RB!h(fRM2TC1 z0@K|7$?Aa`o8#WcI*xz3fg9l!J`fu&Oa*wZt674zT~+Gq)@H^rKY@^U&bM>brG)^% zmvt~XS3n6e7!b9V1>F5vu@_<>{L#x47^!)yb870ee829G%FNJwJ?(3i~+-KYzN zOsRRwv5+Y(Gw0Awtxnl2xUpyEsxP$Z%3DAWN5O!}4LC%7DGg6Gx-q3;nj~Q<^|<%7 zng~#LDh%V^*LsF6#A-_{ZD~RuQ+hjv*u<1JHbZbH5`ZUzU{mX+PZpk1H+^Qbl&WbR zwNq+lPM-#E5G{>3=Qb(rzg1Xen%1Wj&6v_Qjn_tMy)eE#b^3fZ{RQEzjdJH99`RT-1mID z_H@hQ*WC~$6pv)71J`l1%7%4<=QW>A3BK4cn^yTHZi8)KQ}Adj2VOo#0HNtwh=&%k&_q1Qkd^HsBbH5<*_G!X{<#YmSr9&NozY z@Ke)aV9fgr`R^1aAWfHi0+L-$KIJZzfu|p15rL*Tg%QHE)C%iJcDrC6vbEC7R{Y6V zb^hq0C>=hAD{Q{4Gp+t`au*UQ1!BzrIxaflsy;m4M3yD9{wAm40purEW>y&E=WVH1TN!g4e zbp)z1!ISOCp+rb4C*tRn)%o&gD5o~*AM0|Bo7^^TO6Rz#{P{{-7v2)*B7Xt3Q(8(fGn{2A%hO3Qas%5K^4Al%4jRE}nSHa2fP4+@@HEj8va&2t+ zopK*-`CW?vCe9MgchalGA;7N}?^R9Y(H^?c1O*yeIOtZdDQVgrR;@mCK=*mL#iBHd zN<2@lxG;&WL+XDq<=k2vWZjgC-*A01Tm=IQI&SAhB7VBcAp%Z;BVI4SyWKq>=^QSH zC@^BgwlX8)5N`o!8z%>MhcMy^o!pGIlQLx*uyu>vm@0nxf<&9aHUqLMu{w#bb;!Dy z@w^5upi41ckMB&YhF*17P-C5bW;!ti6v0}oz&Od)O9?QwK|0CGt6JqOaZYRE%~3qN z`6}|)+{sy7gG_JI;3yE@-!w2oeVd_fj*^TjrJC}R1XVV@Br#BFq6m1(?W3WO@xI)q zVYEh+$&@>?Q%;~(C~l~OvspaHMi}loYQXUf<)G|^2lSSe>hNy!l zUgfu-mdFwyLky6!ntUS=)^AyTU31ft`jP#A(xxQ8IwAb+Vt7VM*%D@q2U9B;C-lxG zNztT0g`jwpSav)q;M!lf;ud4vNd3r+kt3Db)e1yT^4O!yx~CpCVjhKe&2hRE5=>$F za%~2*G=h+Ag$u0J%uV922$Ya0PE6lusv)08()NgR=)}RP{PmC$E)oke2W8`Ypa>Pd zw1Qt?bSA$;6EUAO)Wtm1)c5*`u~Oi@)zHQYPjO|Dbrz_`ono>Og_d0IGZ%0s#{;-< z$Hesk_;zxiO^_XxmK0zaHDgA6?u~D-${XMC?WMRDGT5^+`bjwjNYq|Gq31taJn9Ov zl5HMx1Qp-xyR6>VlXM{Hr_6Je2n+6@oB|XFhkXUl?vR%LvP|L*IWex?fdAmhREmS6 z7=48fq+WQ7DtnL;REXI5UP6ks9(TR~nTcKM! zT)U1Mu0+QxN%Jbj%|3JuLQ1`F!+8AgY8BQ_GhnB0_U`S5sAv}@A%$kt&R-xg*SDn& zPBPb=OEp;~{p5>SLPHSC#7e}WuzWdvc+7Z85((*gJ-fvqJFA;W@MFzH!tdO;hkmBRWoZ8~wciZc zU(_y$C8W##Vjj~!as7A_5ESUBEp~p3I5HvM@GwU!YB#w-w)}ke)`lwGL~0R^$XOtQ zI8TCsf#(lWF(9^&1CpZDt+3$F4zHgrU&<6?aV=m$%oX{phT{oo2O{BDV8zDW3y9V5IkLpY>bKEY$4Xs1EZA2 zgWL1Wkcooyl5N7(Y)ol%{H?(R5 zjmnYkZgG-ZRIY(MxL@S= zMhZs+GvhwhkZ6RdUVS)6;ho6!AVcA3mHEXaH#w+2;hbP|6xVFAR_T1W47E=6^+H3V zf5Pd@(B78LA1&1g@{q#;thH7ay zuAx?DXC-8qBG-50TaSkJ-y(UspT-ErSU2K(`)+Y!;u|TmA`e*r}Evp>uBq5wj}L7L#oAFqa|px}E0 zt${cRiK}+X$vCIsCJ=F?TZ8^A@?WKaGMH2v$_ax6DDT7_Laot;HH-)2at#&%-jNU` zriey1@x)tc0YYKynAEzZsp5naAzT$~+KJ?o2*b%(!N*5haXWu^q+;RkJ-sw&Q3Ot~;LQnoELW&pBq*f=!(Dx~H_Np#8lU1y)40Hww;`|z`3C6dXpC)Z z(VCxzS1A-zm=@PVj>GN9S&{)8C#8!rXiRzPRgL!YO&VOdY(e278V+8PE$EOE@gEtw zMfkq)I3%UA#oH9DUrG01x|NdXpzaZ5n!wSd{PL3sHwNv(ZhJODS41p&n literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_zh.ts b/src/lang/qbittorrent_zh.ts new file mode 100644 index 000000000..f6c2cc83b --- /dev/null +++ b/src/lang/qbittorrent_zh.ts @@ -0,0 +1,5101 @@ + + + + + AboutDlg + + About qBittorrent + 关于 qBittorrent + + + About + 关于 + + + Author + 作者 + + + qBitorrent Author + qBittorrent 作者 + + + Name: + 姓名: + + + Country: + 国家: + + + E-mail: + 电子邮件: + + + Home page: + 主页: + + + Christophe Dumez + + + + France + 法国 + + + Thanks To + 感谢 + + + Translation + 翻译 + + + License + 许可证 + + + <h3><b>qBittorrent</b></h3> + + + + A bittorrent client using Qt4 and libtorrent, programmed in +C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> +<i>http://qbittorrent.sourceforge.net</i><br> + bittorrent的用户使用由C++语言编写的Qt4和libtorrent. + +Copyright © 2006 by Christophe Dumez +主页:http://qbittorrent.sourceforge.net + + + qBittorrent Author + qBittorrent 作者 + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + 生日: + + + Occupation: + 职业: + + + 03/05/1985 + 1985年5月3日 + + + Student in computer science + 计算机专业学生 + + + Thanks to + 感谢 + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + bittorrent的用户使用由C++语言编写的Qt4和libtorrent<br> +<br> +Copyright © 2006 Christophe Dumez<br> +<br> <u>主页:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bittorrent的用户使用C++,以Qt4工具包为基础编写</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">主页:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + 上传限制: + + + Download limit: + 下载限制: + + + Unlimited + Unlimited (bandwidth) + 无限制 + + + KiB/s + + + + + ConsoleDlg + + qBittorrent console + qBittorrent控制台 + + + General + 普通 + + + Blocked IPs + 被阻止IP + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + 选项 -- qBittorrent + + + Options + 选项 + + + Main + 常规 + + + Save Path: + 保存到: + + + Download Limit: + 下载限制: + + + Upload Limit: + 上传限制: + + + Max Connects: + 最大连接数: + + + Port range: + 端口列: + + + ... + ... + + + Disable + 禁用 + + + connections + 连接 + + + to + + + + Proxy + 代理服务器 + + + Proxy Settings + 代理服务器设置 + + + Server IP: + 服务器IP: + + + Port: + 端口: + + + Proxy server requires authentication + 此代理服务器需要身份验证 + + + Authentication + 验证 + + + User Name: + 用户名: + + + Password: + 密码: + + + Enable connection through a proxy server + 可使用代理服务器连接 + + + Language + 语言 + + + Please choose your preferred language in the following +list: + 请选择所需语言: + + + OK + 确认 + + + Cancel + 取消 + + + Language settings will take effect after restart. + 语言设置将在重新启动本软件后生效. + + + Scanned Dir: + 监视目录: + + + Enable directory scan (auto add torrent files +inside) + 可使用目录监视功能(自动添加torrent文件) + + + Connection Settings + 连接设置 + + + Share ratio: + 分享率: + + + 1 KB DL = + 1 KB 下载限 = + + + KB UP max. + KB 上传最大值. + + + Activate IP Filtering + 激活IP过滤器 + + + Filter Settings + 过滤器设置 + + + ipfilter.dat URL or PATH: + ipfilter.dat路径或网址: + + + Start IP + 起始IP + + + End IP + 截止IP + + + Origin + 来源 + + + Comment + 注释 + + + Apply + 应用 + + + IP Filter + IP过滤器 + + + Add Range + 添加IP列 + + + Remove Range + 删除IP列 + + + ipfilter.dat Path: + ipfilter.dat路径: + + + Clear finished downloads on exit + 退出时清空列表中已下载的文件 + + + Ask for confirmation on exit + 退出时显示提示对话框 + + + Go to systray when minimizing window + 最小化到系统状态栏 + + + Misc + 其他 + + + Localization + 地区 + + + Language: + 语言: + + + Behaviour + 属性 + + + OSD + OSD + + + Always display OSD + 总是显示OSD + + + Display OSD only if window is minimized or +iconified + 仅当窗口为最小化或为图标时显示OSD + + + Never display OSD + 从不显示OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB 下载 = + + + KiB UP max. + KiB上传最大值. + + + DHT (Trackerless): + DHT (分布式Tracker): + + + Disable DHT (Trackerless) support + 禁用DHT(分布式Tracker) + + + Automatically clear finished downloads + 下载结束后自动从列表中清除 + + + Preview program + 预览 + + + Audio/Video player: + 音频/视频播放器: + + + DHT configuration + DHT设置 + + + DHT port: + DHT端口: + + + <b>Note:</b> Changes will be applied after +qBittorrent is restarted. + 注意:变动会在重新运行qBittorrent之后生效. + + + <b>Translators note:</b> If qBittorrent is not +available in your language, <br/>and if you would like to translate it +in your mother tongue, <br/>please contact me +(chris@qbittorrent.org). + 注意: +如果qBittorrent不提供你所需要的语言支持,如果你有意向翻译qBittorrent,请与我联系(chris@qbittorrent.org). + + + 0.0.0.0 + 0.0.0.0 + + + Display a torrent addition dialog everytime I add a +torrent + 每当添加torrent文件时显示添加对话窗 + + + Default save path + 默认保存路径 + + + Systray Messages + 系统状态栏消息 + + + Always display systray messages + 总显示状态栏消息 + + + Display systray messages only when window is hidden + 窗口隐藏时才显示状态栏消息 + + + Never display systray messages + 从不显示状态栏消息 + + + Disable DHT (Trackerless) + 禁用DHT(分布式Tracker) + + + Disable Peer eXchange (PeX) + 禁用资源(PeX) + + + Go to systray when closing main window + 关闭主窗口时到系统状态栏 + + + Connection + 连接 + + + Peer eXchange (PeX) + 交换资源 + + + DHT (trackerless) + DHT (分布式Tracker) + + + Torrent addition + 添加Torrent + + + Main window + 主窗口 + + + Systray messages + 系统状态栏消息 + + + Directory scan + 监视目录 + + + Style (Look 'n Feel) + 外观(Look 'n +Feel) + + + Plastique style (KDE like) + Plastique 外观 (如KDE) + + + Cleanlooks style (GNOME like) + Cleanlooks 外观 (如GNOME) + + + + Motif style (default Qt style on Unix systems) + Motif 外观 (默认 Uinx 系统下 +Qt 外观) + + + CDE style (Common Desktop Environment like) + CDE 外观(如Common Desktop +Environment) + + + MacOS style (MacOSX only) + MacOS 外观 +(仅MacOSX) + + + Exit confirmation when the download list is not +empty + 下载列表不为空时确认退出 + + + Disable systray integration + 禁用状态栏通知区域 + + + WindowsXP style (Windows XP only) + WindowsXP 外观(仅Windows +XP) + + + Server IP or url: + 服务器 IP 或网址: + + + Proxy type: + 代理服务器类型: + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + 使用代理服务器的连接 + + + Use proxy for connections to trackers + 使用代理服务器连接到trackers + + + Use proxy for connections to regular peers + 使用代理服务器连接到其他下载客户 + + + Use proxy for connections to web seeds + 使用代理服务器连接到HTTP种子 + + + Use proxy for DHT messages + 使用DHT消息的代理服务器 + + + Encryption + 加密 + + + Encryption state: + 加密状态: + + + Enabled + 启用 + + + Forced + 强制 + + + Disabled + 禁用 + + + Preferences + 首选项 + + + General + 普通 + + + Network + 局域网 + + + User interface settings + 用户界面设置 + + + Visual style: + 视觉外观: + + + Cleanlooks style (Gnome like) + Cleanlooks 外观 (如Gnome) + + + Motif style (Unix like) + Motif 外观 (如Uinx) + + + Ask for confirmation on exit when download list is not +empty + 下载列表不为空时退出需确认 + + + Display current speed in title bar + 标题栏中显示当前速度 + + + System tray icon + 状态栏图标 + + + Disable system tray icon + 禁用状态栏图标 + + + Close to tray + i.e: The systray tray icon will still be visible when +closing the main window. + 关闭到状态栏 + + + Minimize to tray + 最小化到状态栏 + + + Show notification balloons in tray + 在状态栏显示通知消息 + + + Media player: + 媒体播放器: + + + Downloads + 下载 + + + Put downloads in this folder: + 下载到此文件夹: + + + Pre-allocate all files + 预分配所有文件 + + + When adding a torrent + 添加torrent时 + + + Display torrent content and some options + 显示torrent内容及选项 + + + Do not start download automatically + The torrent will be added to download list in pause +state + 不要开始自动下载 + + + Folder watching + qBittorrent will watch a directory and automatically +download torrents present in it + 监视文件夹 + + + Automatically download torrents present in this +folder: + 自动下载此文件夹中的torrent: + + + Listening port + 使用端口 + + + to + i.e: 1200 to 1300 + + + + Enable UPnP port mapping + 启用UPnP端口映射 + + + Enable NAT-PMP port mapping + 启用NAT-PMP端口映射 + + + Global bandwidth limiting + 总宽带限制 + + + Upload: + 上传: + + + Download: + 下载: + + + Bittorrent features + Bittorrent 功能 + + + Use the same port for DHT and Bittorrent + DHT和Bittorrent使用同一端口 + + + Type: + 类型: + + + (None) + (无) + + + Proxy: + 代理服务器: + + + Username: + 用户名: + + + Bittorrent + Bittorrent + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + 双击传输列表显示活动 + + + Download list: + 下载列表: + + + Seeding list: + 上传列表: + + + Download folder: + 下载文件夹: + + + Temp folder: + 临时文件夹: + + + Connections limit + 连接限度 + + + Global maximum number of connections: + 总最大连接数: + + + Maximum number of connections per torrent: + 每torrent最大连接数: + + + Maximum number of upload slots per torrent: + 每torrent上传位置最大值: + + + Additional Bittorrent features + 附加Bittorrent特征 + + + Enable DHT network (decentralized) + 启用DHT网络(分散) + + + Enable Peer eXchange (PeX) + 启用资源(PeX) + + + Enable Local Peer Discovery + 启用本地资源搜索 + + + Encryption: + 加密: + + + Share ratio settings + 共享率设置 + + + Desired ratio: + 期望比率: + + + Filter file path: + 过滤文件路径: + + + transfer lists refresh interval: + 传输列表刷新间隔: + + + ms + ms + + + RSS + RSS + + + RSS feeds refresh interval: + RSS消息种子刷新间隔: + + + minutes + 分钟 + + + Maximum number of articles per feed: + 每个订阅源文章数目最大值: + + + File system + 文件系统 + + + Remove finished torrents when their ratio reaches: + 当比率达到时移除完成的torrent: + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + 注意:变动会在重新运行qBittorrent之后生效. + + + Ask for confirmation on exit when download list is not empty + 下载列表不为空时退出需确认 + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + 关闭到状态栏 + + + Do not start download automatically + The torrent will be added to download list in pause state + 不要开始自动下载 + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + 监视文件夹 + + + Automatically download torrents present in this folder: + 自动下载此文件夹中的torrent: + + + System default + 系统默认 + + + Start minimized + 开始最小化 + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + 双击传输列表显示活动 + + + In download list: + 在下载列表中: + + + Pause/Start torrent + 暂停/开始 torren + + + Open destination folder + 打开目的文件夹 + + + Display torrent properties + 显示torrent属性 + + + In seeding list: + 在种子列表中: + + + Folder scan interval: + 文件夹扫描间隔: + + + seconds + + + + Spoof Azureus to avoid ban (requires restart) + 假借Azureus名义避免被阻止(需重启) + + + Web UI + 网络操作界面 + + + Enable Web User Interface + 启用网络使用者界面 + + + HTTP Server + HTTP 服务器 + + + Enable RSS support + 启用RSS支持 + + + RSS settings + RSS设置 + + + Enable queueing system + 启用排队系统 + + + Maximum active downloads: + 使激活的下载最大化: + + + Torrent queueing + Torrent排队 + + + Maximum active torrents: + 使激活的torrents最大化: + + + Display top toolbar + 显示顶部工具栏 + + + Search engine proxy settings + 搜索引擎代理设置 + + + Bittorrent proxy settings + Bittorrent代理设置 + + + Maximum active uploads: + 使激活的上传最大化: + + + Spoof µtorrent to avoid ban (requires restart) + 假借µtorrent名义避免被阻止(需重启) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + 双击执行活动 + + + Start/Stop + 开始/结束 + + + Open folder + 打开文件夹 + + + Show properties + 显示属性 + + + Port used for incoming connections: + 用于对内连接的端口: + + + Random + 随机 + + + UI + 用户界面 + + + + DownloadingTorrents + + Name + i.e: file name + 名称 + + + Size + i.e: file size + 大小 + + + Progress + i.e: % downloaded + 进度 + + + DL Speed + i.e: Download speed + 下载速度 + + + UP Speed + i.e: Upload speed + 上传速度 + + + Seeds/Leechs + i.e: full/partial sources + 完整种子/不完整种子 + + + Ratio + 比率 + + + ETA + i.e: Estimated Time of Arrival / Time left + 估计剩余时间 + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1开始. + + + Be careful, sharing copyrighted material without permission +is against the law. + 注意,在未经允许情况下共享有版权的材料是违法的. + + + <font color='red'>%1</font> +<i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> +<i>被阻止</i> + + + Fast resume data was rejected for torrent %1, checking +again... + 快速继续数据torrent %1失败, +再次检查... + + + Url seed lookup failed for url: %1, message: %2 + 找不到网址种子:%1, 消息:%2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download +list. + '%1'添加到下载列表. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast +resume) + '%1'重新开始. (快速) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download +list. + '%1'已存在于下载列表中. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: +'/home/y/xxx.torrent' + 无法解码torrent文件:'%1' + + + This file is either corrupted or this isn't a +torrent. + 该文件不是torrent文件或已经损坏. + + + Couldn't listen on any of the given ports. + 所给端口无响应. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please +wait... + '%1'下载中,请等待... + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>被阻止</i> + + + Fast resume data was rejected for torrent %1, checking again... + 快速继续数据torrent %1失败,再次检查... + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1'添加到下载列表. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1'重新开始. (快速) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1'已存在于下载列表中. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 无法解码torrent文件:'%1' + + + This file is either corrupted or this isn't a torrent. + 该文件不是torrent文件或已经损坏. + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1'下载中,请等待... + + + Hide or Show Column + 隐藏或显示栏 + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: 端口映射失败, 消息: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: 端口映射成功, 消息: %1 + + + Priority + 优先 + + + Seeds/Leechers + i.e: full/partial sources + 完整种子/不完整种子 + + + + FeedDownloader + + RSS Feed downloader + 从RSS文件下载 + + + RSS feed: + RSS文件: + + + Feed name + 文件名 + + + Automatically download torrents from this feed + 自动下载此文件中的torrent + + + Download filters + 下载过滤器 + + + Filters: + 过滤器: + + + Filter settings + 过滤器设置 + + + Matches: + 匹配: + + + Does not match: + 不匹配: + + + Destination folder: + 目标文件夹: + + + ... + ... + + + Filter testing + 过滤器测试 + + + Torrent title: + Torrent标题: + + + Result: + 结果: + + + Test + 测试 + + + Import... + 导入... + + + Export... + 导出... + + + Rename filter + 重命名过滤器 + + + Remove filter + 删除过滤器 + + + Add filter + 添加过滤器 + + + + FeedDownloaderDlg + + New filter + 新过滤器 + + + Please choose a name for this filter + 请选择过滤器名 + + + Filter name: + 过滤器名: + + + Invalid filter name + 无效过滤器名 + + + The filter name cannot be left empty. + 过滤器名不能为空. + + + This filter name is already in use. + 该过滤器名已被使用. + + + Filter testing error + 过滤器测试错误 + + + Please specify a test torrent name. + 请指定测试torrent名称. + + + matches + 匹配 + + + does not match + 不匹配 + + + Select file to import + 选择要导入的文件 + + + Filters Files + 过滤器文件 + + + Import successful + 导入成功 + + + Filters import was successful. + 过滤器导入成功. + + + Import failure + 导入失败 + + + Filters could not be imported due to an I/O error. + 输入/输出错误使过滤器不能被导入. + + + Select destination file + 选择目标文件 + + + Overwriting confirmation + 确认覆盖 + + + Are you sure you want to overwrite existing file? + 确定要覆盖已有文件吗? + + + Export successful + 导出成功 + + + Filters export was successful. + 过滤器导出成功. + + + Export failure + 导出失败 + + + Filters could not be exported due to an I/O error. + 输入/输出错误使过滤器不能被导出. + + + + FeedList + + Unread + 未读 + + + + FilterParserThread + + I/O Error + Input/Output Error + 输入/输出错误 + + + Couldn't open %1 in read mode. + 无法在读状态下打开%1. + + + %1 is not a valid PeerGuardian P2B file. + %1不是有效的 PeerGuardian P2B 文件. + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Finished + 完成 + + + Name + i.e: file name + 名称 + + + Size + i.e: file size + 大小 + + + Seeds / Leechers + 完整种子/不完整种子 + + + Connected peers + 连接的用户 + + + Progress + i.e: % downloaded + 进度 + + + DL Speed + i.e: Download speed + 下载速度 + + + UP Speed + i.e: Upload speed + 上传速度 + + + Seeds/Leechs + i.e: full/partial sources + 完整种子/不完整种子 + + + Status + 状态 + + + ETA + i.e: Estimated Time of Arrival / Time left + 剩余时间 + + + Finished + i.e: Torrent has finished downloading + 完成 + + + None + i.e: No error message + + + + Ratio + 比率 + + + Leechers + i.e: full/partial sources + 不完整种子 + + + Total uploaded + i.e: Total amount of uploaded data + 总上传 + + + Hide or Show Column + 隐藏或显示栏 + + + Incomplete torrent in seeding list + 不完全torrent在种子列表中 + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + 据显示'%1' torrent状态从'做种中' 变为 '下载中'.将它移回下载列表吗?(否则此torrent将被删除) + + + Priority + 优先 + + + + GUI + + Open Torrent Files + 打开Torrent文件 + + + Unknown + 无效 + + + This file is either corrupted or this isn't a +torrent. + 该文件不是torrent文件或已经损坏. + + + Are you sure you want to delete all files in download +list? + 确定删除下载列表中的所有文件? + + + &Yes + &是 + + + &No + &否 + + + Are you sure you want to delete the selected item(s) in +download list? + 确定删除所选中的文件? + + + paused + 暂停 + + + started + 开始 + + + Finished + 完成 + + + Checking... + 检查中... + + + Connecting... + 连接中... + + + Downloading... + 下载中... + + + Download list cleared. + 下载列表已清空. + + + All Downloads Paused. + 暂停所有下载. + + + All Downloads Resumed. + 重新开始所有下载. + + + DL Speed: + 下载速: + + + started. + 已开始. + + + UP Speed: + 上传速: + + + Couldn't create the directory: + 无法创建文档: + + + Torrent Files + Torrent文件 + + + already in download list. + <file> already in download list. + 该文件已存在于下载列表中. + + + added to download list. + 添加到下载列表. + + + resumed. (fast resume) + 重新开始. (快速) + + + Unable to decode torrent file: + 无法解码torrent文件: + + + removed. + <file> removed. + 移除. + + + paused. + <file> paused. + 暂停. + + + resumed. + <file> resumed. + 重新开始. + + + Listening on port: + 使用端口: + + + Are you sure? -- qBittorrent + 确定? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + +<b>qBittorrent</b><br>下载速度: + + + <b>Connection +Status:</b><br>Online + <b>连接状态:</b><br>在线 + + + <b>Connection +Status:</b><br>Firewalled?<br><i>No incoming +connections...</i> + <b>连接状态:</b><br>有防火墙?<br><i>无对内连接...</i> + + + <b>Connection +Status:</b><br>Offline<br><i>No peers +found...</i> + <b>连接状态:</b><br>离线</br><i>无法找到任何peer...</i> + + + has finished downloading. + 下载完毕. + + + Couldn't listen on any of the given ports. + 所给端口无响应. + + + None + + + + Empty search pattern + 无关键词 + + + Please type a search pattern first + 请先输入关键词 + + + No seach engine selected + 无选中的搜索引擎 + + + You must select at least one search engine. + 请选择至少一个搜索引擎. + + + Searching... + 搜索中... + + + Could not create search plugin. + 无法创建搜索插件. + + + Stopped + 停止 + + + I/O Error + 输入/输出错误 + + + Couldn't create temporary file on hard drive. + 无法在硬盘上创建临时文件. + + + Torrent file URL + Torrent文件URL + + + Downloading using HTTP: + 使用HTTP下载: + + + Torrent file URL: + Torrent文件URL: + + + A http download failed... + http下载失败... + + + A http download failed, reason: + http失败原因: + + + Are you sure you want to quit? -- qBittorrent + 确实要退出吗? -- +qBittorrent + + + Are you sure you want to quit qbittorrent? + 确实要退出qbittorrent吗? + + + Timed out + 超时 + + + Error during search... + 搜索时出现错误... + + + Failed to download: + 下载失败: + + + A http download failed, reason: + http失败原因: + + + Stalled + 等待 + + + Search is finished + 搜索完毕 + + + An error occured during search... + 搜索中出现错误... + + + Search aborted + 搜索失败 + + + Search returned no results + 搜索无结果 + + + Search is Finished + 搜索完毕 + + + Search plugin update -- qBittorrent + 更新搜索插件 + + + Search plugin can be updated, do you want to update it? + +Changelog: + + 搜索插件可以更新,想要更新它吗? + +更改记录: + + + Sorry, update server is temporarily unavailable. + 对不起,服务器暂时不可用. + + + Your search plugin is already up to date. + 您的搜索插件已是最新的. + + + Results + 结果 + + + Name + 名称 + + + Size + 大小 + + + Progress + 进度 + + + DL Speed + 下载速度 + + + UP Speed + 上传速度 + + + Status + 状态 + + + ETA + 剩余时间 + + + Seeders + 完整种子 + + + Leechers + 不完整种子 + + + Search engine + 搜索引擎 + + + Stalled + state of a torrent whose DL Speed is 0 + 等待中 + + + Paused + 暂停中 + + + Preview process already running + 预览程序已存在 + + + There is already another preview process running. +Please close the other one first. + 另一预览程序正在运行中. +请先关闭另一程序. + + + Couldn't download + Couldn't download <file> + 无法下载 + + + reason: + Reason why the download failed + 原因: + + + Downloading + Example: Downloading www.example.com/test.torrent + 下载中 + + + Please wait... + 请稍等... + + + Transfers + 传输 + + + Are you sure you want to quit qBittorrent? + 确实要退出qBittorrent吗? + + + Are you sure you want to delete the selected item(s) in +download list and in hard drive? + 确定从硬盘及下载列表中删除所选中的项目? + + + Download finished + 下载完毕 + + + has finished downloading. + <filename> has finished downloading. + 下载完毕. + + + Search Engine + 搜索引擎 + + + Seeds/Leechs + 完整种子/不完整种子 + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + 连接状态: + + + Offline + 离线 + + + No peers found... + 找不到资源... + + + Name + i.e: file name + 名称 + + + Size + i.e: file size + 大小 + + + Progress + i.e: % downloaded + 进度 + + + DL Speed + i.e: Download speed + 下载速度 + + + UP Speed + i.e: Upload speed + 上传速度 + + + Seeds/Leechs + i.e: full/partial sources + 完整种子/不完整种子 + + + ETA + i.e: Estimated Time of Arrival / Time left + 剩余时间 + + + Seeders + i.e: Number of full sources + 完整种子 + + + Leechers + i.e: Number of partial sources + 不完整种子 + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1开始. + + + qBittorrent + qBittorrent + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + 下载速度: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + 上传速度: %1 KiB/s + + + Finished + i.e: Torrent has finished downloading + 完成 + + + Checking... + i.e: Checking already downloaded parts... + 检查中... + + + Stalled + i.e: State of a torrent whose download speed is +0kb/s + 等待中 + + + Are you sure you want to quit? + 确实要退出吗? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1'已移除. + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download +list. + '%1'添加到下载列表. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast +resume) + '%1'重新开始(快速) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download +list. + '%1'已存在于下载列表中. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: +'/home/y/xxx.torrent' + 无法解码torrent文件:'%1' + + + None + i.e: No error message + + + + Listening on port: %1 + e.g: Listening on port: 1666 + +使用端口:'%1' + + + All downloads were paused. + 所有下载已暂停. + + + '%1' paused. + xxx.avi paused. + '%1'暂停. + + + Connecting... + i.e: Connecting to the tracker... + 连接中... + + + All downloads were resumed. + 重新开始所有下载. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1'重新开始. + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + '%1'下载完毕. + + + I/O Error + i.e: Input/Output Error + 输入/输出错误 + + + An error occured when trying to read or write %1. The disk +is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. +The disk is probably full, download has been paused + 读或写%1过程中出现错误.磁盘已满,下载被暂停 + + + Connection Status: + 连接状态: + + + Online + 联机 + + + Firewalled? + i.e: Behind a firewall/router? + 存在防火墙? + + + No incoming connections... + 无对内连接... + + + No search engine selected + 无选中的搜索引擎 + + + Search plugin update + 更新搜索插件 + + + Search has finished + 搜索完毕 + + + Results + i.e: Search results + 结果 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please +wait... + '%1'下载中,请等待... + + + An error occured (full disk?), '%1' +paused. + e.g: An error occured (full disk?), 'xxx.avi' +paused. + 出现错误(磁盘已满?),'%1'暂停. + + + Search + 搜索 + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + torrent %1 出现输入/输出错误. +原因: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent 绑定端口:%1 + + + DHT support [ON], port: %1 + DHT 支持 [开], port: %1 + + + DHT support [OFF] + DHT 支持[关] + + + PeX support [ON] + PeX 支持[ON] + + + PeX support [OFF] + PeX 支持[关] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + 下载列表不为空 +您确定要离开qBittorrent吗? + + + Downloads + 下载 + + + Are you sure you want to delete the selected item(s) in +finished list? + 您确定要删除完成列表中选中的项目吗? + + + UPnP support [ON] + UPnP 支持[开] + + + Be careful, sharing copyrighted material without permission +is against the law. + 注意,在未经允许情况下共享有版权的材料是违法的. + + + Encryption support [ON] + 加密支持[开] + + + Encryption support [FORCED] + 加密支持[强制] + + + Encryption support [OFF] + 加密支持[关] + + + <font color='red'>%1</font> +<i>was blocked</i> + x.y.z.w was blocked + <font +color='red'>%1</font> +<i>被阻止</i> + + + Ratio + 比率 + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+3, Ctrl+F + shortcut to switch to third tab (search) + Alt+3, Ctrl+F + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + 网址下载错误 + + + Couldn't download file at url: %1, reason: %2. + 无法在网址:%1下载文件,原因:%2. + + + Fast resume data was rejected for torrent %1, checking +again... + 快速继续数据torrent %1失败, +再次检查... + + + Are you sure you want to delete the selected item(s) from +download list and from hard drive? + 您确定要从下载列表和硬盘中删除选中的项目吗? + + + Are you sure you want to delete the selected item(s) from +finished list and from hard drive? + 您确定要从完成列表和硬盘中删除选中的项目吗? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1'已永久移除. + + + Url seed lookup failed for url: %1, message: %2 + 找不到网址种子:%1, +消息:%2 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent 绑定端口: TCP/%1 + + + UPnP support [OFF] + UPnP 支持[关] + + + NAT-PMP support [ON] + NAT-PMP 支持[开] + + + NAT-PMP support [OFF] + NAT-PMP 支持[关] + + + DHT support [ON], port: UDP/%1 + DHT 支持 [开], 端口: UDP/%1 + + + Local Peer Discovery [ON] + 本地资源搜索[开] + + + Local Peer Discovery support [OFF] + 本地资源搜索支持[关] + + + '%1' was removed because its ratio reached the +maximum value you set. + %1 is a file name + '%1'被移除因为它的比率达到您设置的最大值. + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (下载: %2KiB/s, 上传: +%3KiB/s) + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + 读或写%1过程中出现错误.磁盘可能已满,下载被暂停 + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + 出现错误(磁盘已满?),'%1'暂停. + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + 您确定要从下载列表和硬盘中删除选中的项目吗? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + 您确定要从完成列表和硬盘中删除选中的项目吗? + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1'被移除因为它的比率达到您设置的最大值. + + + Are you sure you want to delete the selected item(s) in download list? + 您确定要删除下载列表中选中的项目吗? + + + Are you sure you want to delete the selected item(s) in finished list? + 您确定要删除完成列表中选中的项目吗? + + + DL: %1 KiB/s + 下载: %1 KiB/s + + + UP: %1 KiB/s + 上传: %1 KiB/s + + + Ratio: %1 + 比率:%1 + + + DHT: %1 nodes + DHT: %1 结点 + + + No direct connections. This may indicate network configuration problems. + 无直接连接.这也许指示网络设置问题. + + + Uploads + 上传 + + + Options were saved successfully. + 选项保存成功. + + + + MainWindow + + Log: + 日志: + + + Total DL Speed: + 总下载速度: + + + Total UP Speed: + 总上传速度: + + + Name + 名称 + + + Size + 大小 + + + % DL + % 下载 + + + DL Speed + 下载速度 + + + UP Speed + 上传速度 + + + Status + 状态 + + + &Options + &选项 + + + &Edit + &编辑 + + + &File + &文件 + + + &Help + &帮助 + + + Open + 打开 + + + Exit + 退出 + + + Preferences + 首选项 + + + About + 关于 + + + Start + 开始 + + + Pause + 暂停 + + + Delete + 删除 + + + Pause All + 暂停所有 + + + Start All + 开始所有 + + + Documentation + 文档资料 + + + Connexion Status + 连接状态 + + + Delete All + 删除所有 + + + Torrent Properties + Torrent所有权 + + + Connection Status + 连接状态 + + + Downloads + 下载 + + + Search + 搜索 + + + Search Pattern: + 搜索关键词: + + + Status: + 状态: + + + Stopped + 停止 + + + Search Engines + 搜索引擎 + + + Results: + 结果: + + + Stop + 停止 + + + Seeds + 完整种子 + + + Leechers + 不完整种子 + + + Search Engine + 搜索引擎 + + + Download from URL + 通过网址下载 + + + Download + 下载 + + + Clear + 清除 + + + Create torrent + 创建torrent + + + Ratio: + 比率: + + + Update search plugin + 更新搜索插件 + + + Session ratio: + 本次会话共享评价: + + + Transfers + 传输 + + + Preview file + 预览文件 + + + Clear log + 清除日志 + + + Delete Permanently + 永久删除 + + + Visit website + 浏览网站 + + + Report a bug + 报告错误 + + + Set upload limit + 设定上传限制 + + + Set download limit + 设定下载限制 + + + Log + 日志 + + + IP filter + IP过滤器 + + + Set global download limit + 设定总下载限制 + + + Set global upload limit + 设定总上传限制 + + + Options + 选项 + + + KiB/s + KiB/s + + + Decrease priority + 降低优先 + + + Increase priority + 增加优先 + + + Console + 控制台 + + + + PropListDelegate + + False + + + + True + + + + Ignored + 忽略 + + + Normal + Normal (priority) + 正常 + + + High + High (priority) + + + + Maximum + Maximum (priority) + 最大 + + + + QTextEdit + + Clear + 清除 + + + + RSS + + Search + 搜索 + + + Delete + 删除 + + + Rename + 重命名 + + + Refresh + 重新载入 + + + Create + 创建 + + + Delete selected streams + 删除选中的资源 + + + Refresh RSS streams + 重新载入RSS资源 + + + Add a new RSS stream + 加入新RSS资源 + + + <b>News:</b> <i>(double-click to open the +link in your web browser)</i> + <b>新闻:</b> +<i>(双击以连接到网页浏览器)</i> + + + Add RSS stream + 加入RSS资源 + + + Refresh all streams + 重新载入所有资源 + + + RSS streams: + RSS资源: + + + 2 + 2 + + + Mark all as read + 标记所有条目为已读 + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>新闻:</b> <i>(双击以连接到网页浏览器)</i> + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrent:</span> <span style=" font-style:italic;">(双击进行下载)</span></p></body></html> + + + Download torrent + 下载torrent + + + Open news URL + 打开新闻URL + + + Copy feed URL + 复制文件URL + + + RSS feed downloader + 从RSS文件下载 + + + New subscription + 新RSS文件 + + + Mark items read + 标记项目为已读 + + + Update all + 更新所有 + + + Update all feeds + 更新所有文件 + + + RSS feeds + RSS文件 + + + Update + 更新 + + + New folder + 新文件夹 + + + 1 + 1 + + + Feed URL + 文件URL + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + + + + Stream URL: + 网址资源: + + + Please choose a new name for this stream + 请选择资源名 + + + New stream name: + 新资源名: + + + Are you sure? -- qBittorrent + 确定? -- qBittorrent + + + Are you sure you want to delete this stream from the list +? + 确定要从列表中删除此资源吗? + + + &Yes + &是 + + + &No + &否 + + + Are you sure you want to delete this stream from the +list? + 确定要从列表中删除此资源吗? + + + Description: + 声明: + + + url: + 网址: + + + Last refresh: + 最近重新载入: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + 该RSS消息种子已在列表中. + + + Date: + 日期: + + + Author: + 作者: + + + Are you sure you want to delete this stream from the list? + 您确定要从列表中删除此资源吗? + + + Please choose a folder name + 请选择文件夹名 + + + Folder name: + 文件夹名: + + + New folder + 新文件夹 + + + Are you sure you want to delete these elements from the list? + 确定要从列表中删除这些项吗? + + + Are you sure you want to delete this element from the list? + 确定要从列表中删除此项吗? + + + Please choose a new name for this RSS feed + 请命名该RSS文件 + + + New feed name: + 新文件名: + + + Name already in use + 名称已被使用 + + + This name is already used by another item, please choose another one. + 该名称已被另一项目使用,请重新选择. + + + Overwrite attempt + 企图覆盖 + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + 您不能覆盖%1项目. + + + Unread + 未读 + + + + RssItem + + No description available + 无可用描述 + + + + RssStream + + %1 ago + 10min ago + %1前 + + + Never + 从不 + + + Automatically downloading %1 torrent from %2 RSS feed... + 自动下载%2RSS文件中的%1torrent... + + + + SearchCategories + + All categories + 所有类别 + + + Movies + 电影 + + + TV shows + 电视节目 + + + Music + 音乐 + + + Games + 游戏 + + + Anime + 动漫 + + + Software + 软件 + + + Pictures + 图片 + + + Books + 书籍 + + + + SearchEngine + + Name + i.e: file name + 名称 + + + Size + i.e: file size + 大小 + + + Seeders + i.e: Number of full sources + 完整种子 + + + Leechers + i.e: Number of partial sources + 不完整种子 + + + Search engine + 搜索引擎 + + + Empty search pattern + 无搜索关键词 + + + Please type a search pattern first + 请先输入关键词 + + + No search engine selected + 无选中的搜索引擎 + + + You must select at least one search engine. + 请选择至少一个搜索引擎. + + + Results + 结果 + + + Searching... + 搜索中... + + + Search plugin update -- qBittorrent + 更新搜索插件-- +qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + 搜索插件可以更新,想要更新它吗? + +更改记录: + + + &Yes + &是 + + + &No + &否 + + + Search plugin update + 更新搜索插件 + + + qBittorrent + qBittorrent + + + Sorry, update server is temporarily unavailable. + 对不起,更新服务器暂时不可用. + + + Your search plugin is already up to date. + 您的搜索插件已是最新的. + + + Cut + 剪切 + + + Copy + 复制 + + + Paste + 粘贴 + + + Clear field + 清除信息 + + + Clear completion history + 清除搜索历史 + + + Search Engine + 搜索引擎 + + + Search has finished + 搜索完毕 + + + An error occured during search... + 搜索中出现错误... + + + Search aborted + 搜索失败 + + + Search returned no results + 搜索无结果 + + + Results + i.e: Search results + 结果 + + + Search plugin download error + 搜索插件下载错误 + + + Couldn't download search plugin update at url: %1, +reason: %2. + 无法在网址:%1下载更新搜索插件,原因:%2. + + + Unknown + 未知 + + + + SearchTab + + Name + i.e: file name + 名称 + + + Size + i.e: file size + 大小 + + + Seeders + i.e: Number of full sources + 完整种子 + + + Leechers + i.e: Number of partial sources + 不完整种子 + + + Search engine + 搜索引擎 + + + + TrackersAdditionDlg + + Trackers addition dialog + 添加trackers对话窗 + + + List of trackers to add (one per line): + 要添加的trackers列表(每行一个): + + + + Ui + + I would like to thank the following people who volonteered +to translate qBittorrent: + 感谢以下所有qBittorrent的志愿翻译者: + + + Please contact me if you would like to translate qBittorrent +to your own language. + 如果你想为qBittorrent提供翻译请与我联系. + + + I would like to thank sourceforge.net for hosting +qBittorrent project. + 感谢sourceforge.net的支持. + + + I would like to thank the following people who volunteered +to translate qBittorrent: + 感谢以下所有qBittorrent的志愿翻译者: + + + <ul><li>I would like to thank sourceforge.net +for hosting qBittorrent project.</li> + <ul><li>感谢sourceforge.net对qBittorrent的支持.</li> + + + <li>I also like to thank Jeffery Fernandez +(developer@jefferyfernandez.id.au), our RPM packager, for his great +work.</li></ul> + <li>同时还要感谢Jeffery +Fernandez (developer@jefferyfernandez.id.au), RPM packager, +感谢他的杰出工作.</li></ul> + + + Preview impossible + 无法预览 + + + Sorry, we can't preview this file + 抱歉, +此文件无法被预览 + + + Name + 名称 + + + Size + 大小 + + + Progress + 进度 + + + No URL entered + 未输入URL + + + Please type at least one URL. + 请至少输入一个URL. + + + qBittorrent + qBittorrent + + + Please contact me if you would like to translate qBittorrent +into your own language. + 如果你想为qBittorrent提供翻译请与我联系. + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered +to translate qBittorrent: + 感谢以下所有qBittorrent的志愿翻译者: + + + Please contact me if you would like to translate qBittorrent +into your own language. + 如果你想为qBittorrent提供翻译请与我联系. + + + I would like to thank the following people who volunteered to translate qBittorrent: + 感谢以下所有qBittorrent的志愿翻译者: + + + Please contact me if you would like to translate qBittorrent into your own language. + 如果你想为qBittorrent提供翻译请与我联系. + + + + addTorrentDialog + + Torrent addition dialog + 添加Torrent对话窗 + + + Save path: + 保存路径: + + + ... + ... + + + Torrent content: + Torrent内容: + + + File name + 文件名 + + + File size + 文件大小 + + + Selected + 已选中 + + + Download in correct order (slower but good for +previewing) + 按递增顺序下载(速度会有所减慢但利于预览) + + + Add to download list in paused state + 以暂停状态添加到下载列表中 + + + Add + 添加 + + + Cancel + 取消 + + + select + 选中 + + + Unselect + 未选中 + + + Select + 选择 + + + Ignored + 忽略 + + + Normal + 正常 + + + High + + + + Maximum + 最大 + + + Download in correct order (slower but good for previewing) + 按递增顺序下载(速度会有所减慢但利于预览) + + + Collapse all + 隐藏所有 + + + Expand All + 展开所有 + + + Expand all + 展开所有 + + + Torrent size: + Torrent大小: + + + Unknown + 未知 + + + Free disk space: + 可用磁盘空间: + + + Download in sequential order (slower but good for previewing) + 按顺序下载(速度有所减慢但利于预览) + + + + authentication + + Tracker authentication + Tracker验证 + + + Tracker: + Tracker: + + + Login + 登录 + + + Username: + 用户名: + + + Password: + 密码: + + + Log in + 登入 + + + Cancel + 取消 + + + + bandwidth_dlg + + Bandwidth allocation + 宽带分配 + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + '%1'达到您设置的最大比率. + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1'已永久移除. + + + '%1' was removed. + 'xxx.avi' was removed. + '%1'已移除. + + + '%1' paused. + e.g: xxx.avi paused. + '%1'暂停. + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1'重新开始. + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1'已存在于下载列表中. + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' 重新开始. (快速) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1'添加到下载列表. + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 无法解码torrent文件:'%1' + + + This file is either corrupted or this isn't a torrent. + 该文件不是torrent文件或已经损坏. + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>被您的IP过滤器阻止</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>因损坏碎片被禁止</i> + + + Couldn't listen on any of the given ports. + 所给端口无响应. + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: 端口映射失败, 消息: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: 端口映射成功, 消息: %1 + + + Fast resume data was rejected for torrent %1, checking again... + 快速重新开始数据torrent %1失败,再次检查... + + + Url seed lookup failed for url: %1, message: %2 + 找不到网址种子:%1, 消息:%2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + '%1'下载中,请等待... + + + '%1' is not a valid magnet URI. + %1不是有效的MAGNET链接. + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + 循环下载包含在torrent%2中的文件%1 + + + Unable to decode %1 torrent file. + 无法解码%1torrent文件. + + + + createTorrentDialog + + Create Torrent file + 创建Torrent文件 + + + Comment: + 注释: + + + ... + ... + + + Create + 创建 + + + Cancel + 取消 + + + Directory + 目录 + + + Torrent Creation Tool + Torrent创建工具 + + + <center>Destination torrent +file:</center> + 目标Torrent文件: + + + <center>Input file or +directory:</center> + 输入文件或目录 + + + <center>Announce url:<br>(One per +line)</center> + 请指定url:(每行一个) + + + <center>Comment:</center> + 注释: + + + Torrent file creation + 创建Torrent文件 + + + Input files or directories: + 输入文件或目录: + + + Announce urls (trackers): + Announce网址(trackers): + + + Comment (optional): + 注释(可选): + + + Private (won't be distributed on trackerless network / +DHT if enabled) + 私人(不共享到无服务器的网络/DHT如启用) + + + Destination torrent file: + torrent文件目的地: + + + Web seeds urls (optional): + 网络种子网址(可选): + + + File or folder to add to the torrent: + 加入torrent的文件或文件夹: + + + Add a file + 添加文件 + + + Add a folder + 添加文件夹 + + + Piece size: + 文件块大小: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if +enabled) + 私人(不共享到DHT网络如启用) + + + Start seeding after creation + 创建后开始做种 + + + Create and save... + 创建并保存... + + + Private (won't be distributed on DHT network if enabled) + 私人(不共享到DHT网络如启用) + + + Progress: + 进度: + + + Add file + 添加文件 + + + Add folder + 添加文件夹 + + + + createtorrent + + Select destination torrent file + 选择torrent文件目的地 + + + Torrent Files + Torrent文件 + + + Select input directory or file + 选择输入目录或文件 + + + No destination path set + 未设置目标路径 + + + Please type a destination path first + 请先给出目标路经 + + + No input path set + 未设置输入路径 + + + Please type an input path first + 请先给出输入路径 + + + Input path does not exist + 输入路径不存在 + + + Please type a correct input path first + 请先给出一个正确的输入路径 + + + Torrent creation + 创建Torrent + + + Torrent was created successfully: + 成功创建Torrent: + + + Please type a valid input path first + 请先输入一个有效的路径 + + + Select a folder to add to the torrent + 选择加入torrent的文件夹 + + + Select files to add to the torrent + 选择加入torrentd的文件 + + + Please type an announce URL + 请输入一个announce网址 + + + Torrent creation was unsuccessful, reason: %1 + 创建Torrent失败,原因:%1 + + + Announce URL: + Tracker URL + Announce网址: + + + Please type a web seed url + 请输入一个网络种子网址 + + + Web seed URL: + 网络种子网址: + + + Select a file to add to the torrent + 选择加入到torrent的文件 + + + No tracker path set + 未设置tracker路径 + + + Please set at least one tracker + 请设置至少一个tracker + + + Created torrent file is invalid. It won't be added to download list. + 创建的torrent文件无效.它将不会被添加到下载列表中. + + + + downloadFromURL + + Download Torrents from URLs + 从URL下载Torrents + + + Only one URL per line + 每行仅可有一URL + + + Download + 下载 + + + Cancel + 取消 + + + Download from urls + 从URL下载 + + + No URL entered + 未输入URL + + + Please type at least one URL. + 请至少输入一个URL. + + + + downloading + + Search + 搜索 + + + Total DL Speed: + 总下载速度: + + + KiB/s + KiB/s + + + Session ratio: + 本次会话共享评价: + + + Total UP Speed: + 总上传速度: + + + Log + 日志 + + + IP filter + IP过滤器 + + + Start + 开始 + + + Pause + 暂停 + + + Delete + 删除 + + + Clear + 清除 + + + Preview file + 预览文件 + + + Set upload limit + 设定上传限制 + + + Set download limit + 设定下载限制 + + + Delete Permanently + 永久删除 + + + Torrent Properties + Torrent属性 + + + Open destination folder + 打开目标文件夹 + + + Name + 名称 + + + Size + 大小 + + + Progress + 进度 + + + DLSpeed + 下载速度 + + + UpSpeed + 上传速度 + + + Seeds/Leechs + 完整种子/不完整种子 + + + Ratio + 比率 + + + ETA + 估计剩余时间 + + + Buy it + 购买 + + + Priority + 优先 + + + Increase priority + 增加优先 + + + Decrease priority + + + + Force recheck + 强制再次核对 + + + Copy magnet link + 复制MAGNET链接 + + + + engineSelect + + Search plugins + 搜索插件 + + + Installed search engines: + 搜索引擎已安装: + + + Name + 名称 + + + Url + 网址 + + + Enabled + 启用 + + + You can get new search engine plugins here: <a +href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 您可以在这里获得新的搜索引擎:<ahref="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + 安装新一个 + + + Check for updates + 检查更新 + + + Close + 关闭 + + + Enable + 启用 + + + Disable + 禁用 + + + Uninstall + 卸载 + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 您可以在这获得新的搜索引擎插件:<a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + + engineSelectDlg + + True + 正确 + + + False + 错误 + + + Uninstall warning + 卸载警告 + + + Some plugins could not be uninstalled because they are +included in qBittorrent. +Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + 一些插件不能被卸载因为被包括在qBittorrent内. +只有自己添加的那些可以被卸载 +然而, 那些插件被禁用. + + + Uninstall success + 卸载成功 + + + Select search plugins + 选择搜索插件 + + + qBittorrent search plugins + qBittorrent搜索插件 + + + Search plugin install + 安装搜索插件 + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already +installed. + %1 is the name of the search engine + 更新版本的%1搜索引擎插件已安装. + + + Search plugin update + 更新搜索插件 + + + Sorry, update server is temporarily unavailable. + 对不起, +更新服务器暂时不可用. + + + All your plugins are already up to date. + 所有的插件已是最新的. + + + %1 search engine plugin could not be updated, keeping old +version. + %1 is the name of the search engine + %1搜索引擎插件不能被更新, +保留旧版本. + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1搜索引擎插件不能被安装. + + + All selected plugins were uninstalled successfully + 所有选中的插件已成功卸载 + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1搜索引擎插件已成功更新. + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1搜索引擎插件已成功安装. + + + Search engine plugin archive could not be read. + 搜索引擎插件压缩文件不能被读取. + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + 对不起, %1搜索插件安装失败. + + + New search engine plugin URL + 新搜索引擎插件网址 + + + URL: + 网址: + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + 一些插件由于被包括在qBittorrent内不能被卸载. + 只有由您添加的插件可以被卸载然而, 那些插件被禁用. + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + 更新版本的%1搜索引擎插件已安装. + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1搜索引擎插件不能被更新,保留旧版本. + + + Yes + + + + No + + + + + misc + + B + bytes + + + + KiB + kibibytes (1024 bytes) + + + + MiB + mebibytes (1024 kibibytes) + + + + GiB + gibibytes (1024 mibibytes) + + + + TiB + tebibytes (1024 gibibytes) + + + + m + minutes + 分钟 + + + h + hours + 小时 + + + Unknown + 未知 + + + d + days + + + + Unknown + Unknown (size) + 未知 + + + < 1m + < 1 minute + < 1分钟 + + + %1m + e.g: 10minutes + %1分钟 + + + %1h%2m + e.g: 3hours 5minutes + %1小时%2分钟 + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1天%2小时%3分钟 + + + + options_imp + + Options saved successfully! + 选项保存成功! + + + Choose Scan Directory + 监视目录 + + + Choose save Directory + 保存到 + + + Choose ipfilter.dat file + 选择ipfilter.dat文件 + + + I/O Error + 输入/输出错误 + + + Couldn't open: + 无法打开: + + + in read mode. + 处于只读状态. + + + Invalid Line + 无效行 + + + Line + + + + is malformed. + 有残缺. + + + Range Start IP + IP列起始 + + + Start IP: + 起始IP: + + + Incorrect IP + 错误的IP + + + This IP is incorrect. + 此IP有误. + + + Range End IP + IP列截止 + + + End IP: + 截止IP: + + + IP Range Comment + IP列注释 + + + Comment: + 注释: + + + to + <min port> to <max port> + + + + Choose your favourite preview program + 选择您想要的程序以便预览文件 + + + Invalid IP + 无效IP + + + This IP is invalid. + 此IP无效. + + + Options were saved successfully. + 选项保存成功. + + + Choose scan directory + 选择监视目录 + + + Choose an ipfilter.dat file + 选择ipfilter.dat文件 + + + Choose a save directory + 保存到 + + + I/O Error + Input/Output Error + 输入/输出错误 + + + Couldn't open %1 in read mode. + 无法在读状态下打开%1. + + + Choose an ip filter file + 选择ip过滤文件 + + + Filters + 过滤器 + + + + pluginSourceDlg + + Plugin source + 插件来源 + + + Search plugin source: + 搜索插件来源: + + + Local file + 本地文件 + + + Web link + 网络连接 + + + + preview + + Preview selection + 选择要预览的文件 + + + File preview + 文件预览 + + + The following files support previewing, <br>please +select one of them: + 下列文件支持预览, +请选择其一: + + + Preview + 预览 + + + Cancel + 取消 + + + The following files support previewing, <br>please select one of them: + 下列文件支持预览,<br>请选择其一: + + + + previewSelect + + Preview impossible + 无法预览 + + + Sorry, we can't preview this file + 抱歉, 此文件无法被预览 + + + Name + 名称 + + + Size + 大小 + + + Progress + 进度 + + + + properties + + Torrent Properties + Torrent属性 + + + Main Infos + 信息 + + + File Name + 文件名 + + + Current Session + 当前会话 + + + Total Uploaded: + 总上传: + + + Total Downloaded: + 总下载: + + + upTotal + 总上传 + + + dlTotal + 总下载 + + + Download state: + 下载状态: + + + Current Tracker: + 当前torrent服务器: + + + Number of Peers: + 资源数: + + + dlState + 下载状态 + + + nbPeers + Peers数 + + + (Complete: 0.0%, Partial: 0.0%) + (完成: 0.0%, Partial: +0.0%) + + + Torrent Content + Torrent内容 + + + OK + 确认 + + + Cancel + 取消 + + + Total Failed: + 总失败数: + + + failed + 失败 + + + Finished + 完成 + + + Queued for checking + 等待检查 + + + Checking files + 检查文件 + + + Connecting to tracker + 连接到tracker + + + Downloading Metadata + 文件信息下载中 + + + Downloading + 下载中 + + + Seeding + 正在做种 + + + Allocating + 正在创建硬盘空间 + + + Unreachable? + Unreachable? + + + Unknown + 未知 + + + Complete: + 完整: + + + Partial: + 不完整: + + + Files contained in current torrent: + 存在于当前torrent内的文件有: + + + Size + 大小 + + + Selected + 已选中 + + + Unselect + 不选 + + + Select + 选则 + + + You can select here precisely which files you want to +download in current torrent. + 请在当前torrent中选择所需要的文件. + + + False + 错误 + + + True + 正确 + + + Tracker + Tracker + + + Trackers: + Trackers: + + + None - Unreachable? + 无-无法连接到服务器? + + + Errors: + 错误: + + + Progress + 进度 + + + Main infos + 主要信息 + + + Number of peers: + peers数量: + + + Current tracker: + 当前tracker: + + + Total uploaded: + 上传总数: + + + Main info + 主要信息 + + + Torrent information + Torrent信息 + + + Total downloaded: + 下载总数: + + + Total failed: + 错误总数: + + + Torrent content + Torrent内容 + + + Options + 选项 + + + Download in correct order (slower but good for +previewing) + 按递增顺序下载(速度会有所减慢但利于预览) + + + Share Ratio: + 分享率: + + + Seeders: + 完整种子: + + + Leechers: + 不完整种子: + + + Save path: + 保存路径: + + + Torrent infos + Torrent信息 + + + Creator: + 创建者: + + + Torrent hash: + Torrent哈西值: + + + Comment: + 注释: + + + Current session + 当前会话 + + + Share ratio: + 共享率: + + + Trackers + Trackers + + + New tracker + 新tracker + + + New tracker url: + 新tracker网址: + + + Priorities: + 优先: + + + Normal: normal priority. Download order is dependent on +availability + 正常:正常优先.下载顺序取决于可用性 + + + High: higher than normal priority. Pieces are preferred over +pieces with the same availability, but not over pieces with lower +availability + 高:高于正常优先.优先使用可用性相同的文件块,而不是可用性较低的 + + + Maximum: maximum priority, availability is disregarded, the +piece is preferred over any other piece with lower priority + 最大:最大优先,忽略可用性,此文件块优先于任何优先级较低的文件块 + + + File name + 文件名 + + + Priority + 优先 + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + Trackers列表不能为空. + + + Ignored: file is not downloaded at all + 忽略:文件没有被下载 + + + Ignored + 忽略 + + + Normal + 正常 + + + Maximum + 最大 + + + High + + + + Url seeds + 网址种子 + + + New url seed: + 新网址种子: + + + This url seed is already in the list. + 该网址种子已在列表中. + + + Hard-coded url seeds cannot be deleted. + 写死的网址种子不能被删除. + + + None + i.e: No error message + + + + New url seed + New HTTP source + 新网址种子 + + + The following url seeds are available for this +torrent: + 以下网址种子对该torrent可用: + + + Priorities error + 属性错误 + + + Error, you can't filter all the files in a +torrent. + 错误,不能过滤torrent中的所有文件. + + + Download in correct order (slower but good for previewing) + 按递增顺序下载(速度会有所减慢但利于预览) + + + The following url seeds are available for this torrent: + 以下网址种子对该torrent可用: + + + Normal: normal priority. Download order is dependent on availability + 正常:正常优先.下载顺序取决于可用性 + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + 高:高于正常优先.优先使用可用性相同的文件块,而不是可用性较低的 + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + 最大:最大优先,忽略可用性,此文件块优先于任何优先级较低的文件块 + + + Error, you can't filter all the files in a torrent. + 错误,不能过滤torrent中的所有文件. + + + Downloaded pieces + 已下载的文件块 + + + Collapse all + 隐藏所有 + + + Expand all + 展开所有 + + + ... + ... + + + Choose save path + 选择保存路径 + + + Save path creation error + 创建保存路径时出现错误 + + + Could not create the save path + 无法创建保存路径 + + + + search_engine + + Search + 搜索 + + + Search Engines + 搜索引擎 + + + Search Pattern: + 搜索关键词: + + + Stop + 停止 + + + Status: + 状态: + + + Stopped + 停止 + + + Results: + 结果: + + + Download + 下载 + + + Clear + 清除 + + + Update search plugin + 更新搜索插件 + + + Search engines... + 搜索引擎... + + + + seeding + + Search + 搜索 + + + The following torrents are finished and shared: + 以下torrent已结束并共享: + + + <u>Note:</u> It is important that you keep +sharing your torrents after they are finished for the well being of the +network. + <u>注释:</u> +完成后继续共享torrents对网络的良好运作很重要. + + + Start + 开始 + + + Pause + 暂停 + + + Delete + 删除 + + + Delete Permanently + 永久删除 + + + Torrent Properties + Torrent属性 + + + Preview file + 预览文件 + + + Set upload limit + 设定上传限制 + + + Connected peers + 连接的用户 + + + Seeds / Leechers + 完整种子/不完整种子 + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>注释:</u> 完成后继续共享torrents对网络的良好运作很重要. + + + Open destination folder + 打开目标文件夹 + + + Name + 名称 + + + Size + 大小 + + + Upload Speed + 上传速度 + + + Leechers + 不完整种子 + + + Ratio + 比率 + + + Buy it + 购买 + + + Total uploaded + 总上传 + + + Priority + 优先 + + + Increase priority + 增加优先 + + + Decrease priority + 降低优先 + + + Force recheck + 强制再次核对 + + + Copy magnet link + 复制MAGNET链接 + + + + subDownloadThread + + Host is unreachable + 无法连接到主机 + + + File was not found (404) + 文件未找到(404) + + + Connection was denied + 连接被拒绝 + + + Url is invalid + 网址无效 + + + Connection forbidden (403) + 连接被禁止(403) + + + Connection was not authorized (401) + 连接未经许可 + + + Content has moved (301) + 内容被移动(301) + + + Connection failure + 连接失败 + + + Connection was timed out + 连接超时 + + + Incorrect network interface + 不正确的网络关联 + + + Unknown error + 未知错误 + + + Could not resolve proxy + 无法联系到代理服务器 + + + I/O Error + 输入/输出错误 + + + + torrentAdditionDialog + + True + + + + Unable to decode torrent file: + 无法解码torrent文件: + + + This file is either corrupted or this isn't a +torrent. + 该文件不是torrent文件或已经损坏. + + + Choose save path + 选择保存路径 + + + False + + + + Empty save path + 保存路径为空 + + + Please enter a save path + 请输入一个保存路径 + + + Save path creation error + 创建保存路径时出现错误 + + + Could not create the save path + 无法创建保存路径 + + + Invalid file selection + 所选文件无效 + + + You must select at least one file in the torrent + 至少选择一个torrent文件 + + + File name + 文件名 + + + Size + 大小 + + + Progress + 进度 + + + Priority + 优先 + + + This file is either corrupted or this isn't a torrent. + 该文件不是torrent文件或已经损坏. + + + Unknown + 未知 + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (torrent下载后剩余%1) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (另需%1以完成下载) + + + diff --git a/src/lang/qbittorrent_zh_TW.qm b/src/lang/qbittorrent_zh_TW.qm new file mode 100644 index 0000000000000000000000000000000000000000..0ef8e0d802cbef95c59ca4478b328f6c991ac835 GIT binary patch literal 52452 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 + + + + AboutDlg + + About qBittorrent + 關於 qBittorrent + + + About + 關於 + + + Author + 作者 + + + Name: + 姓名: + + + Country: + 國籍: + + + E-mail: + E-mail: + + + Home page: + 首頁: + + + Christophe Dumez + Christophe Dumez + + + France + 法國 + + + Translation + 翻譯 + + + License + 授權 + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + bittorrent 的用戶端軟體, 使用 Qt4 和 libtorrent, 以 C++ 語言編寫。<br> +<br> +版權所有 © 2006 by Christophe Dumez +<br> <u>首頁:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + 生日: + + + Occupation: + 職業: + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + 電腦科學學生 + + + Thanks to + 感謝 + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一個使用 C++ 編寫, 基於 QT4 的 Bittorrent 客戶端 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">以及 libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">首頁:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html> + + + + BandwidthAllocationDialog + + Upload limit: + 上傳限制: + + + Download limit: + 下載限制: + + + Unlimited + Unlimited (bandwidth) + 無限制 + + + KiB/s + KiB/s + + + + ConsoleDlg + + qBittorrent console + qBittorrent 終端機 + + + General + 一般 + + + Blocked IPs + 被封鎖的 IP + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + 選項 -- qBittorrent + + + Port range: + 埠範圍: + + + ... + ... + + + Proxy Settings + 代理伺服器設定 + + + Port: + 埠: + + + Authentication + 驗證 + + + Password: + 密碼: + + + Activate IP Filtering + 啟用 IP 過濾 + + + Filter Settings + 過濾設定 + + + Language: + 語言: + + + KiB/s + KiB/s + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + <b>注意:</b> 更改在重新啟動 qBittorrent 才會套用。 + + + Connection + 連線 + + + Plastique style (KDE like) + Plastique 樣式 (像 KDE) + + + CDE style (Common Desktop Environment like) + CDE 樣式 (像 Common Desktop Environment) + + + HTTP + HTTP + + + SOCKS5 + SOCKS5 + + + Affected connections + 使用代理伺服器的連線 + + + Use proxy for connections to trackers + 使用代理伺服器連線到 tracker + + + Use proxy for connections to regular peers + 使用代理伺服器連線到一般的下載者 + + + Use proxy for connections to web seeds + 使用代理伺服器連線到網頁種子 + + + Use proxy for DHT messages + 使用代理伺服器來處理 DHT 訊息 + + + Enabled + 已啟用 + + + Forced + 強迫 + + + Disabled + 已停用 + + + Preferences + 偏好設定 + + + General + 一般 + + + Network + 網路 + + + IP Filter + IP 過濾 + + + User interface settings + 使用者介面設定 + + + Visual style: + 視覺樣式: + + + Cleanlooks style (Gnome like) + Cleanlooks 樣式 (像 Gnome) + + + Motif style (Unix like) + Motif 樣式 (像 Unix) + + + Ask for confirmation on exit when download list is not empty + 下載清單不是空的時候離開程式需確認 + + + Display current speed in title bar + 在標題列顯示目前的速度 + + + System tray icon + 系統列圖示 + + + Disable system tray icon + 停用系統列圖示 + + + Close to tray + i.e: The systray tray icon will still be visible when closing the main window. + 關閉到系統列 + + + Minimize to tray + 最小化到系統列 + + + Show notification balloons in tray + 在系統列顯示通知氣球 + + + Downloads + 下載 + + + Put downloads in this folder: + 下載到這個資料夾: + + + Pre-allocate all files + 事先分配所有檔案 + + + When adding a torrent + 當增加 torrent 時 + + + Display torrent content and some options + 顯示 torrent 內容及其他選項 + + + Do not start download automatically + The torrent will be added to download list in pause state + 不要自動開始下載 + + + Folder watching + qBittorrent will watch a directory and automatically download torrents present in it + 監視資料夾 + + + Transfer lists double-click + qBittorrent will watch a directory and automatically download torrents present in it + 雙擊傳輸清單 + + + Download list: + 下載清單: + + + Seeding list: + 做種清單: + + + Download folder: + 下載資料夾: + + + Temp folder: + 暫存資料夾: + + + Automatically download torrents present in this folder: + 自動下載出現在此資料夾裡的 torrent: + + + Listening port + 監聽埠 + + + to + i.e: 1200 to 1300 + + + + Enable UPnP port mapping + 啟用 UPnP 埠映射 + + + Enable NAT-PMP port mapping + 啟用 NAT-PMP 埠映射 + + + Global bandwidth limiting + 全域頻寬限制 + + + Upload: + 上傳: + + + Download: + 下載: + + + Bittorrent features + Bittorrent 特性 + + + Use the same port for DHT and Bittorrent + DHT 和 Bittorrent 使用相同的埠 + + + DHT port: + DHT 埠: + + + Type: + 類型: + + + (None) + (無) + + + Proxy: + 代理伺服器: + + + Username: + 使用者名稱: + + + Bittorrent + Bittorrent + + + Connections limit + 連線限制 + + + Global maximum number of connections: + 全域最大連線數: + + + Maximum number of connections per torrent: + 每個 torrent 的最大連線數: + + + Maximum number of upload slots per torrent: + 每個 torrent 上傳位置的最大數: + + + Additional Bittorrent features + 其他的 Bittorrent 特性 + + + Enable DHT network (decentralized) + 啟用 DHT 網路 (分散式) + + + Enable Peer eXchange (PeX) + 啟用下載者交換 (PeX) + + + Enable Local Peer Discovery + 啟用本地下載者搜尋 + + + Encryption: + 加密: + + + Share ratio settings + 分享率設定 + + + Desired ratio: + 希望的分享率: + + + Filter file path: + 過濾檔案路徑: + + + transfer lists refresh interval: + 傳輸清單更新間隔: + + + ms + ms + + + Misc + 雜項 + + + RSS + RSS + + + RSS feeds refresh interval: + RSS feed 更新間隔: + + + minutes + 分鐘 + + + Maximum number of articles per feed: + 每個 feed 的最大文章數: + + + File system + 檔案系統 + + + Remove finished torrents when their ratio reaches: + 當分享率到達時移除 torrent: + + + System default + 系統預設 + + + Start minimized + 啟動時最小化 + + + Action on double click in transfer lists + qBittorrent will watch a directory and automatically download torrents present in it + 雙擊傳輸清單時的行動 + + + In download list: + 在下載清單: + + + Pause/Start torrent + 暫停/開始 torrent + + + Open destination folder + 開啟目的地資料夾 + + + Display torrent properties + 顯示 torrent 屬性 + + + In seeding list: + 在種子清單: + + + Folder scan interval: + 資料夾掃描間隔: + + + seconds + + + + Spoof Azureus to avoid ban (requires restart) + 假裝為 Azureus 以避免被踢出 (需要重新啟動) + + + Web UI + Web UI + + + Enable Web User Interface + 啟用 Web UI + + + HTTP Server + HTTP 伺服器 + + + Enable RSS support + 啟用 RSS 支援 + + + RSS settings + RSS 設定 + + + Enable queueing system + 啟用排程系統 + + + Maximum active downloads: + 最大活躍的下載數: + + + Torrent queueing + torrent 排程 + + + Maximum active torrents: + 最大活躍的 torrent: + + + Display top toolbar + 顯示最上方的工具列 + + + Proxy + 代理伺服器 + + + Search engine proxy settings + 搜尋引擎代理伺服器設定 + + + Bittorrent proxy settings + Bittorrent 代理伺服器設定 + + + Maximum active uploads: + 最大活躍的上傳數: + + + Spoof µtorrent to avoid ban (requires restart) + 假裝為 µtorrent 以避免被踢出 (需要重新啟動) + + + Action for double click + Action executed when doucle-clicking on an item in transfer (download/upload) list + 雙擊時的行動 + + + Start/Stop + 開始/停止 + + + Open folder + 開啟資料夾 + + + Show properties + 顯示屬性 + + + Port used for incoming connections: + 連入連線時使用的埠: + + + Random + 隨機 + + + UI + 使用者介面 + + + + DownloadingTorrents + + Name + i.e: file name + 名稱 + + + Size + i.e: file size + 大小 + + + Progress + i.e: % downloaded + 進度 + + + DL Speed + i.e: Download speed + 下載速度 + + + UP Speed + i.e: Upload speed + 上傳速度 + + + Seeds/Leechs + i.e: full/partial sources + 種子/不完整種子 + + + Ratio + 分享率 + + + ETA + i.e: Estimated Time of Arrival / Time left + 預估剩餘時間 + + + qBittorrent %1 started. + e.g: qBittorrent v0.x started. + qBittorrent %1 已啟動。 + + + <font color='red'>%1</font> <i>was blocked</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>被封鎖了</i> + + + Fast resume data was rejected for torrent %1, checking again... + 快速恢復資料被 torrent %1 拒絕, 重新檢查... + + + Url seed lookup failed for url: %1, message: %2 + 找不到 URL: %1 的 URL 種子, 訊息: %2 + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' 已增加到下載清單。 + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' 已恢復下載。(快速恢復) + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' 已經在下載清單裡了。 + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 無法解碼 torrent 檔案: '%1' + + + This file is either corrupted or this isn't a torrent. + 這個檔案不是損壞就是不是一個 torrent 檔案。 + + + Couldn't listen on any of the given ports. + 無法監聽任何給定的埠。 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + 下載 '%1' 中, 請稍候... + + + Hide or Show Column + 隱藏或顯示欄 + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: 埠映射失敗, 訊息: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: 埠映射成功, 訊息: %1 + + + Priority + 優先度 + + + Seeds/Leechers + i.e: full/partial sources + 種子/不完整種子 + + + + FeedDownloader + + RSS Feed downloader + RSS feed 下載器 + + + RSS feed: + RSS feed: + + + Feed name + feed 名稱 + + + Automatically download torrents from this feed + 自動從這個feed 下載 torrent + + + Download filters + 下載過濾器 + + + Filters: + 過濾器: + + + Filter settings + 過濾器設定 + + + Matches: + 符合: + + + Does not match: + 不符合: + + + Destination folder: + 目的地資料夾: + + + ... + ... + + + Filter testing + 過濾器測試 + + + Torrent title: + torrent 標題: + + + Result: + 結果: + + + Test + 測試 + + + Import... + 匯入... + + + Export... + 匯出... + + + + Rename filter + 重新命名過濾器 + + + Remove filter + 移除過濾器 + + + Add filter + 增加過濾器 + + + + FeedDownloaderDlg + + New filter + 新過濾器 + + + Please choose a name for this filter + 請為此過濾器取一個名稱 + + + Filter name: + 過濾器名稱: + + + Invalid filter name + 無效的過濾器名稱 + + + The filter name cannot be left empty. + 過濾器名稱不可以空白。 + + + This filter name is already in use. + 此過濾器名稱已使用。 + + + Filter testing error + 過濾器測試錯誤 + + + Please specify a test torrent name. + 請指定一個測試的 torrent 名稱。 + + + matches + 符合 + + + does not match + 不符合 + + + Select file to import + 選擇匯入的檔案 + + + Filters Files + 過濾器檔案 + + + Import successful + 匯入成功 + + + Filters import was successful. + 匯入過濾器成功。 + + + Import failure + 匯入失敗 + + + Filters could not be imported due to an I/O error. + 因 I/O 錯誤導致過濾器不能匯入。 + + + Select destination file + 選擇目的地檔案 + + + Overwriting confirmation + 確認複寫 + + + Are you sure you want to overwrite existing file? + 你確定要複寫已存在的檔案嗎? + + + Export successful + 匯出成功 + + + Filters export was successful. + 過濾器匯出成功。 + + + Export failure + 匯出失敗 + + + Filters could not be exported due to an I/O error. + 因 I/O 錯誤導致過濾器不能匯出。 + + + + FeedList + + Unread + 未讀 + + + + FilterParserThread + + I/O Error + Input/Output Error + I/O 錯誤 + + + Couldn't open %1 in read mode. + 無法在讀取狀態下開啟 %1 。 + + + %1 is not a valid PeerGuardian P2B file. + %1 不是一個有效的 PeerGuardian P2B 檔案。 + + + + FinishedListDelegate + + KiB/s + KiB/s + + + + FinishedTorrents + + Name + i.e: file name + 名稱 + + + Size + i.e: file size + 大小 + + + UP Speed + i.e: Upload speed + 上傳速度 + + + Seeds / Leechers + 種子/不完整種子 + + + Connected peers + 已連接的使用者 + + + Total uploaded + i.e: Total amount of uploaded data + 全部上傳 + + + Ratio + 分享率 + + + Leechers + i.e: full/partial sources + 不完整種子 + + + Hide or Show Column + 隱藏或顯示欄 + + + Incomplete torrent in seeding list + 在種子清單中的不完整 torrent + + + It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted) + 看起來 torrent '%1' 的狀態已經從 "做種" 變更為 "下載" 了。你要將它移回下載清單嗎? (不然 torrent 會被刪除) + + + Priority + 優先度 + + + + GUI + + Open Torrent Files + 開啟 torrent 檔案 + + + &Yes + 是(&Y) + + + &No + 否(&N) + + + Are you sure you want to delete the selected item(s) in download list? + 你確定要刪除在下載清單中所選擇的項目嗎? + + + Torrent Files + torrent 檔案 + + + Are you sure? -- qBittorrent + 你確定? --qBittorrent + + + Download finished + 下載完成 + + + qBittorrent %1 + e.g: qBittorrent v0.x + qBittorrent %1 + + + Connection status: + 連線狀態: + + + qBittorrent + qBittorrent + + + DL speed: %1 KiB/s + e.g: Download speed: 10 KiB/s + 下載速度: %1 KiB/s + + + UP speed: %1 KiB/s + e.g: Upload speed: 10 KiB/s + 上傳速度: %1 KiB/s + + + Are you sure you want to quit? + 你確定想要離開嗎? + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' 已經移除了。 + + + All downloads were paused. + 所有下載已經暫停。 + + + '%1' paused. + xxx.avi paused. + '%1' 已暫停。 + + + All downloads were resumed. + 所有下載已經恢復繼續下載。 + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' 已恢復下載。 + + + %1 has finished downloading. + e.g: xxx.avi has finished downloading. + %1 已經下載完成。 + + + I/O Error + i.e: Input/Output Error + I/O 錯誤 + + + An error occured when trying to read or write %1. The disk is probably full, download has been paused + e.g: An error occured when trying to read or write xxx.avi. The disk is probably full, download has been paused + 讀取或寫入 %1 時發生錯誤。硬碟可能已經滿了, 將暫停下載 + + + Connection Status: + 連線狀態: + + + Online + 線上 + + + An error occured (full disk?), '%1' paused. + e.g: An error occured (full disk?), 'xxx.avi' paused. + 發生錯誤 (硬碟已滿?), '%1' 已暫停。 + + + Search + 搜尋 + + + RSS + RSS + + + An I/O error occured for torrent %1. + Reason: %2 + e.g: An error occured for torrent xxx.avi. + Reason: disk is full. + Torrent %1 發生了 I/O 錯誤。 +原因: %2 + + + qBittorrent is bind to port: %1 + e.g: qBittorrent is bind to port: 1666 + qBittorrent 綁定埠: %1 + + + DHT support [ON], port: %1 + DHT 支援 [開啟], 埠: %1 + + + DHT support [OFF] + DHT 支援 [關閉] + + + PeX support [ON] + PeX 支援 [開啟] + + + PeX support [OFF] + PeX 支援 [關閉] + + + The download list is not empty. +Are you sure you want to quit qBittorrent? + 下載清單不是空的。 +你確定要離開 qBittorrent? + + + Downloads + 下載 + + + Finished + 完成 + + + Are you sure you want to delete the selected item(s) in finished list? + 你確定要刪除在完成清單中所選擇的項目嗎? + + + UPnP support [ON] + UPnP 支援 [開啟] + + + Encryption support [ON] + 加密支援 [開啟] + + + Encryption support [FORCED] + 加密支援 [強迫] + + + Encryption support [OFF] + 加密支援 [關閉] + + + Alt+1 + shortcut to switch to first tab + Alt+1 + + + Alt+2 + shortcut to switch to second tab + Alt+2 + + + Alt+4 + shortcut to switch to fourth tab + Alt+4 + + + Url download error + URL 下載錯誤 + + + Couldn't download file at url: %1, reason: %2. + 無法從 URL: %1 下載檔案, 原因: %2。 + + + Are you sure you want to delete the selected item(s) from download list and from hard drive? + 你確定要從下載清單及硬碟裡刪除所選擇的項目嗎? + + + Are you sure you want to delete the selected item(s) from finished list and from hard drive? + 你確定要從完成清單及硬碟裡刪除所選擇的項目嗎? + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' 已經永久移除了。 + + + Alt+3 + shortcut to switch to third tab + Alt+3 + + + Ctrl+F + shortcut to switch to search tab + Ctrl+F + + + qBittorrent is bound to port: TCP/%1 + e.g: qBittorrent is bound to port: 6881 + qBittorrent 綁定埠: TCP/%1 + + + UPnP support [OFF] + UPnP 支援 [關閉] + + + NAT-PMP support [ON] + NAT-PMP 支援 [開啟] + + + NAT-PMP support [OFF] + NAT-PMP 支援 [關閉] + + + DHT support [ON], port: UDP/%1 + DHT 支援 [開啟], 埠: UDP/%1 + + + Local Peer Discovery [ON] + 本地下載者搜尋 [開啟] + + + Local Peer Discovery support [OFF] + 本地下載者搜尋支援 [關閉] + + + '%1' was removed because its ratio reached the maximum value you set. + %1 is a file name + '%1' 已經移除, 因為其分享率已經達到你設定的最大值了。 + + + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) + %1 is qBittorrent version + qBittorrent %1 (下載速度: %2KiB/s, 上傳速度: %3KiB/s) + + + DL: %1 KiB/s + 下載: %1 KiB/s + + + UP: %1 KiB/s + 上傳: %1 KiB/s + + + Ratio: %1 + 分享率: %1 + + + DHT: %1 nodes + DHT: %1 個節點 + + + No direct connections. This may indicate network configuration problems. + 沒有直接的連線。這表示你的網路設置可能有問題。 + + + Uploads + 上傳 + + + Options were saved successfully. + 選項儲存成功。 + + + + MainWindow + + &Edit + 編輯(&E) + + + &File + 檔案(&F) + + + &Help + 幫助(&H) + + + Open + 開啟 + + + Exit + 離開 + + + Preferences + 偏好設定 + + + About + 關於 + + + Start + 開始 + + + Pause + 暫停 + + + Delete + 刪除 + + + Pause All + 全部暫停 + + + Start All + 全部開始 + + + Torrent Properties + torrent 屬性 + + + Download from URL + 從 URL 下載 + + + Create torrent + 建立 torrent + + + Preview file + 預覽檔案 + + + Clear log + 清除紀錄 + + + Delete Permanently + 永遠刪除 + + + Visit website + 瀏覽網站 + + + Report a bug + 回報錯誤 + + + Set upload limit + 設定上傳限制 + + + Set download limit + 設定下載限制 + + + Documentation + 文件 + + + Set global download limit + 設定全域下載限制 + + + Set global upload limit + 設定全域上傳限制 + + + Options + 選項 + + + Decrease priority + 降低優先度 + + + Increase priority + 增加優先度 + + + Console + 終端機 + + + + PropListDelegate + + Ignored + 忽略 + + + Normal + Normal (priority) + 一般 + + + High + High (priority) + + + + Maximum + Maximum (priority) + 最高 + + + + RSS + + Search + 搜尋 + + + Delete + 刪除 + + + Rename + 重新命名 + + + Refresh + 更新 + + + Delete selected streams + 刪除所選擇的資源 + + + Refresh RSS streams + 更新 RSS 資源 + + + Add a new RSS stream + 增加新 RSS 資源 + + + <b>News:</b> <i>(double-click to open the link in your web browser)</i> + <b>新聞:</b> <i>(雙擊連結從網路瀏覽器打開)</i> + + + Add RSS stream + 增加 RSS 資源 + + + Refresh all streams + 更新所有資源 + + + RSS streams: + RSS 資源: + + + 2 + 2 + + + Mark all as read + 全部標記為已讀 + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + Download torrent + 下載 torrent + + + Open news URL + 開啟新聞 URL + + + Copy feed URL + 複製 feed URL + + + RSS feed downloader + RSS feed 下載器 + + + New subscription + 新訂閱 + + + Mark items read + 標記項目為已讀 + + + Update all + 全部更新 + + + Update all feeds + 更新全部 feed + + + RSS feeds + RSS feeds + + + Update + 更新 + + + New folder + 新資料夾 + + + 1 + 1 + + + Feed URL + Feed URL + + + Bullet + + + + Article title + + + + + RSSImp + + Please type a rss stream url + 請輸入一個 RSS 資源的 URL + + + Stream URL: + 資源 URL: + + + Please choose a new name for this stream + 請為這個資源選擇新名稱 + + + New stream name: + 新資源名稱: + + + Are you sure? -- qBittorrent + 你確定? --qBittorrent + + + &Yes + 是(&Y) + + + &No + 否(&N) + + + Are you sure you want to delete this stream from the list? + 你確定要從清單裡刪除這個資源嗎? + + + Description: + 描述: + + + url: + URL: + + + Last refresh: + 最後更新: + + + qBittorrent + qBittorrent + + + This rss feed is already in the list. + 這個 RSS feed 已經在清單裡了。 + + + Date: + 日期: + + + Author: + 作者: + + + Please choose a folder name + 請選擇資料夾名稱 + + + Folder name: + 資料夾名稱: + + + New folder + 新資料夾 + + + Are you sure you want to delete these elements from the list? + 你確定要從清單裡刪除這些項目嗎? + + + Are you sure you want to delete this element from the list? + 你確定要從清單裡刪除這個項目嗎? + + + Please choose a new name for this RSS feed + 請為這個 RSS feed 選擇新名稱 + + + New feed name: + 新 feed 名稱: + + + Name already in use + 此名稱已使用 + + + This name is already used by another item, please choose another one. + 此名稱已被另一個項目使用, 請選擇一個新的名稱。 + + + Overwrite attempt + 嘗試複寫 + + + You cannot overwrite %1 item. + You cannot overwrite myFolder item. + 你不能複寫 %1 項目。 + + + Unread + 未讀 + + + + RssItem + + No description available + 沒有可得的描述 + + + + RssStream + + %1 ago + 10min ago + %1 之前 + + + Never + 從不 + + + Automatically downloading %1 torrent from %2 RSS feed... + 自動從 %2 RSS feed 下載 %1 torrent... + + + + SearchCategories + + All categories + 所有類別 + + + Movies + 電影 + + + TV shows + 電視劇 + + + Music + 音樂 + + + Games + 遊戲 + + + Anime + 動畫 + + + Software + 軟體 + + + Pictures + 圖片 + + + Books + + + + + SearchEngine + + Cut + 剪下 + + + Copy + 複製 + + + Paste + 貼上 + + + Clear field + 清除欄位 + + + Clear completion history + 清除已完成的紀錄 + + + Empty search pattern + 沒有搜尋模式 + + + Please type a search pattern first + 請先輸入一個搜尋模式 + + + Results + 結果 + + + Searching... + 搜尋中... + + + Search Engine + 搜尋引擎 + + + Search has finished + 搜尋完成 + + + An error occured during search... + 搜尋時發生錯誤... + + + Search aborted + 搜尋中止 + + + Search returned no results + 沒有搜尋結果 + + + Results + i.e: Search results + 結果 + + + Unknown + 未知 + + + + SearchTab + + Name + i.e: file name + 名稱 + + + Size + i.e: file size + 大小 + + + Seeders + i.e: Number of full sources + 種子 + + + Leechers + i.e: Number of partial sources + 不完整種子 + + + Search engine + 搜尋引擎 + + + + TrackersAdditionDlg + + Trackers addition dialog + 增加 tracker 對話框 + + + List of trackers to add (one per line): + 要增加的 tracker 清單 (一行一個): + + + + about + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + 我想要感謝以下自願翻譯 qBittorrent 的人士: + + + Please contact me if you would like to translate qBittorrent into your own language. + 如果你想將 qBittorrent 翻譯到你的語言, 請與我聯絡。 + + + + addTorrentDialog + + Torrent addition dialog + 增加 torrent 對話框 + + + Save path: + 儲存路徑: + + + ... + ... + + + Torrent content: + torrent 內容: + + + Download in correct order (slower but good for previewing) + 按照順序下載 (較慢但較好預覽) + + + Add to download list in paused state + 以暫停狀態增加到下載清單 + + + Add + 增加 + + + Cancel + 取消 + + + Ignored + 忽略 + + + Normal + 一般 + + + High + + + + Maximum + 最高 + + + Collapse all + 全部折疊 + + + Expand All + 全部展開 + + + Expand all + 全部展開 + + + Torrent size: + torrent 大小: + + + Unknown + 未知 + + + Free disk space: + 剩餘磁碟空間: + + + Download in sequential order (slower but good for previewing) + 按照順序下載 (較慢但較好預覽) + + + + authentication + + Tracker authentication + tracker 驗證 + + + Tracker: + Tracker: + + + Login + 登入 + + + Username: + 使用者名稱: + + + Password: + 密碼: + + + Log in + 登入 + + + Cancel + 取消 + + + + bandwidth_dlg + + Bandwidth allocation + 頻寬分配 + + + KiB/s + KiB/s + + + + bittorrent + + %1 reached the maximum ratio you set. + %1 已經到達你設定的最大比率了。 + + + '%1' was removed permanently. + 'xxx.avi' was removed permanently. + '%1' 已經永久移除了。 + + + '%1' was removed. + 'xxx.avi' was removed. + '%1' 已經移除了。 + + + '%1' paused. + e.g: xxx.avi paused. + '%1' 已暫停。 + + + '%1' resumed. + e.g: xxx.avi resumed. + '%1' 已恢復下載。 + + + '%1' is already in download list. + e.g: 'xxx.avi' is already in download list. + '%1' 已經在下載清單裡了。 + + + '%1' resumed. (fast resume) + '/home/y/xxx.torrent' was resumed. (fast resume) + '%1' 已恢復下載。(快速恢復) + + + '%1' added to download list. + '/home/y/xxx.torrent' was added to download list. + '%1' 已增加到下載清單。 + + + Unable to decode torrent file: '%1' + e.g: Unable to decode torrent file: '/home/y/xxx.torrent' + 無法解碼 torrent 檔案: '%1' + + + This file is either corrupted or this isn't a torrent. + 這個檔案不是損壞就是不是 torrent 檔案。 + + + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> + x.y.z.w was blocked + <font color='red'>%1</font> <i>因為你的 IP 過濾器而被封鎖了</i> + + + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> + x.y.z.w was banned + <font color='red'>%1</font> <i>因為有損壞的分塊而被踢出</i> + + + Couldn't listen on any of the given ports. + 無法監聽任何給定的埠。 + + + UPnP/NAT-PMP: Port mapping failure, message: %1 + UPnP/NAT-PMP: 埠映射失敗, 訊息: %1 + + + UPnP/NAT-PMP: Port mapping successful, message: %1 + UPnP/NAT-PMP: 埠映射成功, 訊息: %1 + + + Fast resume data was rejected for torrent %1, checking again... + 快速恢復資料被 torrent %1 拒絕, 重新檢查... + + + Url seed lookup failed for url: %1, message: %2 + 找不到 URL: %1 的 URL 種子, 訊息: %2 + + + Downloading '%1', please wait... + e.g: Downloading 'xxx.torrent', please wait... + 下載 '%1' 中, 請稍候... + + + '%1' is not a valid magnet URI. + '%1' 不是一個有效的 magnet URI。 + + + Recursive download of file %1 embedded in torrent %2 + Recursive download of test.torrent embedded in torrent test2 + 遞迴下載在 torrent %2 裡的檔案 %1 + + + Unable to decode %1 torrent file. + 無法解碼 torrent 檔案 %1 。 + + + + createTorrentDialog + + Cancel + 取消 + + + Torrent Creation Tool + torrent 建立工具 + + + Torrent file creation + 建立 torrent 檔案 + + + Announce urls (trackers): + 發佈 URL (tracker): + + + Comment (optional): + 註解 (選擇性): + + + Web seeds urls (optional): + 網頁種子 URL (選擇性): + + + File or folder to add to the torrent: + 要增加到 torrent 裡的檔案或資料夾: + + + Add a file + 增加檔案 + + + Add a folder + 增加資料夾 + + + Piece size: + 分塊大小: + + + 32 KiB + 32 KiB + + + 64 KiB + 64 KiB + + + 128 KiB + 128 KiB + + + 256 KiB + 256 KiB + + + 512 KiB + 512 KiB + + + 1 MiB + 1 MiB + + + 2 MiB + 2 MiB + + + 4 MiB + 4 MiB + + + Private (won't be distributed on DHT network if enabled) + 私人的 (如果啟用, 不會分佈到 DHT 網路) + + + Start seeding after creation + 建立後開始做種 + + + Create and save... + 建立且儲存... + + + Progress: + 進度: + + + Add file + 增加檔案 + + + Add folder + 增加資料夾 + + + + createtorrent + + Select destination torrent file + 選擇 torrent 檔案目的地 + + + Torrent Files + torrent 檔案 + + + No input path set + 沒有設定輸入路徑 + + + Please type an input path first + 請先輸入輸入的路徑 + + + Torrent creation + 產生 torrent + + + Torrent was created successfully: + 已經成功建立 torrent: + + + Select a folder to add to the torrent + 選擇要增加到 torrent 的資料夾 + + + Please type an announce URL + 請先輸入發佈的 URL + + + Torrent creation was unsuccessful, reason: %1 + 建立 torrent 不成功, 原因: %1 + + + Announce URL: + Tracker URL + 發佈的 URL: + + + Please type a web seed url + 請先輸入網頁種子 URL + + + Web seed URL: + 網頁種子 URL: + + + Select a file to add to the torrent + 選擇要增加到 torrent 的檔案 + + + No tracker path set + 沒有設定 tracker 路徑 + + + Please set at least one tracker + 請先設定至少一個 tracker + + + Created torrent file is invalid. It won't be added to download list. + 建立的 torrent 檔案是無效的。它不會被加入到下載清單。 + + + + downloadFromURL + + Download Torrents from URLs + 從 URL 下載 torrent + + + Only one URL per line + 每條線僅一個 URL + + + Download + 下載 + + + Cancel + 取消 + + + Download from urls + 從 URL 下載 + + + No URL entered + 沒有輸入 URL + + + Please type at least one URL. + 請輸入至少一個 URL。 + + + + downloading + + Search + 搜尋 + + + Log + 紀錄 + + + IP filter + IP 過濾 + + + Start + 開始 + + + Pause + 暫停 + + + Delete + 刪除 + + + Clear + 清除 + + + Preview file + 預覽檔案 + + + Set upload limit + 設定上傳限制 + + + Set download limit + 設定下載限制 + + + Delete Permanently + 永遠刪除 + + + Torrent Properties + torrent 屬性 + + + Open destination folder + 開啟目的地資料夾 + + + Name + 名稱 + + + Size + 大小 + + + Progress + 進度 + + + DLSpeed + 下載速度 + + + UpSpeed + 上傳速度 + + + Seeds/Leechs + 種子/不完整種子 + + + Ratio + 分享率 + + + ETA + 預估剩餘時間 + + + Buy it + 購買 + + + Priority + 優先度 + + + Increase priority + 增加優先度 + + + Decrease priority + 降低優先度 + + + Force recheck + 強迫重新檢查 + + + Copy magnet link + 複製 magnet link + + + + engineSelect + + Search plugins + 搜尋外掛 + + + Installed search engines: + 已安裝的搜尋引擎: + + + Name + 名稱 + + + Url + Url + + + Enabled + 已啟用 + + + You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 你可以在這裡取得新的搜尋引擎外掛: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + Install a new one + 安裝新的 + + + Check for updates + 檢查更新 + + + Close + 關閉 + + + Enable + 啟用 + + + Disable + 停用 + + + Uninstall + 反安裝 + + + + engineSelectDlg + + True + + + + False + + + + Uninstall warning + 反安裝警告 + + + Some plugins could not be uninstalled because they are included in qBittorrent. + Only the ones you added yourself can be uninstalled. +However, those plugins were disabled. + 有些外掛不能反安裝, 因為他們包含在 qBittorrent 裡面。 +只有你自己安裝的可以反安裝。 +然而, 這些外掛已經停用。 + + + Uninstall success + 反安裝成功 + + + Select search plugins + 選擇搜尋外掛 + + + qBittorrent search plugins + qBittorrent 搜尋外掛 + + + Search plugin install + 安裝搜尋外掛 + + + qBittorrent + qBittorrent + + + A more recent version of %1 search engine plugin is already installed. + %1 is the name of the search engine + 已安裝一個更新版本的 %1 搜尋引擎外掛。 + + + Search plugin update + 更新搜尋外掛 + + + Sorry, update server is temporarily unavailable. + 抱歉, 更新伺服器暫時不可用。 + + + All your plugins are already up to date. + 你所有的外掛都已經是最新版本。 + + + %1 search engine plugin could not be updated, keeping old version. + %1 is the name of the search engine + %1 搜尋引擎外掛不能升級, 將保持舊版本。 + + + %1 search engine plugin could not be installed. + %1 is the name of the search engine + %1 搜尋引擎外掛不能安裝。 + + + All selected plugins were uninstalled successfully + 所有選擇的外掛都已經成功反安裝了 + + + %1 search engine plugin was successfully updated. + %1 is the name of the search engine + %1 搜尋引擎外掛已經成功更新。 + + + %1 search engine plugin was successfully installed. + %1 is the name of the search engine + %1搜尋引擎外掛已經成功安裝。 + + + Search engine plugin archive could not be read. + 無法讀取搜尋引擎外掛壓縮檔。 + + + Sorry, %1 search plugin install failed. + %1 is the name of the search engine + 抱歉, 安裝搜尋外掛 %1 失敗。 + + + New search engine plugin URL + 新搜尋引擎外掛 URL + + + URL: + URL: + + + Yes + + + + No + + + + + misc + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + Unknown + Unknown (size) + 未知 + + + < 1m + < 1 minute + < 1 分鐘 + + + %1m + e.g: 10minutes + %1 分鐘 + + + %1h%2m + e.g: 3hours 5minutes + %1 小時 %2 分鐘 + + + %1d%2h%3m + e.g: 2days 10hours 2minutes + %1 天 %2 小時 %3 分鐘 + + + + options_imp + + Options were saved successfully. + 選項儲存成功。 + + + Choose scan directory + 選擇掃描的目錄 + + + Choose a save directory + 選擇儲存的目錄 + + + Choose an ip filter file + 選擇一個 IP 過濾檔案 + + + Filters + 過濾器 + + + + pluginSourceDlg + + Plugin source + 外掛來源 + + + Search plugin source: + 搜尋外掛來源: + + + Local file + 本地檔案 + + + Web link + 網頁連結 + + + + preview + + Preview selection + 選擇預覽 + + + File preview + 預覽檔案 + + + The following files support previewing, <br>please select one of them: + 下列檔案支援預覽, <br>請選擇其中一個: + + + Preview + 預覽 + + + Cancel + 取消 + + + + previewSelect + + Preview impossible + 不可預覽 + + + Sorry, we can't preview this file + 抱歉, 我們無法預覽這個檔案 + + + Name + 名稱 + + + Size + 大小 + + + Progress + 進度 + + + + properties + + Torrent Properties + torrent 屬性 + + + OK + 確定 + + + Files contained in current torrent: + 在目前 torrent 裡的檔案: + + + Size + 大小 + + + Trackers: + Trackers: + + + None - Unreachable? + 無 - 無法連線? + + + Progress + 進度 + + + Main infos + 主要資訊 + + + Current tracker: + 目前的 tracker: + + + Total uploaded: + 全部上傳: + + + Main info + 主要資訊 + + + Torrent information + Torrent 資訊 + + + Total downloaded: + 全部下載: + + + Total failed: + 全部失敗: + + + Torrent content + torrent 內容 + + + Download in correct order (slower but good for previewing) + 按照順序下載 (較慢但較好預覽) + + + Save path: + 儲存路徑: + + + Torrent infos + torrent 資訊 + + + Creator: + 建立者: + + + Torrent hash: + torrent 雜湊: + + + Comment: + 註解: + + + Current session + 目前作業階段 + + + Share ratio: + 分享率: + + + Trackers + Trackers + + + Priorities: + 優先度: + + + Normal: normal priority. Download order is dependent on availability + 一般: 一般優先度。依照可得性決定下載順序 + + + High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability + 高: 高於一般優先度。優先下載可取得性相同的分塊, 而不是可取得性較低的 + + + Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority + 最大: 最大優先度。忽略可用性, 分塊優先於其他所有優先度較低的分塊 + + + File name + 檔案名稱 + + + Priority + 優先度 + + + qBittorrent + qBittorrent + + + Trackers list can't be empty. + tracker 清單不能是空白的。 + + + Ignored: file is not downloaded at all + 忽略: 檔案不會被下載 + + + Ignored + 忽略 + + + Normal + 一般 + + + Maximum + 最高 + + + High + + + + Unknown + 未知 + + + Url seeds + URL 種子 + + + New url seed: + 新 URL 種子: + + + This url seed is already in the list. + 這個 URL 種子已經在清單裡了。 + + + New url seed + New HTTP source + 新 URL 種子 + + + The following url seeds are available for this torrent: + 下列是這個 torrent 可使用的 URL 種子: + + + Priorities error + 優先度錯誤 + + + Error, you can't filter all the files in a torrent. + 錯誤, 你不能過濾 torrent 裡面的全部檔案。 + + + Downloaded pieces + 已下載的分塊 + + + Collapse all + 全部折疊 + + + Expand all + 全部展開 + + + ... + ... + + + Choose save path + 選擇儲存路徑 + + + Save path creation error + 建立儲存路徑錯誤 + + + Could not create the save path + 無法建立儲存路徑 + + + + search_engine + + Search + 搜尋 + + + Search Pattern: + 搜尋模式: + + + Stop + 停止 + + + Status: + 狀態: + + + Stopped + 已停止 + + + Download + 下載 + + + Search engines... + 搜尋引擎... + + + + seeding + + Search + 搜尋 + + + The following torrents are finished and shared: + 下列 torrent 已經完成且分享了: + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + <u>注意:</u> 你下載完 torrent 之後繼續分享對整個網路的使用者是有益處的。 + + + Start + 開始 + + + Pause + 暫停 + + + Delete + 刪除 + + + Delete Permanently + 永遠刪除 + + + Torrent Properties + torrent 屬性 + + + Preview file + 預覽檔案 + + + Set upload limit + 設定上傳限制 + + + Open destination folder + 開啟目的地資料夾 + + + Name + 名稱 + + + Size + 大小 + + + Upload Speed + 上傳速度 + + + Connected peers + 已連接的使用者 + + + Seeds / Leechers + 種子/不完整種子 + + + Leechers + 不完整種子 + + + Ratio + 分享率 + + + Buy it + 購買 + + + Total uploaded + 全部上傳 + + + Priority + 優先度 + + + Increase priority + 增加優先度 + + + Decrease priority + 降低優先度 + + + Force recheck + 強迫重新檢查 + + + Copy magnet link + 複製 magnet link + + + + subDownloadThread + + Host is unreachable + 無法連線到主機 + + + File was not found (404) + 找不到檔案 (404) + + + Connection was denied + 連線被拒絕 + + + Url is invalid + URL 是無效的 + + + Connection failure + 連線失敗 + + + Connection was timed out + 連線逾時 + + + Incorrect network interface + 錯誤的網路介面 + + + Unknown error + 未知的錯誤 + + + Could not resolve proxy + 無法解析代理伺服器 + + + I/O Error + I/O 錯誤 + + + + torrentAdditionDialog + + Unable to decode torrent file: + 無法解碼 torrent 檔案: + + + This file is either corrupted or this isn't a torrent. + 這個檔案不是損壞就是不是 torrent 檔案。 + + + Choose save path + 選擇儲存路徑 + + + Empty save path + 輸入儲存路徑 + + + Please enter a save path + 請輸入儲存路徑 + + + Save path creation error + 建立儲存路徑錯誤 + + + Could not create the save path + 無法建立儲存路徑 + + + Invalid file selection + 無效的選擇檔案 + + + You must select at least one file in the torrent + 你必須至少選擇 torrent 裡的一個檔案 + + + File name + 檔案名稱 + + + Size + 大小 + + + Progress + 進度 + + + Priority + 優先度 + + + Unknown + 未知 + + + (%1 left after torrent download) + e.g. (100MiB left after torrent download) + (在 torrent 下載後還剩下 %1) + + + (%1 more are required to download) + e.g. (100MiB more are required to download) + (還有 %1 需要下載) + + + diff --git a/src/login.ui b/src/login.ui new file mode 100644 index 000000000..21387387f --- /dev/null +++ b/src/login.ui @@ -0,0 +1,299 @@ + + + + + authentication + + + + 0 + 0 + 311 + 231 + + + + Tracker authentication + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 39 + 39 + + + + + + + + + + + + 16777215 + 39 + + + + + Sans Serif + 13 + 75 + false + true + false + false + + + + Tracker authentication + + + + + + + + + 0 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Tracker: + + + + + + + + 220 + 0 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + + + + + + + + + + Login + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Username: + + + lineUsername + + + + + + + + + + + + 0 + + + 6 + + + + + + 68 + 0 + + + + Password: + + + linePasswd + + + + + + + QLineEdit::Password + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Log in + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + cancelButton + clicked() + authentication + reject() + + + 245 + 195 + + + 179 + 230 + + + + + linePasswd + returnPressed() + loginButton + click() + + + 139 + 158 + + + 122 + 199 + + + + + lineUsername + returnPressed() + linePasswd + setFocus() + + + 199 + 130 + + + 198 + 157 + + + + + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 000000000..89d8cd61f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,229 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include +#ifdef QT_4_4 +#include +#include +#include +#else +#include +#include +#endif +#include +#include "qgnomelook.h" +#include +#include +#ifdef Q_WS_WIN +#include +#endif +#ifdef Q_WS_MAC +#include +#endif +#ifndef Q_WS_WIN +#include +#include +#include "stacktrace.h" +#endif + +#include +#include "GUI.h" +#include "misc.h" +#include "ico.h" + +QApplication *app; + +#ifndef Q_WS_WIN +void sigtermHandler(int) { + qDebug("Catching SIGTERM, exiting cleanly"); + app->exit(); +} +void sigsegvHandler(int) { + std::cerr << "\n\n*************************************************************\n"; + std::cerr << "Catching SIGSEGV, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; + print_stacktrace(); + std::raise(SIGINT); + std::abort(); +} +#endif + +void useStyle(QApplication *app, int style){ + switch(style) { + case 1: + app->setStyle(new QPlastiqueStyle()); + break; + case 2: + app->setStyle(new QGnomeLookStyle()); + break; + case 3: + app->setStyle(new QMotifStyle()); + break; + case 4: + app->setStyle(new QCDEStyle()); + break; +#ifdef Q_WS_MAC + case 5: + app->setStyle(new QMacStyle()); + break; +#endif +#ifdef Q_WS_WIN + case 6: + app->setStyle(new QWindowsXPStyle()); + break; +#endif + default: + if(app->style()->objectName() == "cleanlooks") { + // Force our own cleanlooks style + qDebug("Forcing our own cleanlooks style"); + app->setStyle(new QGnomeLookStyle()); + } + } +} + +// Main +int main(int argc, char *argv[]){ + QFile file; + QString locale; + bool no_splash = false; + if(argc > 1){ + if(QString::fromUtf8(argv[1]) == QString::fromUtf8("--version")){ + std::cout << "qBittorrent " << VERSION << '\n'; + return 0; + } + if(QString::fromUtf8(argv[1]) == QString::fromUtf8("--help")){ + std::cout << "Usage: \n"; + std::cout << '\t' << argv[0] << " --version : displays program version\n"; + std::cout << '\t' << argv[0] << " --no-splash : disable splash screen\n"; + std::cout << '\t' << argv[0] << " --help : displays this help message\n"; + std::cout << '\t' << argv[0] << " [files or urls] : starts program and download given parameters (optional)\n"; + return 0; + } + if(QString::fromUtf8(argv[1]) == QString::fromUtf8("--no-splash")){ + no_splash = true; + } + } + // Set environment variable + if(putenv((char*)"QBITTORRENT="VERSION)) { + std::cerr << "Couldn't set environment variable...\n"; + } + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + //Check if there is another instance running +#ifdef QT_4_4 + QLocalSocket localSocket; + QString uid = QString::number(getuid()); +#else + QTcpSocket localSocket; +#endif +#ifdef QT_4_4 + localSocket.connectToServer("qBittorrent-"+uid, QIODevice::WriteOnly); +#else + int serverPort = settings.value(QString::fromUtf8("uniqueInstancePort"), -1).toInt(); + if(serverPort != -1) { + localSocket.connectToHost(QHostAddress::LocalHost, serverPort, QIODevice::WriteOnly); +#endif + if (localSocket.waitForConnected(1000)){ + std::cout << "Another qBittorrent instance is already running...\n"; + // Send parameters + if(argc > 1){ + QStringList params; + for(int i=1;isetStyleSheet("QStatusBar::item { border-width: 0; }"); + QSplashScreen *splash; + if(!no_splash) { + splash = new QSplashScreen(QPixmap(QString::fromUtf8(":/Icons/skin/splash.png"))); + splash->show(); + } + // Open options file to read locale + locale = settings.value(QString::fromUtf8("Preferences/General/Locale"), QString()).toString(); + QTranslator translator; + if(locale.isEmpty()){ + locale = QLocale::system().name(); + settings.setValue(QString::fromUtf8("Preferences/General/Locale"), locale); + } + if(translator.load(QString::fromUtf8(":/lang/qbittorrent_") + locale)){ + qDebug("%s locale recognized, using translation.", (const char*)locale.toLocal8Bit()); + }else{ + qDebug("%s locale unrecognized, using default (en_GB).", (const char*)locale.toLocal8Bit()); + } + app->installTranslator(&translator); + app->setApplicationName(QString::fromUtf8("qBittorrent")); + app->setQuitOnLastWindowClosed(false); +#ifndef Q_WS_WIN + signal(SIGTERM, sigtermHandler); + signal(SIGSEGV, sigsegvHandler); +#endif + // Read torrents given on command line + QStringList torrentCmdLine = app->arguments(); + // Remove first argument (program name) + torrentCmdLine.removeFirst(); + GUI *window = new GUI(0, torrentCmdLine); + if(!no_splash) { + splash->finish(window); + delete splash; + } + int ret = app->exec(); + delete window; + delete app; + return ret; +} + + diff --git a/src/menuicons/128x128/apps/qbittorrent.png b/src/menuicons/128x128/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..69c5ab73bfa5e51c0f20dd4d368b704f586d65fb GIT binary patch literal 21783 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 KMNUMnLSTY&_Z(3G literal 0 HcmV?d00001 diff --git a/src/menuicons/16x16/apps/qbittorrent.png b/src/menuicons/16x16/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..cff0194ec7077f939af2a341676b97b8365329bd GIT binary patch literal 954 zcmV;r14aCaP)LsPI-U(||HDQy)?m8xJwg!<-#6$HT- z1ws0tMT&)@R`eycL@L2(tAT8jG)XtByV)c=+1dZu-P!rSPNEi-;JMuU@Nv%hz6}j>)ksZNNHR~zr(cc#%=y`lP3^|>*x_eK4?TbS zRgYRlU2eb;pwUv%)(m*uE)a*4SuH|Qb*L>FuFyctOO*E1^`9nakH^D5`t*x07uHr_ z6ALUK1RLmpoAskmZldCtZ9oWhLg)%Q9c`qS(s<~}=U(7Be<$77pV$)!#S(2rfjAYjWp(LxQH8s!-gV~gb#f*ghZDCZ(HMsch?TMk`y)Gdd?=@@}#dukyvPH*W z6+GvI5Q!k0m%)0x@QXD}-pGNbDfGoc&ZLy{J%VsgBOuI`-bj7W$xRtS6(`GQkENq&Hedjq`f{LfAr+&>j$4Weu4|d2TZs( z8H}abm9^B(%U_)RwZ&!Cu)V3|VAg<(oPc6)umfid> c_YVOE0JW8 z-7wHiH*;u%fCkevhG`DNG>pw+Y-5ZpEMv=(s!CGr+pBu}k}vnnxOeXV-+Lo&L`E*J zq>?RLsgugAeD7sOM*Pe7fB(kdwcE>aV=wXN-EQI~{`|GuUAi!@ovYseW_L*e#DG70 zO*vjufS2{$^b>a0<@rlF*WCnKba}p8g?a5JZ;97V!LEcndPkvhx+nnjP=?(qK~#|K z*SU2p(fe!g=`{t|m6aDggx&nEV?8=C3IdVWUrq(!5hbu+=RJNWdS|aG!`G(*u*gM^ z3cV8%W+&#k)8l8|l;)*Epl*W9W1jOKKNB$?gvBU@_<9tGul4UJ27onjLLT?r?ecn5 z8RB43w{tJLC_xnOM+Ms!c(2Rry_7?Ai6z+AgED+QDL@={j}zX0celsS;vfigvD$Hh z-z%85ua#qc4<5ODF|WnlMaP-X}LU^3>Hureb z<6gsSdyQ7RRckhzwR){ysZ^`w?d|Q-%IaF_%$YM=J3BkIh_$w@wr44W*F!P97^R4d z8Te}o@anbr-7LH<7#@b$feVXTrvTbZ00wxuF9Bj>>gdfO8Ab|2*sJ>rJf6yQ}R z_->4~cddIOBJ>Gc;M1vO>iF^FV|(_@j2DJS_wJe7JNMATZ=5)F`rc`In;IT2>`5hH zsxE)IB5iU_ieIb6fpZT$E^WK8?j%C^JVurnQy-^n>cv<0XGT7 zQe6pqtJMb2^CW-?Lwgi(5_h4cW{{K=3+aOTCp|J?*3Y;AUqKQH2h!5L6tXUiX6Z|K zbq^NT*H&*{yL{=&r$70L7oK?Hi5t>yY%DLYtY5r%aXS($dzM1PJ&y~fzh)GHeT^J@ zH=%bT!k*}Ir@vX4pD#>IPK;;sBm2JRgCCrKeW$E_f zc4Kf7)?@UZ)OY&bLLr~svuAd4YG!W!`@aAC_rCeD$L^mwxbN*d6@Y4uOAFs5>yE;X zaE2qKk^gZmaGsWSPYb=Hh0U93rW`wY;?Q{FlD?g)e{jKmNxrU%GsGX=P=lw7I!ijS+tP z&Lc5Ilu3eDqcX6s0gE38b&{6FPevXSuInZyCMHJ5C#NRf{qA?qeE$#p$h#Mg9DMuc z4qEw^wDK*o@+9CW+-*THr!6B=Pb!1wsYfB0;y#%YQi(=jD4moz-GQtWx^&tl+@6;A zRML@_Swa@%eV7v)_O_)K$&Y}Rd~C|kY|?Q^569)4?GRtxq?}ad_Tu{2(28h zdF})r1HX^_@-TwRP>|}>=GSiBT73Es|KOva`@=u{!*feZx3@PoHg}rMX2TNrmZcP} z9?S* zlqDpqHw7ta5H~Qb4BAsT+AGNCu4@!l9b-ZU*3+YDD5jvcy|w-2fB3>vPdxtk<4=9+ zQ=hs~tyY_jMx$m4epDH}7ZFyfidBw!++;Ji^efA0C`|Mnvv z`JK;x`Ol@`C#97{fgdkO0V$*;#Bsy${j21L5>}PU zuwH4yW~Bw&QW>NpQ^M|8Lhl6L!9{x2{LE3Y33{;cp#)Eh+O;!hpa1k9|M4IH?Jxe~ zFFt1pebe#=tr$8r3XQ(1V*~aou=;Uaz8ewzWJK`s_q^YD{MWzZ{ztyygI;22JeAI+ z95=~G@bw*qy=??usOKp75(&YW7W&EI6bwtN?>g+OQt&$zL4TK>ng^>pE!ZfxVMoFy z$|Y!_w-q9xVG@)7GtcqoGFB18Y1Yg@?dF%h^yN=}{LlaVGg1+rw*_|ppr@&gi+HMBANrVT>+f7(2OJ$Hy3B}J?epd^-YdnL7NJddG`G$%x zloYi@vvlS2PkrGN|Midl=+nRZyT5xaMiH7_yunv>?!f&j5_}e6cvytTHxLH}J!3s) z^>g_4Z~yj#zx6x6_iNws&F_APo665zUEWHvWCq+sTEYP)g`5-9fR|Om%-`IeA<;H7XPUr zA!`bj^xW*kp@Roczv5TThw-uT;{W}}|L;$I-v___9S^%zW|rYfx`7NM#Dr%DeJ{8{y}4uQfQ~ z|4C`>k4T|EG@T`^kC@+KUt1+o3i~sPU&iwZsR)krgbd2{HniG8m0tM4zWVMY{Q9a0 zf{cQ-xRXlein9;C?w)(!^u~v0j~qSL{M_e0w<3dN4}yeZoUjkV?0sD-KvekSD9x00 zH`YF&Qmw)bU-|*NY#o^)@zS-i+7F=3fhxE`eutbUk9w81Y0MdpC ze};2OY4I~~WKT{C1zLQ^ufh3Ry&>*LkC2y&fH6)=dO6HDRGXa6iAlK8-GWjop)E9Y z1gFWJ-1OYugAc#{-s2Cv{=UN6`o_xT%a=>mHH)+IgZ4#y-6%jW%kM_0%(P|o@m|}z z|KOqj^q+tKXTRqIANZEz$BrJ87tBRVg);oi`P)PZrn5yrQjiotLYw3YhUo=JOT=TF_VCz4Dj*mBZE|L^8l=yya(69Z@htgXf!=&a*=>Udh&Jm z-gE5r_nn@do1JT(J$rVoQmM4G$BwdiqKB}vuQvsV%j&u@yuN`v2J7R$Tkrk0?|jqG z|NOuH$$#{&cRW@omUU=sY zN&K%?QhT@G2ERYTA!NBQd);UQ8Hu(g1R&xKxUOQwpCLqQv=C0R?986IgO5D)z=7jO z4yT@d?zzSF_4RFSuzCr6v^rz66Tkf&WJ6y2Zr$q&8rXMXl)e(b^f zUw0ZWKwA~Okb4(Qz|EBsT)Dj|jnk0)b}15mOknMu$dK^Qj;1BfXLm=EU#UwdUdE5t zu!u6+nB$Nyl^fWEAbbKq__a!OlKnUV|KE`CU!G&fO=qXyaQ~@e$B!N!YqnbJH*YSM z8jU)SK%#!%f_*(HKwPkEQ<{e5k&+Ch)Av90*uVI>|Kq!V;0J&7eG7Xg50vXXz)xBM zP#4Z!S%J0fD!4NE6#`2X95^wTgF`bpy2z$TtXu2TOBT$R?ag|;FMIjk%G~k%kvEX% zDCIg-YSCy3KQI=)(Kdghy#Z6NV~Iu^+@X6<9y#&w!;j326!Vp<*REsHX*~jozN+x1 z`xO#?X8@+hSpLcz-uRYBfBxV8yAQqZTfgOPPBK}RXp$A^ScW%!Vzi{E=io8`UC15?!fOw@9#C-(? zKPvnQ2-ohUBiugTTaUi^tq=Y3hadmBw?2H|p^ZwLl2_nYKB~erZG@!Yx8SLBw;_|s zz~Q-3I59s2dnDu$8o#o;4d#UySOLCLSgYS(a$VA0%({?EI+QcP02y;Aq&&j%23l!M zgAOVIR?VUTN~SW?58QwHu!Ka(GiT1;Tv}S%>7oRp%fH#ziUM@2;*18nY0K)nj^n^L zz582U|Es_CpMT+==E znB{QrYK?O~h;WNn3NE>?pzz!EJPC{HOhqievv>cY zg>QW4dyf6$uRQ*L&d*PdZDYbw7i$G)j|Gnmh`G3OYZHbu9PT?j4I}wXC*%=#ssKE6 zwS%W$t$ff+3>H|RgO=`t5F%#oi?4_(i;i?@t;NzO4lkU3``h0> za_#EX>x+wvUAdKk@_r()M`z? zQqfp`(@_<)20GNWwY6P>`OzedkB>nxrsode2l3vzpfM(J_-d2?*fa*$63K)=@Mn;^ z4i*y=VOhwCghcWz!={9x?MT&splTv~!R6<*xCf=02Me=P$KLX$H%(Nl)m!J!pD)$x zb3iSUZnkKuf@$)gHxkT$w~#_G zb)i^m2aErqP$-5kwupltB1Y~-EVKwEh6cbgv9RSO|JOV8=(yX5DeUI_-ZB>YYPu=e zussunBxS}>38?rXdhYN)76ixi*N%FQN-#MwcJSc`@1K(JcJa)aGuyRVjSpZ(?rPbD z`w9ua6QMezuqQJ-IyUpCpLyoPGt)EsL3lw&xbKs}4|q`#Y$$|3YBw8Dt5#rWC=cmO z#v&E^z#9=@Y9l?diZXz;7kAky?CSklr(oOP&({OS29_@TlgUDwT1Gc&s)@+7gZh@p z93|5Qbvj1FA7KaE@Ni-8{ijb&C6ex~XP*CO>)_=Co?iS zHvQ*MzVI8v#o=kk5y4y>W95ZuFbDPAjsO@V;ce8b&}`IUcw__;$wVw{30p-8a-@gh zJUp{UL;!7^MeQ2gcD!gQ)h_Q{&G~@G5_l^S_5cx2N3{+Bn(ObcWXPtW60{|b->h;8 zapJ)yi*Pz7UxSQNv6x@D@ASz@`R^O31QHJM9Fu|7HBZ3?Iz?=7AOMIy4)f99yVhn?C&P1HIAM$7E*{#yQ?70crgR@S{*i}0dJdx zSYZ4^#JT!XD@8#vQt zu*Dy(U(_>`=(P%a-4bz#bFyCgv9Q zFZ|ob|L_Nn9zXd=n+q1a0fXrCPT{vk2+9jqt?rO3AD@_r(Dp(JJm(#xwTL9HM4x1q zxPye(?zsM!!PgH|)fywv(ZBP(V?5Dsd_*eg!cZmwTRT6B*7Po#uPDutcc(Y zVPmEksTZBU++VW0v6DUS%>EeB`T3(;k z%_=q6B$7!#h7+t)dWGe^@f8^uyNBi{_r2*&k7hpena^C*m81!Hg{DimFQfIh+Zdz8 zZ6@Hw!nWG{-b1Gz|L8~mch}8LP)Cww@e__CPaKDhQWaLVns8&S4mVcoaCN0Fv7<+B zH) zZpYLSW5oP^*icxohy~`HYlu@AN)gkuxUvH~bx*?3bVn{On*K$fkHUu}L`~|=iG%Y8 zPaHeieDd#~y0WpcUe>b7doV*UOWlzBG6}z}0JiYkj89(PcMcpr@!)TK^bh{m{fF*3 zw7paJr@-O^&a^D;U^zoc;z|KqH4Z!S?5yv!sL<`;R0bBt)8rj+){ScHra2#k@o}&f zw*_BBa6NS4_@N7y2b(P!1mkxLR=cq~o%asjKk5<0U~vN2F+tqVB1R$l`(T|rh@K0- z082?IdhD^h>b$$Pxt?9klwl{7?bA{1DGF_TLGmE$y%cvAyKN_uIB4Wi^w znAd77J$L5JVx>~?Ps81ULhj2T{Qb%tQ26=l9(?4{|Lqrk<)`2H*c*@EzO@5w6n+yR z$^UAV8eG118`@3=++>z4ew$grY<*0w5;ltFST zm8R=M)2>BCc&r(zIF6;(;!r5$CXOFDJoNMzzj*$_g$uW}EZwb6i#t|;ex(jJ-I-0K zbBz!F@P|I|KYZVJzJ2j}S&tZIzE!{y+RImOKto#n^iYw6yrqRdD=q%LQuyb`)1)Ze z^r(j5j)nEoh=-5E&No9%81{g>(y+?N6S zM@txoI`1RyScx z4JYB$-U7Ahq3{#jF_s@7V)>!7R^GSnoh1Mwf{(kE3fOnvOW5zE+`%Xo3K~;Z7{`}m z0NF%gmjBM@GW~N4^7qjC*BecBNxH!E)}5J@(TxJv(Oe374?oFSfu*ZhB}s##66mnuO29jPjk`>wB+9{ zu2yKP4kgag8J{jRu*d$l-{0*3b)e;ka$|cYMx1kJ&%JQ<+O-mdSHp^zgBHD01&AAC z60P&8{`9~64?p#u|L$AfyuMOlSTu!n7xn|W35P7k_I3$wEv-RrWLlm$M|uY}oEDq0 z_fKY}0u*En05ry&^R^Ox=pyt&M3f@l3i582z0aNBfrTHW;LYaOlS#CaE|f|ozucfO zl)ObTUXMSan{G&#WqHlst;Gk_YzA&W(=@m;Uy%pFOv;v(qo#DDJib*h#PG^fp`g z*|F0P9(msfzW2MPCTAvb>k0}#7ER$vz z%A;~ckjUUW#Mr@=V2O>i*Obm~5xUDpI)CT9i4A?&v zO?nNFj0mW}X$8cc) z1(4^iA{C$}y+FTmAl^kndNmA*P&r8WC!tqFkmW)ngySZ0;MP{T0V~^ef^^vEl+I@S zp=3T4?pOtmPO#|)jaWL9Ef&+v`^&%j#M9C{wqm>hztfn&eF?%Jt@Sb1AAb5@{a@ep zrpMm)#&(NmNx0jbgd4#fa@(65o3MC$6$)dsG9YFo^ay?M5wpCf=F?Eju!w~gF_dQ< z6p9IsyTt*}1@CtRwlMG=dX+nL(F3L%M<8N}T?vPVi$nc8$c0vbS~I2!G@9{^mOY5h z#!dQF_lVpCYE3<^32|blt4?Dy2;5hD)0}Jze z7v|Ug?9cwc7cm}$-Wx0LngTdoXitBZj|_B@Kk}3R{Ac#=-8YLCsofR|{^0P=1X}+l ztZ!E2U*y0^Wc+L|J<5|aU*I&(B&o|A0=#N6vSGpJ9l@`N#0d~_^<8RvL<~gOb?I{V zz_@z_33Ng;eQbEXMg~-Xa-~j6z!>YnP(_44=DUV^1R`ye-5x^)<9bez`8y2k(F?4t zZ^2rr32rh$ghmqUw-T3Uw8k}dZR&>ziAXeo{Xl%LOVM(sLMwunIpj`;n%@$yRr@UEM#FM zpYq)(_vhDhjqO3l0DK5v{4}<_ybV*i7TkYik}iBW%WGLL9=<3%^t>14 z8DnX?7L|$JHL-LlUAD^_>=7>D2YXC?S27MQOCivY8|-Z|=ZmsUjhe43HB^`W2NVGx31%mBBGk2tY$2 z3^APK!P)TwbKDo6c;bom82rz7>jef;fNsm_Qjt1;@$Vo1gWuSH;NXJ9`;1tfwg{{| zjwna3fH;t))IQv{s`sf@N>JWjhSU2eU}`i^$L?9yKM-23msIOzcKUaK3yb*?AttEP z(i=u*Kzfr8MvdCkV6>M|Kw#BSs3oK&z8~v+aA6-pMG<1N)FYNajE@!u@BmT)&;!Uj zi&}0T7dLfMv9ZN|03FZ4iU~MGJIx~9WWG))08wkS;L?qC+{3A+MKBk#xhw_yV4Wj> z=P{^~X|v%HACl>Gek7mS{@vgG-KQbgaBr__jaG_^m%{^eo9y6^F8_vq^#18@`^WG9 zU^<=2ko6}_uiy;|dqcWB+`8@wN5Uah)P}!Pua%*;vr2Pk-f+(XB$G}Uei(r_7G86V z_C@8~3dne1?I0AqL8R;C=wc2OtPy?F$KdW>GGiQC(?N_39D^ZZ%t!y=}HV zD(dr(i3j#GnMlBBF{f$60X#sp-nr`_&Pt0o#wyY%0MYZH&l|IPf>@YIQ|*&MX$iAF zmPWB>QgD5FODcj?_!hE4F0T28lr#p|_!R6o78WE5_8sfOyX4`y@lk0YUwG=Nr`9=U zM>}B~FTb*9W_m^jy^euB#`@E?b7}pN(&V(P&LNM`s8yup zUxRj|21n+{VgKw%D7ZD2UNy37?2oa41$n3(*jP3m1j^jPqFls`DzrwSaM5F=Vb?5h zloJ=h@F~C6MO}leRDfm^XX&)n5^h?=?Gfh3yoP52d~U3&dUKp{G&V9s5CVGE0!anf zsmeH@rl-1z*ruOo0UyLNV>Zn!I?A^pR4m9W>>>QTMu=%L9g7=e zI!~kkm;@wCFZ6bM=Ffk19PptKzE2{R9-5sTD?R@Ba;>)K3x11A8&oE@*=kUsn}_fRm7-CHYH34a{~f9afBn%} zC=8{Q5Jw;gkAW&YrqsA+3?O=7{g-mLtiCDq5|qRWnqXTkCHSU(KM-_?K(a6cgN0=X zf%+)`8i{SG00@KB=d&0E?M~TtHUUNZ24bGabW(DQIf^US08roi(v1xw{sqT+Cmep} zLMAt)SRtXj1%v`(pv{%cRdJKFr-?&zV`csMZv=hQXTeW4~i$K2m&bP=o>UlX;P;6VXB)1A~^fpj>NF zH=k%X$ipWySs4(g{qJh5z0U;c#F?uT2boNIc;DR2+Hd~mZ=R7xr5T9_23CT^0Oihc zWzRI&HjzxF-tZ0YnLK*r@asH@@7ofN5uHhENP!kkx2co?84hXv6AAjAMs*wNGVpD+ zRq@uI$pV!>P$?{r1irkR0>sp+K)A`(hO+TfxFP67=iNqBvKWu5oAR}hcZI55;kuL= z1KS4TTx?Rox^7To!#$5%9D1*ag89Mhz!_*tIO$zpF~{3^X(J80p}3J-jFq(yhKZnz z8JOJ}sTdpvp%Mp5@HwG2V%pX-KUIV!34=($<@svJIB~{#h;X3SwcbGt5bD}uq%JsGHMH#5nN=tjpjxfK#^x459>GOSsq`THoO*9h z@BxSUD$j|>(SPAzpHVwZgl9i!9$xq(-hx=iOz;paGSJLnJ`sR$%zn=04^22_TJsaTFB9FhTa23Y^)k@r;n-}pL)%QQ?Ooj?4;Kk}mwfBJ9!=9W}| znkAoYOJ==ZXCu+$EcKf5CgFZEdC&b1k3Vq#={Hw)%77?LuhG;R%au~J+hqN@jQCrP zDm2PlWcd}%2{2N~z@!ZHJU@A*r?zn$=7a|}g#%db(-G>&ypxaa;I1u$&~-0~Wf4Oj zBoGW&&nVTI8tPR*whO;E(?KB*O`!|w>pP7SiH4!fn4<7Z zPiB6fIX>OVti~P2I?I0;vpfcepas%+0|!rrL&`BZny2yg*eihXAXdP7G9K7oUxuuN zjwz`K9*wO;xdBBIph3lI0PJ zid$two5Ayi;_wH5{GYw6QLEFzc}DoXz-3`yzp80S<9SFR zE!YMo3=}r3VpdW!d|aFlr~!IG2nE@Gzah5<3`d}FbV!)-G$Nvk%y5{xW}gMt+$far zDa%NbPp}X%fPMsj*OAASPPs5MktYT4u;NpC0ernC?aqEntNib(}de6k$-}#>R zdG&GtdpzZe+gz0_x6#rgZ7G!XZ`P~yGwS+kd2}MihjUaS;pvG7aX~OxaY1mwgx}k0 z{syfkl@+*dBvZ*^awF<*2yYUV%>0RS;nC{CH=N};$-Zm0mM(NVfCo+mvm zQ;?cgFwuEc``*y0lp3P&-QWFzH$VRPuRkpnpk&FZExWv19MB5_MFrn~p3V+sAAIbc zvuPJH6>a@PcVWDNM;H#vpPMq!!LiyZR^aqISS~w3@JEmL&?i`EzTd7@;SmVL^}J7- zCxp%6(u!a*B|ns<332fvC9DvWt1PVaU{!g?_r&B>%kx4Q7xef=Vc~K0PL5x$TP&tv zbaVvp{NqJ3R4(UT1XzgvF$NQ%M)JN*F%V?OJ8-@*8DnKUFvFb5rYPx{m6$u1$xs`k z>$2F{gGf%`wim4L!fYi57} zDE!?-YfR$sLM~0`uwSOxPq?8XU_oQ01}p0&D3$BfhKYr4%rPyF zK|pMp-W409M=k1o0!0}E;PuDFhWPg~sHE$PfVooMhFp0B3dJHJ2#mE*30xs`FswX+ zDX*5wv-ih-?8omrd-mMbYuBzdwVbxBIDmC4i%9ekd|Ls0{4WC*XKsG)-UseG_U`TV zGF5phEmaktZ5^;EYcIcCt3gy~TMItnf2;;1Qv5CBY!{IuU|o*1h#3aO;iCMkHf(HeLusc1+ocNSED%!d+dBsZ`B_|q zcXu!i$?$gQzye&mej7IGB~nxr$jFS?4yw}@;Eo2BUD2T6)5bRSi%N>4Nk)n}m>w^} z?DVK#d$a4>dHHuayl0a1UYK}WT-t=y%^kq5KQgsudkW{EducIMa*%9#i2i|c1*x1--qynr(*dP{j z`b94fAR_q5hC{qe=K5Q~j75kOD+yzN91yAETmVqy`KR zrB#NMcV>R=I6w)K`m#l7y=JDyBu>l`?~U8yU)uUp?OlA%h{5RC7)(rzK}A}+rIl5R zSEz=EgAcn*fMnuhv!|Gg04@m;?Vw^-C1^Z9Z~lhC?uJnNITJ^nGp6f~iuo)YoS%Sc zq#m6+6Z~$s;!p;PhxWjp(g<9j8@QVfzj|m&# zNj6wQ-Z@ncv?MIWl4%EP!#EL0LB=1?v!fIuAz#?8HsHw2;K(Qf z%>C$({rJ7-FI;-@(xppl5!vkugAxNYzt|9nkByG(zyH3&?<{YWecW#j+$6vd_qUsM zf;@DvZ4G~PIRJKv;R(v;Qsf#w;|)pdbI*# zY{IVuHb{drJsOi@O0~sutpafB-uq9?OizzX1z0!nYK#(eRe)~z-$c`Fe0r|!3=xTqd@)M;|s7bJAT)#em6xtv@lLz`i09&bRMYVi?YRf(gk_|iUk}P%BD#U z%GH)npm5zFgfV0d8KFu=!riQILteN?+yQ`R4`9tWTKQNQC6?#pEp{**Vn<<|3D2lmfFt=52RH*OO>sOVw{ zHJPI&MWr9~HZOzQ0}GQdJy!V22)|_rFy=t7e(ute$~Dl&NHyjK^sG_POdlFS##H?j z%7Z5ZVJec75V=vsa`{cl4&z)X?ifl`!XF+mLZ}4DPGys+gO9!WvH8z^?#cAd4$j_> z%?EVU`3wSqsHS3UboAi8_nv&GYTt|W>>BrkmK);(p$6d6I7735%>=aajHHtZYM9}n zyBc+ljUuztG7udfqt-dW2bj-q&-F1$E##;%VIzgfzPtL7=^31ctKhpVgAR`*P$dH< zKVh=k#$tK;F`v)D+S)d(u5U?CiA8g5N(8obkAN{2cpDoZ>0Q^RZ%Ad%O^?9zc)_ol z{7T;N820WNgMHEy;kESTL-0_nhtMY@j~$rF4Vk#dp?jO?=|+(36P@#*j2z;Bb%~t^z~M0RJRPFBtgpYklh@LF|M{Rt2x zg#3V(Qy}a}%!Z@1>0;aMjhYUdnjD64ZTWXY1)?w`9&AdXs$v5UmR;8xRC^REd&VT3 zR6v9bSaO_5s{8?NHu3Z^29} zhl`L-r=;f@hOES=$TacD*2I21yip*RYSdbW&`?*4WhMw|`8C{(E?dbT)X9HE9of>7DjT%%-+fo6B=zOWN^T1mx@2X_2Tx-Mr ziLv=iCNru9+>OXG3s(k$NDM%Mk{KACm>Ju5==hx1YKPkujd1I#K}>wn98ckftve4| z7@4Cs40;jz6NO}9Zki^Ci2;ILriH&HKlAdH6)F5Bc`+N5yoxO(i*NwK`k%Aoz?QUD z2#;D5zjB7@K;a+&fEY;-k;@@Gm z_x9>GoIE%Khxbhl{Q0=w;K2MiWqi#VVACgzWgBP+nL!F*IDT#29aTEh!enZzNiriW z%Ww7<1j|i0);}cQ{Fb*I_~ZZQPlnGu|NMHy3v>j+-C_V+_@$9`orV1e=SPdF(Vews z(0I;u5a{!?x&Y3%_7J8xO{!j77tTFD`bSH%XJ$f|5camTW+C(X#wMJza1k+eF9KGj@BrUdi#m?xsMe>STMCE)=I^~gzu#^fn5PJVw&nT!0#t4cq#(w_ zD94@Lwn|mFd}9r+-Cl?7a-GH|5+R^lH$#=AqPvSVJbqIK?29X#623JkW;l6h&%j<_ ze0T_Eq!(C}iindgC_9XB*;D%ffCZC4RC7HK?M`dTK)AY7g5v0?IwvgHfa6o6T41;8 z00)npSlGXR--J|vH4DW=VSd*bAjuwg^h5G$wsLLUwH01Rg@muJ2?>LicHVJ zxiPrDv_Uofv;jwZ14E7a)3do%(}ch0$XHQ+2kaFnj*epuukrv8Ga_0ZN~y|Wcx+;F zWMpJ4rljBY0I@LuMDP-wg*|%@jU7CCY8q)fBlKLGexHg0wY1u3uW@GvJNvMS2aB$; zaFwPAO97sm81XZw9J<4I9G+X+F2jq`^5a^iH0B7nH3^zo$fj?;SoD2P<9uAjUT_E| zICm>a4#xe2dr5Yc}K_QocohmlNb6O3F z(v+g*=B6IYKx4MMRC)=sH*gv`9@Ee(fPW%w=kTW$Y!&n-Q;;t2xK%y44oVWau9$=}G3H(&^JNIYXm{A`_wei5cpu5yxb%ev8(E58uJGvyD(2_M|@OJIS zvc$EU#8h}9+y_i;TI}W9r^&6c>>vhk0oE;-&CLG*$M?^@*3? zb$W6|F^0&*(OV`pL+FA}_G?S;P`f1UiD;`TV&Ooru~SQvsTf61oxzEc z!^5Ky4-gB1oE{XYuK?NH&}4DAI7=;ekzrEYZa_l#;|V{hWK*D_jpHK7ielDpW@?nI zVn5CY4{T{=1FlOKkFGO_F)R6 z`RUL?K;7W2v*Pi`p_)FZ_8uE_biYNfk4KnuUP7KrH`lOUoz7|Z@5%do|KRRLf6wH7 zJf#HBUtWS02|))-jyXi9GPB-FGlwAsw1##0$a549;f0mT~aO0$JGPOzgH=+Nt)&1~8I2m@q>g%WnGUqYse zd!QHpc{Cfz%uV9H5(J-V+B0eEW1|H(Z!OdJY)BZj(@>MPMI`rNradtL5$TwA3&T)w^r^=5k@7&Im!6DG)lYh>u}@U`aF!f}+YbjqiJoU1k0=2bTZKj+1V}80eaW~0LY&50D9tq2nEt{ zgR$ZhVY&xOpP!_J1+|TaKM>2)z0iVNn;D}`mel7e&x`c&O$iq3wH9O&DBJ++4Nkrv z+W<}6+0u*}*2Lh1WmivBGagr1OYSQNu>%o1jxboHz%{GkSW7K}T6ysC8c;a^Ry|@Xqi4NGH|v3QA?usl z)TM=4TOL}{5EI~uxCfxH=0Nx`;;oGA3ug+we{v0V?0iK%OXPzz}=LdK_h}80vp>^>JS^G25+R0gT=KSK&+4udKj8X4A{`dmo4U>d{hD^g7DlJ5^fc% z<8`Yy1q>C23&X?3f>jg5V&uGo28~9|Vsv6^cw%z8;KPB?0yq;7gh!e9!XMg{!u&he zQ=<#{6irU10=XV1&y^PzlTzE;6{5!Mz)*-dMuSag5 zZlbRng*3C4jI{Ak{cA{M8chyMQlJmck5kgCU-A;!AU!CX-mO8Xfd?OLoe#5oTg?#- z@*=^caIj=8prFyX7PCY7q1;eDrogi&1d4hCAvI|zKRlA>x@5Ow%?{WzIeE|y2;By< zDy)kNkj^Bj(cEi!J%c=A9oDvq<|ACqMaRsaK$NTjR9pmG*rQa9o^8XdI(_pmGYtY^ zjMH{h8a}Av?M?#e1XsD%gxb;?bt)OYKQtx-?I`HE1SpZL31f?fn#h`atp-t(dC*$pb5= zWT6UsgC;kba)gpCwPq;*sLTqc6%@kroylf~@DA}U*{oM7M5t*Xlgs6^Qj?;BZ3nHs z5%stqwe!em(%|0m(g!?X_G(-VYMq-dcJjatl!J9BL zGK|ZmW$?VJ+YpUK6_Jdu2o1&SP|7Z^u}Jl+nE+9$G}Jj7AP^pw3c!qzqqT0feS>D8 zkcgYCD^%q`ty+bo{GPV#F+0%;D!5LilG#)$mF*$hu?o-;>!ecYp>#SkWVa~_Dq8{~S3s!0x*~jWIs)hcsPAAK zp<`_&WR&g166vJ;oLjfo$em723|m_qyGQDr#0x0d}H6|>-PH%SSC2p%8k zcQH9tmNCbbtGDS`_byDswd>3N!5S($JS^-EZZTz4_Wa)&+m^F=x%S^Yj%+qzKRs)ieAy$UxygYCfbpIgD?+EH@J=g zqdON2wpX)OlmZ|G3UBoke$kC(pnxvI zr`;KOG{$_0pjV*jv5A84f7A2&1Ww8ls_`kDhU^9eg~CIod4)v>_OKB76a-S7S+%L#LBR!P5hX#K z7HpWIZ8|uGnROPr1j|mCIe(74rMsMIHV6b#3g9Nvxaw83J4IcDcO(bJY9btzijc~x zbbqbo1z%KjzpyHs+SYtAX3&K-)8F_v=Eu1#I&jL@NM?3fST*-9aqp8;qp){=3cmEr zd17y{jZg9Rf~q(b9ofGWLY0H)A~y?R$1=6CGjZ+B@wympK+HnJi81I-scg<70KFzk8{WM5%9L89J%G#Jz9Mv+(n8~FCG9xUy zSev+DFoG3|^NvfQzJ!FcseXXCuL7VJIZk+!j1WDlNr+RoQb;C21lk)Qr!P-drPlHn zs`ac;(fftbQ}|!jqM&Gorncf{)JTX~^zo{-&_N#uxyn=$(wP*+8ECn&JId6Q7$x8^ zcqx!?X>H#)XgywJgw}4x02sCj1q9m%=VmA1+>2Lf+M1`gv-=AKP2y3+1ix{|BjSta znC31Knzr8s$Puygku35hg+{de&fDwu}0+m;e(7gg~Yr zL+Aly2uZN(i)If|S+U}&m`=C}!K?&X54gj-OkszmN;!r+305dAmQzHt)Qp5U`A9S)n18<1YygKDqgxbo9antBX zktR^6!L>LYgZrft#;WtK^ltodhBwftpJNo)pve||Ah{UICh0SAuc5sEb{9z)#OeH++BG9Q~=X~xC^^) zS52_B24CxN1K;)yB;RSWY`MpQkdtYRZq(czqMV3#qD)fG^SybYM^gI zrLqP$Z?E}1xN1yE(7Gus2*Ua9dJ0S}5a%{e%PfK*APVf$5@Od(?752%=9GmN)PREu zfRyNHaR^36@^E0^46Lu0q*81_quur=S4ZI+*h{d%TBT&KL-Nl?&{)Nz^ktu$Ar-JW z#y?N-{VFf%rt;}`?g7M0`DovD(WVf`-=<=|q^Wi3H~Y-*ECZcPiZ+OtfD<2DZ8-bl zbr>HTrj z()e%(240aQd}>)`*oB@5vW_!(p1A-gjx3Ouo1PvcIJhd6VMG2*)z)x-s8{H?fOTdu zh5dc3bHr^})!(3@<;TxP_~VK2oCtz&kB1j(_kuvCvni~oth2O0^gQQuuDA%xTQ9Mq0z)b>@zflBjx|*B z+({95=Im7p{P!DwNH%zXY28>_6 zp(#eulPSS?A)QL9`TL%tJhgWF1e4HHhw;L@RJhhAIu2K95-)G>8;1DAlMr!|$%5t* zf1X+Qh(%as2P`(=75(j22zCsPD^w0b!97P$=V;^H9alBW;Mux(<+kdiLuc7)2aPyg zYmNpB+R^Laj8Dw)4(cmwG62M7*;KZm*||Vgf=3bZ0W1`Rv#u#zrj3`^dZ`M)gy*%R zNGdKUW;$)F#(M~VLtv0ZQGKBJI!6Dr8AJ*w9$_NUGX{~tT#70H+cKz4L`06f6D9{8 zPY+dfXyc$mgO!@Tm9yuU4jv-ujW?0%*Y2@OFe*OWgfdt=rQ@^4j@q$h&gTFSNSF;h zTy0_muGhHw$FBD59^5|z*KVxQOj4n(n-|Lj#UH!1AJSr=fExId1CCO}Izwk_paQ73z4opYAkJ4a zc~TpCBaIW)KEI^cz#S){=k{PI=vr`zS!4fHe==2G$`jbc0jWvWRRKKRP);i{x$w^k zk14cqbWZ}F#>>~2U}}7rmaoyML~6x^nDK_a(~9;emwxiktzBoVCsiED`f7SoofpR+ zONb>6e2}@M%$}4S1n-Omqw8^;IIePi>K`sZrQVN20bDEVn zE0;|U6ewbjVtu{kCZz+SniT#lPmFo?IcLO2$tb*R%RI8Z$xwT)d<47z2|J?&oA z9DP)PFt2WJK4&^D?`W^17#W4%Jt2a6eGv`wMA!5W=i$HW83b#OayPxqZ)mLU&tr?K7m;J z$0}FwvytRsMshrTJSme+38+AXgJjQMr*)**!|ik(D?E+Sq0&<1f`tQH(K z!4#Z);Q2g#7X^^gG&Gc^Y0W~{)pIjQiQA13%rBm!@#ivdK6-E#a=A2FDeONGJQ(B~ zn(c3ocMnax0N}gf96AUXtxwTdM<$TgTt=Z)-Lu#&Ib8#i8^-@MmegLiisE z5L3J51eBpKD?!nsqs!DmdkN-O7{@{&rUod~>-DOY-9)~#`1L0)Y>I$?|}Uc zb?c&;FZ$#c&%^p=S=Y&Mf18b&ZA0(nbswie=kBmbk1F#oCeTE*v5`E{p*YPLsnF1jAknMvDBf!Mb8C9V z09HRa7vWalxc4{b&7|22LmAjNKS37x;`%bU3D&nMJ{o^`k@SPA4>B>BfWLd{Md<~K zuxHOWDFp5baI{b%bTpNgJWeD+NLm-E=zPVje9vOOe-Ru8+ZS(c!S+teFNrb1t^*dr zh}<1(;x{uJ=dDoKu_9@Fiaq3O+gm$Z@(z&(v$z-_D*Sf!FKg6l;4`Xv32&1}TRYT1iFc`&%zL#??E@ zW#c*8l;>juckMa~TerNyi{XR_CU6HO2ZpdTdy5-1CVhFeM4bJ7r}n|6tE+JR)_Ty4 z4n2%SGzl+X$fO-OJU<4RRI;ySeT7ysOhT>SSsaK6KZz9 z2Gb_6Gtx!6u7fYEOJO>Rg@tixS9DQjIgMmfhgtnjH zm&233x>1Jpb>*c{P+L6yAP~P}(+ZX_V?f;Ifk2tb!uXlESWjVVW$oJ@XgrK}H9^hO zRi#ue;Fm5i>otAn!RB{-A8x~(9(Pj<6kugWolo}XnxNeC(Y@&5gnF2d6Cwz?id_zS50r6u?rm4?|6i}@uQ zwT1@|9Nz;|qeFd<4>QweF0R0)41gIk^5FQT&t&zTpsC5v1^cXzGNwpthuAX~G&&g_ z&C18cn^!kw5Zvq`+aU!IT@-;`zj$uz#j{^tGLg9h0R(bFL5q6LP31r};&`FnTa(yP zcSUpIMZiw1gzlfEU>M?N38{q6-nj|dKG>l7`sxA+ZYIrfIDchXZ=(l)zGrxLWRTJg z7^7g>La51K{~Rkt$=MGY1cMzg2aB-nnf!R+F;Gjmstg;KgWPw|J_$+oLz#LLxF38E z))XA=i4E8~V=YOD^*}PL6g_-khDsQ4d4@@%c^o41Pepjtr8Tw$h5zWjF*tQ-k~X*W zyKR&j@X4od`Z*xFJFcH2q8PvlWW*Q--$-b#AE7SuAy1$%J}j5-DIxP}b!Yo_#QMj^ z0dX8@h#{<1%C#GpUtGqC6zU)i?$>mvovb4TNYfWXUY}OXI1q~PLDN|%04Q8n7T0|i zMAhzeuQ!>H5C_-u;5hE4-ne1}4yPhqzqO$#CSV=(rV$WNr~id%T(L?4%uprTQ!F^u zs*Dt}aPsgB?b9?aCsR@QXtXev~_!6rLg~g5^n1lyT?}Gz-r|G@z46le4LcKUV$^wa?rNh;h3=briNmFCa`ep@g zFK^OHCcOBqw(xfg@1pwGqBMhYbeg8XRIW8A1s~Za{P>&l99A1G1rup*X_s9BJQNYp zdto{A+aKHykDQvLIY0ewSoZL-CocyTr;g(@KcMzOYU{79r51j&{>Ec~QGirO!5sK> zJEJY5%S+2^oAPE?)OU*k5?xC0ZBO7d>-9|;39l8#^D_=sS~}`G(1CJAvDv{eF1My& z*i%aoT*?EWwsXxAVSS1cNKA@cxw#5^7iLKKn(|^KI4V)+1P@#sSCkm}^{4j1@_LCl zL6=dEuel69*b?{#2fY*-+O2Z-v7=MFjma;$NuttpS`#SPd>Xu z!b!otqj`Tv2{$<4D}d_fcJ$9wQJ|yurXjpZq|<>8>8bz5Ti{#ea}56exo4LzUc9v4 zMV@05VR4q<_W+gh*2c#A+N#GA8qzQlPzM5QZ7*X@q_Z^h2Y8#PPZQ0ngEr6Qd+1fE zUpRAvn$%5Wx7pilJ1irpc)@069PrkMkHXA&ffyn)Rk?be$_Swrsb({0z+kJ=W z#eGhIJoWh}SFc{ZwiWRJah{+j4eA;0a^=?b zwaXV@xN+pzQAj!rd=%%X+H=Ffl29`&L&!=mknl5<{tjHn3ACMYiW86(SzOwI+e_;( zjawphX@nA_PV0vkGLdxP@WDOwK3_U}9kzGskV&WLqGL%e4z&$3v(~hPNQngs9wtr3 zrI5@_6ePTwg44%lp->p2k$sp)=mj~Lm5%X;Z0QmMQ_0D7lMOe}hx(Tlh1+OzI&Z`_ z>G?xVdQ_~(fRhnv3Ekm^Q8*}tvWlZ!8k|bZ(W9Uu;TS@!|Hr(GT~_SrHd9mn!9*v( zLv{$avlNEX@P>OP;Je;&9PT+dG0<_LB0qU%2|oMWZOCL2+8BUe`$KY|Wy8Q9#Sj@| zY5vWr&=F_Jx{jTUWr6I``E_y7^5%`Jmls>X#p7C*2ZBH%qABzyOE<4>Kl9XQuYA)t zzqchnDCr*{v+zH`Aw81IMNLgfFOXDQAekC_fhWY#F@Z^p;oqTk`TTR&;l0yig!5^# zf&Ao@#(q)R!}md}cKpa3?3paW`70|*SmZC`y!yZU!X@9T;d|5SR?YL9HLJsg42@8)V%BnMqDZ`Zv(+Sl#N%*u6((Zt z1A8Z_DDdgCH^|bd8YS>I&F`kA07s2HdU}@bS8kQyOD`_NxhrdMYo!7unh_*1e+wax zN0hMu(J`@($_Q{~6Hb;*Ct!Ry3nwMy`KE{W!O8t&yXtSin*Tq2;tKr3i)&CEN~w6! zakSxc)Z!OyYHn;%QuVj(|cX107N-4unLz{AnfW4aWahxkOHSJg^GS(1wf9+ zeV$hZJ*sRNE%v9Mx(M&1WLK6jXv+&UJSvFz8F+xW9R=O}l=L3&k`M~no)T>~FH=U? z-`k}}bB~M+krHq{{S5`Qw9|-%TX7m-iZ~rz>S6aLBTF$oH4N~=B0Wb)g%=aI+SD#B z1LkFz{v+(sElD9k>~4`i7y_#MZu05#CZ zz(-XyX-(^PnHF|c>XMSNC9}#Nj3;ol2are>KK0k1SiErI!e%4@j-^0*6~o!WPYSTJ zxwdxw%B8Cd^Yf1;oF*MuTNhd30kloh3*!L7)@kVl(iDuEI)3c^Y;_bn8O$eOait8O zfBG^!^1uvGncF$m|krG^l5%Q$tv`JbsnoPs=bf#0YF=2+VsMhZAD!sO) z3td3ZoG|a~S=1(;4;;Sr!uchtbK>&FPkrt@eKJzBUW@Beadj-2R0?h_Z>y=w2m@QD ze_444?!rLLF#T>Q$apu!5nDS=8fV^)Htood$|SLnFax=Pdwb*aHGli%Tk!jzI1eS< zah7sJjXsW*7!ApRCP!Rt7+s4nAw(hJbSkYzeTIwV!1n^o^J>pM`{ku-jWWR8l3$wv z>Pv%)7&eIAx_)`%3r~FV`G+2Tt0%F!tDp=E#{iD-Ejy!Cn$iOxZ|gNw#kyYMiSWmD zb?Tkz&EfJjgeaf>hikMq_~fw#;@)X$fYo&4Cw*8jvcz?wwfx*4oI5~GSI-8HM!i8E zWmrNjEchbEi3M{p$FmD1*AZIjwvl3+di0ph4o!co<7 zsd46uPu{H8tCzu1L6yqXDJx84F$_J*w8fV&NYPd}oYf1yuwN1pPJbgr!n*Rm_}nG9 zy}Y4I0u&VTM_AgW$<`h+zfq&xCYD{^@N>L&3;y&I&%vL4>Uql0Vle45OQBK=O{;R1 zOQ7;@9ekqzJo%+7#Gj*rW2SOsI73Y@_cGq>T_{^U70 ze|?)gKh0pJ>#Gx^uBJWxYwr32>{_zmx`Bcq)TBnCbW&9iFy?y)*9qc)A&LJ#_qiu7 z-@0{cGlE`tw*YvMVz`hSY1GQ=%eNOVw?)D~2>;-5!j)n%t3nat2ONR#}+FT*UJ z+;L4Mq@#N=Mej0uOfb3N64`>WlZLrxX{z+upfR8tsA#y?=gOK2O1CpSlDuTwEm~AnH>u z$)=_hp~nNV!3RR&ag`e!wrl(=q5vQJ`)ly)e|8ow-QEeNH-HXkUFI7<3U*x+;08Gp zMxFq)@VnY8&|(7Ir^ zjh0#ff^=rR-iFto-Us8Oc@hSMQMpV?O)k(4E2dS`(+%puPKCi{qG2L$yV@e7lS@0V zsNipxTkxxYdQCktcR#2j2F` zVVE2($cx=nDe%x(b`jYr1-r7Gn4(X}?{R%`1ODQ(FG|7Rf?A^m_Mp~S3L)C?<*$p? zGe$W=Ch3}=z6yt= zh3PrhX<7J905yC$+SO^!A35=a)Lx7Qa2+ZNJ6d_>N;u>>v=kaAV{oKHb-NoeOT>aW zl(K*FnMJs@x&x2BejnU-Y!75IX_|je3mG&Wx@!Q;)UGNFQZHX$gEKGOf`2%Bn@Y5? zvQ%X&gUZN(TEfhU!*UKh7nlT;=i>6Uby!^5f(K9Sg-W9hx0Y%_=M$bMPdBeKtKE}1 zL;{QtXF?Zdy)IxR%b?m;-U3tq>!lW4yIp~m?REI#xg|KUe-ys)^>c81->CFxFY~}z zd3@)ttizu^c@4h!!YZsuPmK_;-r(dd0}LOD@%#pNJ@!REx-3kCx^!3Xf%IuIA*f)` z6cPI6(=3=IGCBhAJHP#(Zrom4+UcSI9J-9TOZ14LY%gG3NXH3Y&t3OL3ADH#yA+hwwh7!#oIBh}|}RjujDe{jbG;bIq-t{BC6 zHVIV(cj@L9(WGBIdkY>qxd)CO7^gPLO2gChKOs_r**V(=PcjCg*`x!T+w#4hTZHph z*5KUbRS8vER3e^v12&3-MXm{#iaq75CNNAWNEUM(THBfF@N$tK)?Qbx9=C{pSMB4Y^PqWA%zSS zhE84Hy^&HO>uUhINbS=cP4!!W)1hPdL8=8y=t!;T z@%P4SNSkc&yTlvjpaxI_SkBVKL6b<9PhRiHX%OhpNDh0+g@a;Za$fA&J8WwoK@8S1 zEU}!PsEY62x?l9{I*yDEaifWkZN`E6MABv!Y?Hagap*X~B=+#|l-Rv*6c^UFtnCs5 ztIJ~B#%{50RYmmm6vXPTB0@^CnqdH=8Jk)VL!-0e@W~mREFT@26~|A{iizo}n6KN< z1`HP98`Xv#IAS-@?~1U=u28*h@*7>cnLX!^SG zZ7Y}z=L#j!n4N|5D{-1a5&>dd&(o;$730Z(WKIg|0O>LPvMKOQD&!TWCnL$}b838E z92%Y!eO;#z(_^)%WJ-59reT1hNhk0S0WlLmuE?D3ARU6v(D+PEoPzlQYx(+R z8`dRKw50A3q+l#C^czl`?r2h+LY`hsoDZ-(okb|bHRjG>bcXFhO9Jo#7!b&-U~)V) z1ChseV4xKo5tawKbqg?nj42=2PNK@5@D9$P-9(oG1vNn*G}Qq1^cR>N0Omh})KFM{ zC&V%Vc+z2oXi*0KmGffZrkidYo}QkW&)RCH3nZUT5iHm`S)6T$&Q4EG-Fm}!?^^fq z|8zwuFFL)^xx++gz(a;*p`4=2Mz=MKxKmg&B^r|G&X*0N~1qHWZKsN;DK@FzuoCIJO$3|xS?m&valr1=TxH?@BVH>#| z-oBsU)M)%o!|E9sTH6fMquJ^23f(9Q-5^YV=yL%(fv5xxlN^d_=kRaZ7OHEr+fE}q zuX}F4?RzJW4~??Zzg7QVJe?v~WJbr%_+4me&P+|t{`{xkd+gtS@FS0Q_4m9^12Z$^ zZP1>?yq+1FPVPgdVt6qn#B(&8a{`37f!#qR)*jJg>TaO9c*AyvIFrV_7^sGl3 z&f_czN^F5>(y^JzAc$m_uoU~9Bto0w=vNqJt3ANm0HZ?VU#DV3c}NpsQ%nV*mTQXmxS3D((mz_6}Fk|CYSQRGme9T zV>7mz1yIjaY4`=daWpB0_d!IMTJW1`jo8AX7izIMoSgo4KfxfEDyCFTTKsPs&wSxe zc5J`OkN^_{X6(&cVXa}SF?Z6jT?O|(8BRFsw2OhK37#7f9ec=v^b=p-s>GAsO?Q*; zMd8F(WcZlg;8%^qF5DVRqFhAnPun83^+n`R2LwYuy!VN_e)-E^o~|Wnc^kuDRu+6E zsHf~e3@*9q!u;$F-?{d_^DlnQ{;vMY1-9@_=l>AaVlYyKJ`2q2Ap#W3l_ZQLwLt7@ z0cmRiZFARjyTU*QWf;~! z^{hQyK1SG7Y9%_s{G`Ca7H12fU4&Q~UynGpI{1JgErAXfJpYlT9)M^F@7)b|Jb~+s zF;PT17)EUT8V;tC{?jEx_v@HOvLjA%QsUBeLD3CLoS#0xZEF*o&_s}g3qmqE#Ly4{wBa@Tz4_~9RMc$!k7N!n#3Na$>{5C z24GA6ioz{A*Tx*22Jn25sF z$^+6O9T1#K>r~eVi(6%xK%6m0to2zawrGVmnYSfbi>}`E&)>RhaO-(jR{ASjF_a;p6uihd^`s+= z0Jf;qxnfcfSFBoK;t24DMp_XJfb_tig&0YjGlSu4*P3*z+r)U$q=Qb|Gyu{Bt)-{` zHZfc4Hck#svaFXJL9nASHP|wqU3n>qB!6$F-bn2cxS|^?8q2MZ7^&D!&K*y_kPZrM zBUw!1A8|(1+OT|Y(f)nvIj|fiJ1Li3z*VBbhdGF}tz07rrRunRjAw4}Ilf|Pk1J}y z@FVGwo;gZ&BOMB3IO)OABe(q0Y>0gFGY}25a=E|#8j<6ec6h*ZLjMc5- z*IN|8Ml7TAw30EQX%PYNQma-Me)64b_Z~aA_m0`Bsaj^#w`N4*yO5YAS^2Njn zAm@YVkUV#6uSFp*1TtQ5G+!*q?D7Cf?@vNfF%;kwPUeFFluu&k&HSW6QM|ZBkNh;73 z@j?wxGh~Pp61zec@tItAs)43yi&3roX$vV4)CulcHIX~gc1aoyqL@)>b$R5+G?Enn z(q~htmraqt6|iQ7DUe~*?MrK+@*_L;P7-qZb^?1+w3pZBJDP$eO8gNdDJ4T;?;KvT zJx{FN0LtM~Cl#bi6-Ri=0A;tSj_^7Mh~LK(pTKVHFwEyQ8afQU+?)V%fA~4*{N!|K zdm_q!+OhL~EdXdiZ(je7O^fB4#-gM0VfI#Z43 zkeo=9=kg~{x81bQvNx2m^2hv7G%0F?

    )-bts}z8$-&YNqN5+lOrvCDjZWsM2H|m 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 literal 0 HcmV?d00001 diff --git a/src/menuicons/22x22/apps/qbittorrent.png b/src/menuicons/22x22/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..0f573d05d51ecd87412f1b450d39f0c7042aa35f GIT binary patch literal 1456 zcmV;h1yA~kP)o-2KuKV$29UV(5ysmPFVc1+=%#VzY2F?$h z>hJ44{@ujHL;&|Yy1Tny{_^`X*Fq_6#t~CA?acLw=$mi7{hrxmu-yxj+y45_-5E*M zlHy+gg+f77)Pg1}>YcY_)3l-%&1%}U+nRRpi*HXj%N^bsQD1y@$L`;vnbBg2(wo-eG%wlWsjQZuuOLX;jYv*AcT>|29q#$TX!zH2?w?8L!)rIc@&3WR zxtzdMS_(*KMdU>Zq9{WseI*5jVi9hq4T)41*&MBt&2D56no7XeytJvx!I{qv^qstu zJcGgDK5*ppPeyNx-(R7^#1(ZQjesa-@H|H^PdhdEn`-fUa1!Z^NC{?PG8sWk;YvtG zdy7waX~VLIMn*=ivL)bEYu0V@%~|M=P6Q!KA`0M9?sCCaUJlM^2Fn`}nNA^|$`eQt zl2ky2+m8Ag4@?FglB^&Z4I?2N%AVc4ZEFcr2ku<^#D*vxR0y=(>4K-iifE!ud_8tFFK_dCPMgSs3&Wj$$|v1~G-s_6Bq=ZXi30aQHS_+G}e) z9*>VTnM@Y5#pcKfG8o=W;R*gV!g)=`JFglu%@NN+u9bOOyu= zv9th&lc1_a{fyCSEv@ShOS+e}f+||c7)yy@3M58ax4~!s9mr)y=CLheyMhj0t$|$rZRXG!D1R z27hxkqSI*@Ol1Tnz-;94Lf1U}JRF9@G8@}A&BNYrh9Ib{p2T=0bSoZ5?f^W)lypC}@{!{^BFPd-ha}8$h!E%3191Y^r4OUgK!7GV9Trqq+Od9lEw*lG#)Thy20nOa*G_5y z;$6VSLP5UJ-+OYweE)(~D_1rf4Ge5nBX|NUm76Q;js~)4m48u^P9YQeoZ|t z_xJSe-2U1&Q4k|D-XI*$TXyVvclT3Uc5Ihmv4vwk5sFe4*k-kl8$V|97FKC9i~CYQBrI+aYsr%NGc|LfeJ0t^6h+{btOM$^;)0000< KMNUMnLSTY77`%7KuEEZwT}$K5u_)_c z*@_@mXJ^ytFUCF}J@Kb^k7cvjByMwf9@+P!pS?9adS$9;ScdiOVee%n%liAJ+1v}i zeCg##Q@G`pH2eJi#H)u6y;l$|t0aG;&a@~kmSOyB(zCs1kLz^iV&1ZjpBfuq+qY)p zO_h6nzQpUtJ{lEBRuEN7)#_GFQmv{eTS85`F)LMjmFb;gX_{{31jw8&($`>TVMQXZWV7UU%)NrkLvP*j>^Os|{J zNogz+Lb)QMB#59WA<>y2@4%PSIYbgGqHPgx;N)M1Ke!Qr)5*mSzdv$DU}MXchEyyL z^Q2TKr%h1KLFtCa0^;!n1{v%eOm{2@3D0^3~auC_mCjzkYxp-P!P@WW~9;!I5$4oSeJ|f0t%JaCc-*lhieg2=$b}T;Bs+|%$~V$4X4LaRE!StJcFn94PbF3fJ#ln zLav1MJ-w?UO-*r*D&OM^Mk0cu!elrwEQiaJ~jhG7{8C~0^$7Rs~=i(a}%+vmCK_&wxO#?mcQH)*9(OCvw-VIffM6o8;>?F&@ zg_)UXI0&5-jZfxq&)qArvZoFHU;sO}--Y(J7~x}4*e(<*8ptVZ=xs$P;30~;@YsWE zu_)}tpU+Gq9P%R)4q)=~KQ5Ik<*bdEb#ZKTql(`7`%K0NJ$-&nWB!1(>3T8hqjgo+FK*&Ti$}>Z@+fbR{meTXyW4e@$C=n zd@#}36|;MfNeT^gLKt_BV*%>n%2jySg5*^c7W=MyhJ z_smbJQ3~I>(Uz@Tz3~rk48Jciq4j$=N@918& zigP->wuq`owdBNwOXo*E{^Zoj6CciIrq6w^e--~R+!R%u=RJPAZX~f*s|uAYJ!}6@ c@Sg$<0LcqNLk4O~)c^nh07*qoM6N<$g5zo^$N&HU literal 0 HcmV?d00001 diff --git a/src/menuicons/32x32/apps/qbittorrent.png b/src/menuicons/32x32/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..fd76d5f1eae023f03e5b2ed4083caa61f5adc8ea GIT binary patch literal 2531 zcmV<92^{u`P)9pRTGTb3+awxnH2tKIE)uQ3G%T1r^^ zj&`KG_dEA|=R4nB0e621*L~_&$6YUSCzru&68()$%`HtW%UkLfG}gOZ4v!!}C>Bd{ zJQj)cc3-lt{3!~k+y`PcaQ6OC?*yEaOkx+=hX$9?<#n0FxYywt?dE}+7->|C3PkUi?3>$uBtZ;?LWv0 zil&DmvVI|^>!0)t4{zMKaohhDym{&J%@=zHV#KN*Pi1t4q8AiZmkWw6<%={5x+LFX z&~I!`k>)Zy?L!&;bdRL>C1iQ$u3b;xi3o-2n!wsO-fMfuQyKJ^TQ&G>-~y*zg7ENh zgW%~_FbMop7ubUIN6IuB4X~I*{4+d-tZG4%-<1FE?yo;_>eT6@w*_D}n`;le_5N}H zqSh5tQyHvlcB52MXsDnaQE&$0YSfv39>`bbf>{(XmP&(C0RsUr7z{8G08KaGbjJh& zHFHp=kB>aMe(n0<;b`}4Oyl)x-}BtQ7an>1+uK5YF?^xk4iP0}r2+~?g%2t>6crjp zm47l&>^qmk2CLPCcrpz+uYgjlz)6BJLq0YGJy zf920#I<)`FSk9{FC(&4K$8;_ai2%s?0`dg{pr|~cqN*^8Mjk+ti|~5vuv$!rjHV!6 zotrOQ1zXbKv>MUT8-XS|ux8bY#plnR{xBAc^>cHXHJPnDp4w^i`aQ$L5tLa}9z30q z2&MqhWTAj&$h2rKU*wNXWn`q%Sw5$v&Uj9GT0)KhS=ynVo1-Wi9HNH)fg#A0 ztX+GaeR6j5BIn*@_CNH<_Dv)4B&O4oFa`V+NI@V_jWUm$LZD70~#1iB9_cz)q@+>mHWJPsfo#c4xpiNaZ6y{ z;`yPTA)ad%tfs~fr_+w`Kn%(8G*`CA<3w<7H3bB*p>kkUetbR?W6Qz-24g8ij&B;h6QmAjP^)FeveA(GEf1d%+)UslU!E7^TauTQ6L%Vjm?C88a zh*0MhzGHSNw0oA0>Z)=oIRnNgGL+*IDW4c15GT%bAUvD|t4j7=AMN;w%@3d

    !~X zLmYIPs!OE`xo^qRW&&`O0T6=q3+k1U&P7E&0*BK{xh$cpFN$ow1fyZ5tgMt8=rhALvjfIO`&NqLF^_ye`Ivmz91PN$m* ziD^ltx`jdHB1}x=h-M=_ERwJ+$jVHFtO_)YO-M9H!Bn=$nbF8231#d^ABjZFMkBeIl>}tKFy+o>wQ$Af@)}0RB_yT_JT(r7m3F9cb~H+l zffme4Mb2J2SHf^2hlz}W=(tS5-B_}q3SIpv436cvV_Ga`n8*PJ!hHh_HBUirSE$pV z7vXX`XjswS6UWNtAl5zDOttMq??4jXGIFuy4JdQlktervIPBa7hvGS6Mdd=>vw120 z5gMVMki|nQ=i!+x_ftbM;@lZUEHE6Qp|=win;BkJjFZ%-wnqvc+&-$%9H zHITwvf4PJm8(Yx&z(TBAv5ppO`^qN>u1=s-`nujg{-H2~S^^w7uW{`SF!?a%HW^g2;Vba#cv z@rzf^VgB4QzE~_i#hLit?p9Kd0YeFiQ(05(#le$(c=>2I301wAAW?3! zOtz{Za>dhG138k!^&6`yveFkfM$WM-@-+ukj zo3n@3*=B_9(1o_YzIWu^g~3YHRC(bqcc7}m1)tYN;^V${oy?>6Ax7Z6^W87E-(a2p+AQLh$a8#1)Y{10KO0c2UOIBQl z6^(Nc4z+#y;*WmtLseDNw*mkuJDvQjw`*|Q<2$!lELKs~6qso-gJC99Z1LWqG(NgS z=`$F)Z-@kdnGb8hHmey95@s3gy1K%N`2iQ6To=UZ<_b(DBcspk*z(j=I(_;2n8uqA ziLs&n%aNh}(XVaY`moF46jh}FyWIr4)5d#&#UjE^psbW%o0aY@th~&ma0{oqdX59N z)ov1-3rztl)-RnyZMZ+ScjsfzT?zM{x%mz1wr@sjzPw@Ei@!Rs-(67`3=fTxmF7XV zPvX;fS1VB2saFpoA_>k+CBXo((~rw$M1|XmwTrw6U;N8uP{VNHcKu9+oR^D~J8?8FN5i7GO$+(cyJ*x}#2 zdf@jjzpR!@(c8T{-pRY6xn;$gFKyeoclW9HPL literal 0 HcmV?d00001 diff --git a/src/menuicons/36x36/apps/qbittorrent.png b/src/menuicons/36x36/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..aef62648edb4eeeab367e42c4141b51191b75cdf GIT binary patch literal 3032 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 literal 0 HcmV?d00001 diff --git a/src/menuicons/72x72/apps/qbittorrent.png b/src/menuicons/72x72/apps/qbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0c1f21f315c1a533cc8ea60c31e22e81d4be84 GIT binary patch literal 9397 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%0AT#313* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef Q_WS_WIN +#ifdef Q_WS_MAC + #include + #include +#else + #include +#endif +#else + #include +#endif + +#include +using namespace libtorrent; + +/* Miscellaneaous functions that can be useful */ +class misc : public QObject{ + Q_OBJECT + +public: + // Convert any type of variable to C++ String + // convert=true will convert -1 to 0 + template static std::string toString(const T& x, bool convert=false) { + std::ostringstream o; + if(!(o< static QString toQString(const T& x, bool convert=false) { + std::ostringstream o; + if(!(o< static QByteArray toQByteArray(const T& x, bool convert=false) { + std::ostringstream o; + if(!(o< static T fromString(const std::string& s) { + T x; + std::istringstream i(s); + if(!(i>>x)) { + throw std::runtime_error("::fromString()"); + } + return x; + } + + + static long long freeDiskSpaceOnPath(QString path) { + if(path.isEmpty()) return -1; + QDir dir_path(path); + if(!dir_path.exists()) { + if(!dir_path.cdUp()) return -1; + } + Q_ASSERT(dir_path.exists()); +#ifndef Q_WS_WIN + unsigned long long available; + struct statfs stats; + int ret = statfs ((dir_path.path()+"/.").toLocal8Bit().data(), &stats) ; + if(ret == 0) { + available = ((unsigned long long)stats.f_bavail) * + ((unsigned long long)stats.f_bsize) ; + return available; + } else { + return -1; + } +#else + typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR, + PULARGE_INTEGER, + PULARGE_INTEGER, + PULARGE_INTEGER); + GetDiskFreeSpaceEx_t + pGetDiskFreeSpaceEx = (GetDiskFreeSpaceEx_t)::GetProcAddress + ( + ::GetModuleHandle(_T("kernel32.dll")), + "GetDiskFreeSpaceExW" + ); + if ( pGetDiskFreeSpaceEx ) + { + ULARGE_INTEGER bytesFree, bytesTotal; + unsigned long long *ret; + if (pGetDiskFreeSpaceEx((LPCTSTR)path.ucs2(), &bytesFree, &bytesTotal, NULL)) { + tmp = (unsigned long long*)&bytesFree + return ret; + } else { + return -1; + } + } else { + return -1; + } +#endif + } + + // return best userfriendly storage unit (B, KiB, MiB, GiB, TiB) + // use Binary prefix standards from IEC 60027-2 + // see http://en.wikipedia.org/wiki/Kilobyte + // value must be given in bytes + static QString friendlyUnit(float val) { + if(val < 0) + return tr("Unknown", "Unknown (size)"); + const QString units[5] = {tr("B", "bytes"), tr("KiB", "kibibytes (1024 bytes)"), tr("MiB", "mebibytes (1024 kibibytes)"), tr("GiB", "gibibytes (1024 mibibytes)"), tr("TiB", "tebibytes (1024 gibibytes)")}; + char i = 0; + while(val > 1024. && i++<6) + val /= 1024.; + return QString(QByteArray::number(val, 'f', 1)) + units[(int)i]; + } + + static bool isPreviewable(QString extension){ + extension = extension.toUpper(); + if(extension == "AVI") return true; + if(extension == "MP3") return true; + if(extension == "OGG") return true; + if(extension == "OGM") return true; + if(extension == "WMV") return true; + if(extension == "WMA") return true; + if(extension == "MPEG") return true; + if(extension == "MPG") return true; + if(extension == "ASF") return true; + if(extension == "QT") return true; + if(extension == "RM") return true; + if(extension == "RMVB") return true; + if(extension == "RMV") return true; + if(extension == "SWF") return true; + if(extension == "FLV") return true; + if(extension == "WAV") return true; + if(extension == "MOV") return true; + if(extension == "VOB") return true; + if(extension == "MID") return true; + if(extension == "AC3") return true; + if(extension == "MP4") return true; + if(extension == "MP2") return true; + if(extension == "AVI") return true; + if(extension == "FLAC") return true; + if(extension == "AU") return true; + if(extension == "MPE") return true; + if(extension == "MOV") return true; + if(extension == "MKV") return true; + if(extension == "AIF") return true; + if(extension == "AIFF") return true; + if(extension == "AIFC") return true; + if(extension == "RA") return true; + if(extension == "RAM") return true; + if(extension == "M4P") return true; + if(extension == "M4A") return true; + if(extension == "3GP") return true; + if(extension == "AAC") return true; + if(extension == "SWA") return true; + if(extension == "MPC") return true; + if(extension == "MPP") return true; + return false; + } + + // return qBittorrent config path + static QString qBittorrentPath() { + QString qBtPath = QDir::homePath()+QDir::separator()+QString::fromUtf8(".qbittorrent") + QDir::separator(); + // Create dir if it does not exist + if(!QFile::exists(qBtPath)){ + QDir dir(qBtPath); + dir.mkpath(qBtPath); + } + return qBtPath; + } + + static void fixTrackersTiers(std::vector trackers) { + unsigned int nbTrackers = trackers.size(); + for(unsigned int i=0; i static void insertSort(QList > &list, const QPair& value, Qt::SortOrder sortOrder) { + int i = 0; + if(sortOrder == Qt::AscendingOrder) { + while(i < list.size() and value.second > list.at(i).second) { + ++i; + } + }else{ + while(i < list.size() and value.second < list.at(i).second) { + ++i; + } + } + list.insert(i, value); + } + + template static void insertSort2(QList > &list, const QPair& value, Qt::SortOrder sortOrder=Qt::AscendingOrder) { + int i = 0; + if(sortOrder == Qt::AscendingOrder) { + while(i < list.size() and value.first > list.at(i).first) { + ++i; + } + }else{ + while(i < list.size() and value.first < list.at(i).first) { + ++i; + } + } + list.insert(i, value); + } + + // Can't use template class for QString because >,< use unicode code for sorting + // which is not what a human would expect when sorting strings. + static void insertSortString(QList > &list, QPair value, Qt::SortOrder sortOrder) { + int i = 0; + if(sortOrder == Qt::AscendingOrder) { + while(i < list.size() and QString::localeAwareCompare(value.second, list.at(i).second) > 0) { + ++i; + } + }else{ + while(i < list.size() and QString::localeAwareCompare(value.second, list.at(i).second) < 0) { + ++i; + } + } + list.insert(i, value); + } + + static float getPluginVersion(QString filePath) { + QFile plugin(filePath); + if(!plugin.exists()){ + qDebug("%s plugin does not exist, returning 0.0", filePath.toLocal8Bit().data()); + return 0.0; + } + if(!plugin.open(QIODevice::ReadOnly | QIODevice::Text)){ + return 0.0; + } + float version = 0.0; + while (!plugin.atEnd()){ + QByteArray line = plugin.readLine(); + if(line.startsWith("#VERSION: ")){ + line = line.split(' ').last(); + line.replace("\n", ""); + version = line.toFloat(); + qDebug("plugin %s version: %.2f", filePath.toLocal8Bit().data(), version); + break; + } + } + return version; + } + + static QString magnetUriToHash(QString magnet_uri) { + QString hash = ""; + QRegExp reg("urn:btih:([A-Z2-7=]+)"); + int pos = reg.indexIn(magnet_uri); + if(pos > -1) { + sha1_hash sha1; + sha1.assign(base32decode(reg.cap(1).toStdString())); + hash = misc::toQString(sha1); + } + qDebug("magnetUriToHash: hash: %s", hash.toLocal8Bit().data()); + return hash; + } + + // Take a number of seconds and return an user-friendly + // time duration like "1d 2h 10m". + static QString userFriendlyDuration(qlonglong seconds) { + if(seconds < 0) { + return QString::fromUtf8("∞"); + } + if(seconds < 60) { + return tr("< 1m", "< 1 minute"); + } + int minutes = seconds / 60; + if(minutes < 60) { + return tr("%1m","e.g: 10minutes").arg(QString::QString::fromUtf8(misc::toString(minutes).c_str())); + } + int hours = minutes / 60; + minutes = minutes - hours*60; + if(hours < 24) { + return tr("%1h%2m", "e.g: 3hours 5minutes").arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); + } + int days = hours / 24; + hours = hours - days * 24; + if(days < 100) { + return tr("%1d%2h%3m", "e.g: 2days 10hours 2minutes").arg(QString::fromUtf8(misc::toString(days).c_str())).arg(QString::fromUtf8(misc::toString(hours).c_str())).arg(QString::fromUtf8(misc::toString(minutes).c_str())); + } + return QString::fromUtf8("∞"); + } +}; + +// Trick to get a portable sleep() function +class SleeperThread : public QThread{ +public: + static void msleep(unsigned long msecs) + { + QThread::msleep(msecs); + } +}; + +#endif diff --git a/src/options.ui b/src/options.ui new file mode 100644 index 000000000..21b08c9d3 --- /dev/null +++ b/src/options.ui @@ -0,0 +1,2668 @@ + + + Dialog + + + + 0 + 0 + 789 + 586 + + + + + 0 + 0 + + + + Preferences + + + + + + + + + 0 + 0 + + + + + 121 + 0 + + + + QFrame::StyledPanel + + + false + + + + 30 + 30 + + + + Qt::ElideNone + + + QListView::Static + + + QListView::LeftToRight + + + true + + + QListView::Adjust + + + QListView::SinglePass + + + 0 + + + + 107 + 60 + + + + QListView::IconMode + + + false + + + false + + + false + + + -1 + + + + UI + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/preferences-desktop.png:/Icons/oxygen/preferences-desktop.png + + + ItemIsSelectable|ItemIsEnabled + + + + + Downloads + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/download.png:/Icons/oxygen/download.png + + + ItemIsSelectable|ItemIsEnabled + + + + + Connection + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/connection.png:/Icons/oxygen/connection.png + + + ItemIsSelectable|ItemIsEnabled + + + + + Bittorrent + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/bt_settings.png:/Icons/oxygen/bt_settings.png + + + ItemIsSelectable|ItemIsEnabled + + + + + Proxy + + + + :/Icons/oxygen/proxy.png:/Icons/oxygen/proxy.png + + + + + IP Filter + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/filter.png:/Icons/oxygen/filter.png + + + ItemIsSelectable|ItemIsEnabled + + + + + Web UI + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/oxygen/webui.png:/Icons/oxygen/webui.png + + + ItemIsSelectable|ItemIsEnabled + + + + + RSS + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/Icons/rss32.png:/Icons/rss32.png + + + ItemIsSelectable|ItemIsEnabled + + + + + + + + 0 + + + + + + + User interface settings + + + + + + + + Language: + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 8 + true + + + + <b>Note:</b> Changes will be applied after qBittorrent is restarted. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + Visual style: + + + + + + + + System default + + + + + Plastique style (KDE like) + + + + + Cleanlooks style (Gnome like) + + + + + Motif style (Unix like) + + + + + CDE style (Common Desktop Environment like) + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Ask for confirmation on exit when download list is not empty + + + true + + + + + + + Display top toolbar + + + true + + + + + + + Display current speed in title bar + + + + + + + + + transfer lists refresh interval: + + + + + + + 10 + + + 99999 + + + 1500 + + + + + + + ms + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + System tray icon + + + + + + Disable system tray icon + + + + + + + Close to tray + + + + + + + Minimize to tray + + + false + + + + + + + Start minimized + + + + + + + Show notification balloons in tray + + + true + + + + + + + + + + + + + 0 + 0 + + + + Action for double click + + + + + + + + Download list: + + + + + + + + 0 + 0 + + + + 0 + + + + Start/Stop + + + + + Open folder + + + + + Show properties + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Seeding list: + + + + + + + + Start/Stop + + + + + Open folder + + + + + Show properties + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Vertical + + + + 623 + 20 + + + + + + + + + + + + + 0 + 0 + + + + File system + + + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + Download folder: + + + + + + + + + + + + + + true + + + + 22 + 22 + + + + + 25 + 27 + + + + + :/Icons/oxygen/browse.png:/Icons/oxygen/browse.png + + + + + + + + + + + + + Temp folder: + + + + + + + false + + + + + + + false + + + + 25 + 27 + + + + + 22 + 22 + + + + + 25 + 27 + + + + + :/Icons/oxygen/browse.png:/Icons/oxygen/browse.png + + + + + + + + + Pre-allocate all files + + + + + + + + + + + 0 + 0 + + + + Folder watching + + + + + + Automatically download torrents present in this folder: + + + + + + + 6 + + + 0 + + + + + false + + + + + + + false + + + + 22 + 22 + + + + + 25 + 27 + + + + + :/Icons/oxygen/browse.png:/Icons/oxygen/browse.png + + + + + + + + + + + + + + Torrent queueing + + + + + + Enable queueing system + + + + + + + + + false + + + Maximum active downloads: + + + + + + + false + + + -1 + + + 999 + + + 3 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + false + + + Maximum active uploads: + + + + + + + false + + + -1 + + + 999 + + + 3 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + false + + + Maximum active torrents: + + + + + + + false + + + -1 + + + 999 + + + 5 + + + + + + + Qt::Horizontal + + + + 381 + 20 + + + + + + + + + + + + + + + + 0 + 0 + + + + When adding a torrent + + + + + + + + Display torrent content and some options + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Do not start download automatically + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + Listening port + + + + + + + + Port used for incoming connections: + + + + + + + 1000 + + + 65535 + + + 6881 + + + + + + + Random + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + Enable UPnP port mapping + + + true + + + + + + + Enable NAT-PMP port mapping + + + true + + + + + + + + + + + + + + Connections limit + + + + + + + + Global maximum number of connections: + + + true + + + + + + + true + + + + 8 + + + + 2 + + + 2000 + + + 500 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Maximum number of connections per torrent: + + + true + + + + + + + + 8 + + + + 2 + + + 2000 + + + 100 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Maximum number of upload slots per torrent: + + + true + + + + + + + + 8 + + + + 500 + + + 4 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Global bandwidth limiting + + + + + + + + + + + 0 + 45 + + + + Upload: + + + true + + + + + + + + 0 + 37 + + + + Download: + + + + + + + + + + + + + true + + + + 0 + 27 + + + + + + + 1 + + + 1000000 + + + 50 + + + + + + + KiB/s + + + + + + + + + + + false + + + + 0 + 27 + + + + + + + 1 + + + 1000000 + + + 100 + + + + + + + KiB/s + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Vertical + + + + 623 + 121 + + + + + + + + + + + + Bittorrent features + + + + + + Enable DHT network (decentralized) + + + true + + + + + + + Use the same port for DHT and Bittorrent + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 13 + 20 + + + + + + + + false + + + DHT port: + + + + + + + false + + + 1000 + + + 65525 + + + 6882 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Enable Local Peer Discovery + + + true + + + + + + + Spoof µtorrent to avoid ban (requires restart) + + + + + + + + + Encryption: + + + + + + + + Enabled + + + + + Forced + + + + + Disabled + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Share ratio settings + + + + + + + + Desired ratio: + + + + + + + false + + + + 8 + + + + Qt::AlignHCenter + + + 1 + + + 1.000000000000000 + + + 10.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Remove finished torrents when their ratio reaches: + + + + + + + false + + + + 8 + + + + Qt::AlignHCenter + + + 1 + + + 1.000000000000000 + + + 10.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Search engine proxy settings + + + + + + + + Type: + + + + + + + + (None) + + + + + HTTP + + + + + + + + false + + + Proxy: + + + + + + + false + + + + + + 75 + + + QLineEdit::Normal + + + + + + + false + + + Port: + + + + + + + false + + + 65535 + + + 8080 + + + + + + + Qt::Horizontal + + + + 21 + 29 + + + + + + + + + + + + false + + + Authentication + + + + + + + + + + + false + + + Username: + + + + + + + false + + + Password: + + + + + + + + + + + false + + + + + + 1000 + + + QLineEdit::Normal + + + + + + + false + + + + + + 1000 + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + true + + + Bittorrent proxy settings + + + + + + + + Type: + + + + + + + + (None) + + + + + HTTP + + + + + SOCKS5 + + + + + + + + false + + + Proxy: + + + + + + + false + + + + + + 75 + + + QLineEdit::Normal + + + + + + + false + + + Port: + + + + + + + false + + + 65535 + + + 8080 + + + + + + + Qt::Horizontal + + + + 21 + 29 + + + + + + + + + + + + false + + + Authentication + + + + + + + + + + + false + + + Username: + + + + + + + false + + + Password: + + + + + + + + + + + false + + + + + + 1000 + + + QLineEdit::Normal + + + + + + + false + + + + + + 1000 + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + false + + + + 0 + 110 + + + + Affected connections + + + + + + + 0 + 0 + + + + Use proxy for connections to trackers + + + true + + + + + + + + 0 + 0 + + + + Use proxy for connections to regular peers + + + true + + + + + + + + 0 + 0 + + + + Use proxy for DHT messages + + + true + + + + + + + + 0 + 0 + + + + Use proxy for connections to web seeds + + + true + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + true + + + Filter Settings + + + + + + Activate IP Filtering + + + + :/Icons/filter.png:/Icons/filter.png + + + + + + + + + false + + + Filter file path: + + + + + + + false + + + + + + + false + + + + 22 + 22 + + + + + 25 + 27 + + + + + :/Icons/oxygen/browse.png:/Icons/oxygen/browse.png + + + + + + + + + + + + Qt::Vertical + + + + 623 + 20 + + + + + + + + + + + + true + + + Enable Web User Interface + + + true + + + + + + + true + + + HTTP Server + + + + + + true + + + Port: + + + + + + + true + + + 65535 + + + 80 + + + + + + + Qt::Horizontal + + + + 21 + 29 + + + + + + + + + + + true + + + Authentication + + + + + + + + true + + + Username: + + + + + + + true + + + Password: + + + + + + + + + + + true + + + + + + 1000 + + + QLineEdit::Normal + + + + + + + true + + + + + + 1000 + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + + 198 + 57 + + + + + + + + + + + Qt::Vertical + + + + 623 + 41 + + + + + + + + + + + + RSS + + + + + + Enable RSS support + + + + + + + false + + + RSS settings + + + + + + + + + 48 + 48 + + + + + 48 + 48 + + + + + + + :/Icons/rss32.png + + + true + + + + + + + + + + + RSS feeds refresh interval: + + + + + + + 1 + + + 999999 + + + 5 + + + + + + + minutes + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Maximum number of articles per feed: + + + + + + + 9999 + + + 100 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 317 + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 208 + 20 + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + + + + + + tabOption + comboI18n + comboStyle + checkConfirmExit + checkSpeedInTitle + spinRefreshInterval + checkNoSystray + checkCloseToSystray + checkMinimizeToSysTray + checkStartMinimized + checkSystrayBalloons + textSavePath + browseSaveDirButton + checkPreallocateAll + checkAdditionDialog + checkStartPaused + checkScanDir + browseScanDirButton + spinPort + checkUPnP + checkNATPMP + checkDHT + checkLSD + comboEncryption + checkRatioLimit + spinRatio + checkRatioRemove + spinMaxRatio + checkIPFilter + textFilterPath + browseFilterButton + checkWebUi + spinWebUiPort + textWebUiUsername + textWebUiPassword + + + + + + diff --git a/src/options_imp.cpp b/src/options_imp.cpp new file mode 100644 index 000000000..1b536432b --- /dev/null +++ b/src/options_imp.cpp @@ -0,0 +1,1417 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "qgnomelook.h" +#include +#include +#include +#include +#include +#ifdef Q_WS_WIN + #include +#endif + +#ifdef Q_WS_MAC + #include +#endif + +#include +#include + +#include "options_imp.h" +#include "misc.h" + +// Constructor +options_imp::options_imp(QWidget *parent):QDialog(parent){ + qDebug("-> Constructing Options"); + QString savePath; + setupUi(this); + // Get apply button in button box + QList buttons = buttonBox->buttons(); + foreach(QAbstractButton *button, buttons){ + if(buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole){ + applyButton = button; + break; + } + } + connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(applySettings(QAbstractButton*))); +#ifdef Q_WS_WIN + comboStyle->addItem("Windows XP Style (Windows Only)"); +#endif +#ifdef Q_WS_MAC + comboStyle->addItem("MacOS Style (MacOS Only)"); +#endif + // Languages supported + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/united_kingdom.png"))), QString::fromUtf8("English")); + locales << "en_GB"; + comboI18n->setCurrentIndex(0); + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/france.png"))), QString::fromUtf8("Français")); + locales << "fr_FR"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/germany.png"))), QString::fromUtf8("Deutsch")); + locales << "de_DE"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/hungary.png"))), QString::fromUtf8("Magyar")); + locales << "hu_HU"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/italy.png"))), QString::fromUtf8("Italiano")); + locales << "it_IT"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/netherlands.png"))), QString::fromUtf8("Nederlands")); + locales << "nl_NL"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/spain.png"))), QString::fromUtf8("Español")); + locales << "es_ES"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/spain_catalunya.png"))), QString::fromUtf8("Català")); + locales << "ca_ES"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/portugal.png"))), QString::fromUtf8("Português")); + locales << "pt_PT"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/brazil.png"))), QString::fromUtf8("Português brasileiro")); + locales << "pt_BR"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/poland.png"))), QString::fromUtf8("Polski")); + locales << "pl_PL"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/czech.png"))), QString::fromUtf8("Čeština")); + locales << "cs_CZ"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/slovakia.png"))), QString::fromUtf8("Slovenčina")); + locales << "sk_SK"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/romania.png"))), QString::fromUtf8("Română")); + locales << "ro_RO"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/turkey.png"))), QString::fromUtf8("Türkçe")); + locales << "tr_TR"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/greece.png"))), QString::fromUtf8("Ελληνικά")); + locales << "el_GR"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/sweden.png"))), QString::fromUtf8("Svenska")); + locales << "sv_SE"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/finland.png"))), QString::fromUtf8("Suomi")); + locales << "fi_FI"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/norway.png"))), QString::fromUtf8("Norsk")); + locales << "nb_NO"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/denmark.png"))), QString::fromUtf8("Dansk")); + locales << "da_DK"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/bulgaria.png"))), QString::fromUtf8("Български")); + locales << "bg_BG"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/ukraine.png"))), QString::fromUtf8("Українська")); + locales << "uk_UA"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/russia.png"))), QString::fromUtf8("Русский")); + locales << "ru_RU"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/japan.png"))), QString::fromUtf8("日本語")); + locales << "ja_JP"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/china.png"))), QString::fromUtf8("中文 (简体)")); + locales << "zh_CN"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/taiwan.png"))), QString::fromUtf8("中文 (繁體)")); + locales << "zh_TW"; + comboI18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/south_korea.png"))), QString::fromUtf8("한글")); + locales << "ko_KR"; + + // Load options + loadOptions(); + // Disable systray integration if it is not supported by the system + if(!QSystemTrayIcon::isSystemTrayAvailable()){ + checkNoSystray->setEnabled(false); + } + // Connect signals / slots + // General tab + connect(checkNoSystray, SIGNAL(stateChanged(int)), this, SLOT(setSystrayOptionsState(int))); + // Downloads tab + connect(checkTempFolder, SIGNAL(stateChanged(int)), this, SLOT(enableTempPathInput(int))); + connect(checkScanDir, SIGNAL(stateChanged(int)), this, SLOT(enableDirScan(int))); + connect(actionTorrentDlOnDblClBox, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(actionTorrentFnOnDblClBox, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(checkTempFolder, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + // Connection tab + connect(checkUploadLimit, SIGNAL(stateChanged(int)), this, SLOT(enableUploadLimit(int))); + connect(checkDownloadLimit, SIGNAL(stateChanged(int)), this, SLOT(enableDownloadLimit(int))); + // Bittorrent tab + connect(checkMaxConnecs, SIGNAL(stateChanged(int)), this, SLOT(enableMaxConnecsLimit(int))); + connect(checkMaxConnecsPerTorrent, SIGNAL(stateChanged(int)), this, SLOT(enableMaxConnecsLimitPerTorrent(int))); + connect(checkMaxUploadsPerTorrent, SIGNAL(stateChanged(int)), this, SLOT(enableMaxUploadsLimitPerTorrent(int))); + connect(checkRatioLimit, SIGNAL(stateChanged(int)), this, SLOT(enableShareRatio(int))); + connect(checkRatioRemove, SIGNAL(stateChanged(int)), this, SLOT(enableDeleteRatio(int))); + connect(checkSameDHTPort, SIGNAL(stateChanged(int)), this, SLOT(enableDHTPortSettings(int))); + // Proxy tab + connect(comboProxyType_http, SIGNAL(currentIndexChanged(int)),this, SLOT(enableProxyHTTP(int))); + connect(checkProxyAuth_http, SIGNAL(stateChanged(int)), this, SLOT(enableProxyAuthHTTP(int))); + connect(comboProxyType, SIGNAL(currentIndexChanged(int)),this, SLOT(enableProxy(int))); + connect(checkProxyAuth, SIGNAL(stateChanged(int)), this, SLOT(enableProxyAuth(int))); + // Misc tab + connect(checkIPFilter, SIGNAL(stateChanged(int)), this, SLOT(enableFilter(int))); + connect(checkEnableRSS, SIGNAL(stateChanged(int)), this, SLOT(enableRSS(int))); + connect(checkEnableQueueing, SIGNAL(stateChanged(int)), this, SLOT(enableQueueingSystem(int))); + // Web UI tab + connect(checkWebUi, SIGNAL(toggled(bool)), this, SLOT(enableWebUi(bool))); + + // Apply button is activated when a value is changed + // General tab + connect(comboI18n, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(comboStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(checkConfirmExit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkSpeedInTitle, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinRefreshInterval, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkNoSystray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkCloseToSystray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkMinimizeToSysTray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkStartMinimized, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkSystrayBalloons, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkDisplayToolbar, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + // Downloads tab + connect(textSavePath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkPreallocateAll, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkAdditionDialog, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkStartPaused, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkScanDir, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(textScanDir, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + // Connection tab + connect(spinPort, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkUPnP, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkNATPMP, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkUploadLimit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkDownloadLimit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinUploadLimit, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinDownloadLimit, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + // Bittorrent tab + connect(checkMaxConnecs, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkMaxConnecsPerTorrent, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkMaxUploadsPerTorrent, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinMaxConnec, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinMaxConnecPerTorrent, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinMaxUploadsPerTorrent, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkDHT, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkSameDHTPort, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinDHTPort, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkLSD, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkAzureusSpoof, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(comboEncryption, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(checkRatioLimit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkRatioRemove, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinRatio, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinMaxRatio, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + // Proxy tab + connect(comboProxyType_http, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(textProxyIP_http, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinProxyPort_http, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkProxyAuth_http, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(textProxyUsername_http, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(textProxyPassword_http, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(comboProxyType, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(textProxyIP, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinProxyPort, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkProxyAuth, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(textProxyUsername, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(textProxyPassword, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkProxyTrackers, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkProxyPeers, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkProxyWebseeds, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkProxyDHT, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + // Misc tab + connect(checkIPFilter, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(textFilterPath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinRSSRefresh, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinRSSMaxArticlesPerFeed, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(checkEnableRSS, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(checkEnableQueueing, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(spinMaxActiveDownloads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinMaxActiveUploads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spinMaxActiveTorrents, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + // Web UI tab + connect(checkWebUi, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(spinWebUiPort, SIGNAL(valueChanged(int)), this, SLOT(enableApplyButton())); + connect(textWebUiUsername, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(textWebUiPassword, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + // Disable apply Button + applyButton->setEnabled(false); + if(!QSystemTrayIcon::supportsMessages()){ + // Mac OS X doesn't support it yet + checkSystrayBalloons->setChecked(false); + checkSystrayBalloons->setEnabled(false); + } + // Tab selection mecanism + connect(tabSelection, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(changePage(QListWidgetItem *, QListWidgetItem*))); + // Adapt size + adaptToScreenSize(); +} + +// Main destructor +options_imp::~options_imp(){ + qDebug("-> destructing Options"); +} + +void options_imp::changePage(QListWidgetItem *current, QListWidgetItem *previous) { + if (!current) + current = previous; + tabOption->setCurrentIndex(tabSelection->row(current)); + } + +void options_imp::useStyle(){ + int style = getStyle(); + switch(style) { + case 1: + QApplication::setStyle(new QPlastiqueStyle()); + break; + case 2: + QApplication::setStyle(new QGnomeLookStyle()); + break; + case 3: + QApplication::setStyle(new QMotifStyle()); + break; + case 4: + QApplication::setStyle(new QCDEStyle()); + break; +#ifdef Q_WS_MAC + case 5: + QApplication::setStyle(new QMacStyle()); + break; +#endif +#ifdef Q_WS_WIN + case 6: + QApplication::setStyle(new QWindowsXPStyle()); + break; +#endif + } +} + +void options_imp::adaptToScreenSize() { + int scrn = 0; + QWidget *w = this->topLevelWidget(); + + if(w) + scrn = QApplication::desktop()->screenNumber(w); + else if(QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(this); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + if(width() > desk.width() || height() > desk.height()) { + if(desk.width() > 0 && desk.height() > 0) + resize(desk.width(), desk.height()); + } +} + +void options_imp::saveOptions(){ + applyButton->setEnabled(false); + QSettings settings("qBittorrent", "qBittorrent"); + // Apply style + useStyle(); + settings.beginGroup("Preferences"); + // General preferences + settings.beginGroup("General"); + settings.setValue(QString::fromUtf8("Locale"), getLocale()); + settings.setValue(QString::fromUtf8("Style"), getStyle()); + settings.setValue(QString::fromUtf8("ExitConfirm"), confirmOnExit()); + settings.setValue(QString::fromUtf8("SpeedInTitleBar"), speedInTitleBar()); + settings.setValue(QString::fromUtf8("RefreshInterval"), getRefreshInterval()); + settings.setValue(QString::fromUtf8("SystrayEnabled"), systrayIntegration()); + settings.setValue(QString::fromUtf8("CloseToTray"), closeToTray()); + settings.setValue(QString::fromUtf8("MinimizeToTray"), minimizeToTray()); + settings.setValue(QString::fromUtf8("StartMinimized"), startMinimized()); + settings.setValue(QString::fromUtf8("NotificationBaloons"), OSDEnabled()); + settings.setValue(QString::fromUtf8("ToolbarDisplayed"), isToolbarDisplayed()); + // End General preferences + settings.endGroup(); + // Downloads preferences + settings.beginGroup("Downloads"); + settings.setValue(QString::fromUtf8("SavePath"), getSavePath()); + settings.setValue(QString::fromUtf8("TempPathEnabled"), isTempPathEnabled()); + settings.setValue(QString::fromUtf8("TempPath"), getTempPath()); + settings.setValue(QString::fromUtf8("PreAllocation"), preAllocateAllFiles()); + settings.setValue(QString::fromUtf8("AdditionDialog"), useAdditionDialog()); + settings.setValue(QString::fromUtf8("StartInPause"), addTorrentsInPause()); + settings.setValue(QString::fromUtf8("ScanDir"), getScanDir()); + settings.setValue(QString::fromUtf8("DblClOnTorDl"), getActionOnDblClOnTorrentDl()); + settings.setValue(QString::fromUtf8("DblClOnTorFn"), getActionOnDblClOnTorrentFn()); + // End Downloads preferences + settings.endGroup(); + // Connection preferences + settings.beginGroup("Connection"); + settings.setValue(QString::fromUtf8("PortRangeMin"), getPort()); + settings.setValue(QString::fromUtf8("UPnP"), isUPnPEnabled()); + settings.setValue(QString::fromUtf8("NAT-PMP"), isNATPMPEnabled()); + settings.setValue(QString::fromUtf8("GlobalDLLimit"), getGlobalBandwidthLimits().first); + settings.setValue(QString::fromUtf8("GlobalUPLimit"), getGlobalBandwidthLimits().second); + settings.setValue(QString::fromUtf8("ProxyType"), getProxyType()); + //if(isProxyEnabled()) { + settings.beginGroup("Proxy"); + // Proxy is enabled, save settings + settings.setValue(QString::fromUtf8("IP"), getProxyIp()); + settings.setValue(QString::fromUtf8("Port"), getProxyPort()); + settings.setValue(QString::fromUtf8("Authentication"), isProxyAuthEnabled()); + //if(isProxyAuthEnabled()) { + // Credentials + settings.setValue(QString::fromUtf8("Username"), getProxyUsername()); + settings.setValue(QString::fromUtf8("Password"), getProxyPassword()); + //} + // Affected connections + settings.setValue(QString::fromUtf8("AffectTrackers"), useProxyForTrackers()); + settings.setValue(QString::fromUtf8("AffectPeers"), useProxyForPeers()); + settings.setValue(QString::fromUtf8("AffectWebSeeds"), useProxyForWebseeds()); + settings.setValue(QString::fromUtf8("AffectDHT"), useProxyForDHT()); + settings.endGroup(); // End Proxy + //} + settings.setValue(QString::fromUtf8("HTTPProxyType"), getHTTPProxyType()); + //if(isHTTPProxyEnabled()) { + settings.beginGroup("HTTPProxy"); + // Proxy is enabled, save settings + settings.setValue(QString::fromUtf8("IP"), getHTTPProxyIp()); + settings.setValue(QString::fromUtf8("Port"), getHTTPProxyPort()); + settings.setValue(QString::fromUtf8("Authentication"), isHTTPProxyAuthEnabled()); + //if(isHTTPProxyAuthEnabled()) { + // Credentials + settings.setValue(QString::fromUtf8("Username"), getHTTPProxyUsername()); + settings.setValue(QString::fromUtf8("Password"), getHTTPProxyPassword()); + //} + settings.endGroup(); // End HTTPProxy + //} + // End Connection preferences + settings.endGroup(); + // Bittorrent preferences + settings.beginGroup("Bittorrent"); + settings.setValue(QString::fromUtf8("MaxConnecs"), getMaxConnecs()); + settings.setValue(QString::fromUtf8("MaxConnecsPerTorrent"), getMaxConnecsPerTorrent()); + settings.setValue(QString::fromUtf8("MaxUploadsPerTorrent"), getMaxUploadsPerTorrent()); + settings.setValue(QString::fromUtf8("DHT"), isDHTEnabled()); + settings.setValue(QString::fromUtf8("sameDHTPortAsBT"), isDHTPortSameAsBT()); + settings.setValue(QString::fromUtf8("DHTPort"), getDHTPort()); + settings.setValue(QString::fromUtf8("LSD"), isLSDEnabled()); + settings.setValue(QString::fromUtf8("AzureusSpoof"), shouldSpoofAzureus()); + settings.setValue(QString::fromUtf8("Encryption"), getEncryptionSetting()); + settings.setValue(QString::fromUtf8("DesiredRatio"), getDesiredRatio()); + settings.setValue(QString::fromUtf8("MaxRatio"), getDeleteRatio()); + // End Bittorrent preferences + settings.endGroup(); + // Misc preferences + // * IPFilter + settings.beginGroup("IPFilter"); + settings.setValue(QString::fromUtf8("Enabled"), isFilteringEnabled()); + if(isFilteringEnabled()){ + settings.setValue(QString::fromUtf8("File"), textFilterPath->text()); + } + // End IPFilter preferences + settings.endGroup(); + // RSS + settings.beginGroup("RSS"); + settings.setValue(QString::fromUtf8("RSSEnabled"), isRSSEnabled()); + settings.setValue(QString::fromUtf8("RSSRefresh"), spinRSSRefresh->value()); + settings.setValue(QString::fromUtf8("RSSMaxArticlesPerFeed"), spinRSSMaxArticlesPerFeed->value()); + // End RSS preferences + settings.endGroup(); + // Queueing system + settings.beginGroup("Queueing"); + settings.setValue(QString::fromUtf8("QueueingEnabled"), isQueueingSystemEnabled()); + settings.setValue(QString::fromUtf8("MaxActiveDownloads"), spinMaxActiveDownloads->value()); + settings.setValue(QString::fromUtf8("MaxActiveUploads"), spinMaxActiveUploads->value()); + settings.setValue(QString::fromUtf8("MaxActiveTorrents"), spinMaxActiveTorrents->value()); + // End Queueing system preferences + settings.endGroup(); + // Web UI + settings.beginGroup("WebUI"); + settings.setValue("Enabled", isWebUiEnabled()); + if(isWebUiEnabled()) + { + settings.setValue("Port", webUiPort()); + settings.setValue("Username", webUiUsername()); + settings.setValue("Password", webUiPassword()); + } + // End Web UI + settings.endGroup(); + // End preferences + settings.endGroup(); +} + +bool options_imp::shouldSpoofAzureus() const { + return checkAzureusSpoof->isChecked(); +} + +bool options_imp::isFilteringEnabled() const{ + return checkIPFilter->isChecked(); +} + +int options_imp::getProxyType() const{ + if(comboProxyType->currentIndex() == HTTP){ + if(isProxyAuthEnabled()){ + return HTTP_PW; + }else{ + return HTTP; + } + }else{ + if(comboProxyType->currentIndex() == SOCKS5){ + if(isProxyAuthEnabled()){ + return SOCKS5_PW; + }else{ + return SOCKS5; + } + } + } + return -1; // disabled +} + +int options_imp::getHTTPProxyType() const { + if(comboProxyType_http->currentIndex() == HTTP){ + if(isHTTPProxyAuthEnabled()){ + return HTTP_PW; + }else{ + return HTTP; + } + } + return -1; // disabled +} + +bool options_imp::useProxyForTrackers() const{ + return checkProxyTrackers->isChecked(); +} + +bool options_imp::useProxyForPeers() const{ + return checkProxyPeers->isChecked(); +} + +bool options_imp::useProxyForWebseeds() const{ + return checkProxyWebseeds->isChecked(); +} + +bool options_imp::useProxyForDHT() const{ + return checkProxyDHT->isChecked(); +} + +int options_imp::getStyle() const{ + return comboStyle->currentIndex(); +} + +void options_imp::setStyle(int style){ + if(style >= comboStyle->count() || style < 0) + style = 0; + comboStyle->setCurrentIndex(style); +} + +void options_imp::loadOptions(){ + int intValue; + float floatValue; + QString strValue; + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Preferences"); + // General preferences + settings.beginGroup("General"); + setLocale(settings.value(QString::fromUtf8("Locale"), "en_GB").toString()); + setStyle(settings.value(QString::fromUtf8("Style"), 0).toInt()); + checkConfirmExit->setChecked(settings.value(QString::fromUtf8("ExitConfirm"), true).toBool()); + checkSpeedInTitle->setChecked(settings.value(QString::fromUtf8("SpeedInTitleBar"), false).toBool()); + spinRefreshInterval->setValue(settings.value(QString::fromUtf8("RefreshInterval"), 1500).toInt()); + checkNoSystray->setChecked(!settings.value(QString::fromUtf8("SystrayEnabled"), true).toBool()); + checkDisplayToolbar->setChecked(settings.value(QString::fromUtf8("ToolbarDisplayed"), true).toBool()); + if(!systrayIntegration()) { + disableSystrayOptions(); + } else { + enableSystrayOptions(); + checkCloseToSystray->setChecked(settings.value(QString::fromUtf8("CloseToTray"), false).toBool()); + checkMinimizeToSysTray->setChecked(settings.value(QString::fromUtf8("MinimizeToTray"), false).toBool()); + checkStartMinimized->setChecked(settings.value(QString::fromUtf8("StartMinimized"), false).toBool()); + checkSystrayBalloons->setChecked(settings.value(QString::fromUtf8("NotificationBaloons"), true).toBool()); + } + // End General preferences + settings.endGroup(); + // Downloads preferences + settings.beginGroup("Downloads"); +#ifdef Q_WS_WIN + QString home = QDir::rootPath(); +#else + QString home = QDir::homePath(); +#endif + if(home[home.length()-1] != QDir::separator()){ + home += QDir::separator(); + } + textSavePath->setText(settings.value(QString::fromUtf8("SavePath"), home+"qBT_dir").toString()); + if(settings.value(QString::fromUtf8("TempPathEnabled"), false).toBool()) { + // enable + checkTempFolder->setChecked(true); + enableTempPathInput(2); + } else { + checkTempFolder->setChecked(false); + enableTempPathInput(0); + } + textTempPath->setText(settings.value(QString::fromUtf8("TempPath"), home+"qBT_dir"+QDir::separator()+"temp").toString()); + checkPreallocateAll->setChecked(settings.value(QString::fromUtf8("PreAllocation"), false).toBool()); + checkAdditionDialog->setChecked(settings.value(QString::fromUtf8("AdditionDialog"), true).toBool()); + checkStartPaused->setChecked(settings.value(QString::fromUtf8("StartInPause"), false).toBool()); + strValue = settings.value(QString::fromUtf8("ScanDir"), QString()).toString(); + if(strValue.isEmpty()) { + // Disable + checkScanDir->setChecked(false); + enableDirScan(0); + } else { + // enable + checkScanDir->setChecked(true); + textScanDir->setText(strValue); + enableDirScan(2); + } + actionTorrentDlOnDblClBox->setCurrentIndex(settings.value(QString::fromUtf8("DblClOnTorDl"), 0).toInt()); + actionTorrentFnOnDblClBox->setCurrentIndex(settings.value(QString::fromUtf8("DblClOnTorFn"), 0).toInt()); + intValue = settings.value(QString::fromUtf8("DblClOnTorFn"), 1).toInt(); + // End Downloads preferences + settings.endGroup(); + // Connection preferences + settings.beginGroup("Connection"); + spinPort->setValue(settings.value(QString::fromUtf8("PortRangeMin"), 6881).toInt()); + checkUPnP->setChecked(settings.value(QString::fromUtf8("UPnP"), true).toBool()); + checkNATPMP->setChecked(settings.value(QString::fromUtf8("NAT-PMP"), true).toBool()); + intValue = settings.value(QString::fromUtf8("GlobalDLLimit"), -1).toInt(); + if(intValue > 0) { + // Enabled + checkDownloadLimit->setChecked(true); + spinDownloadLimit->setEnabled(true); + spinDownloadLimit->setValue(intValue); + } else { + // Disabled + checkDownloadLimit->setChecked(false); + spinDownloadLimit->setEnabled(false); + } + intValue = settings.value(QString::fromUtf8("GlobalUPLimit"), 50).toInt(); + if(intValue != -1) { + // Enabled + checkUploadLimit->setChecked(true); + spinUploadLimit->setEnabled(true); + spinUploadLimit->setValue(intValue); + } else { + // Disabled + checkUploadLimit->setChecked(false); + spinUploadLimit->setEnabled(false); + } + intValue = settings.value(QString::fromUtf8("ProxyType"), 0).toInt(); + if(intValue <= 0) { + intValue = 0; + } else { + if(intValue%2 == 0) { + intValue = 2; + }else { + intValue = 1; + } + } + comboProxyType->setCurrentIndex(intValue); + enableProxy(intValue); + //if(isProxyEnabled()) { + settings.beginGroup("Proxy"); + // Proxy is enabled, save settings + textProxyIP->setText(settings.value(QString::fromUtf8("IP"), "0.0.0.0").toString()); + spinProxyPort->setValue(settings.value(QString::fromUtf8("Port"), 8080).toInt()); + checkProxyAuth->setChecked(settings.value(QString::fromUtf8("Authentication"), false).toBool()); + textProxyUsername->setText(settings.value(QString::fromUtf8("Username"), QString()).toString()); + textProxyPassword->setText(settings.value(QString::fromUtf8("Password"), QString()).toString()); + if(isProxyAuthEnabled()) { + enableProxyAuth(2); // Enable + // Credentials + } else { + enableProxyAuth(0); // Disable + } + // Affected connections + checkProxyTrackers->setChecked(settings.value(QString::fromUtf8("AffectTrackers"), true).toBool()); + checkProxyPeers->setChecked(settings.value(QString::fromUtf8("AffectPeers"), true).toBool()); + checkProxyWebseeds->setChecked(settings.value(QString::fromUtf8("AffectWebSeeds"), true).toBool()); + checkProxyDHT->setChecked(settings.value(QString::fromUtf8("AffectDHT"), true).toBool()); + settings.endGroup(); // End Proxy + //} + intValue = settings.value(QString::fromUtf8("HTTPProxyType"), 0).toInt(); + if(intValue <= 0) { + intValue = 0; + } else { + intValue = 1; + } + comboProxyType_http->setCurrentIndex(intValue); + enableProxyHTTP(intValue); + settings.beginGroup("HTTPProxy"); + textProxyUsername_http->setText(settings.value(QString::fromUtf8("Username"), QString()).toString()); + textProxyPassword_http->setText(settings.value(QString::fromUtf8("Password"), QString()).toString()); + textProxyIP_http->setText(settings.value(QString::fromUtf8("IP"), "0.0.0.0").toString()); + spinProxyPort_http->setValue(settings.value(QString::fromUtf8("Port"), 8080).toInt()); + checkProxyAuth_http->setChecked(settings.value(QString::fromUtf8("Authentication"), false).toBool()); + if(isHTTPProxyEnabled()) { + if(isHTTPProxyAuthEnabled()) { + enableProxyAuthHTTP(2); // Enable + } else { + enableProxyAuthHTTP(0); // Disable + } + } else { + enableProxyAuthHTTP(0); // Disable + } + settings.endGroup(); // End HTTPProxy + // End Connection preferences + settings.endGroup(); + // Bittorrent preferences + settings.beginGroup("Bittorrent"); + intValue = settings.value(QString::fromUtf8("MaxConnecs"), 500).toInt(); + if(intValue != -1) { + // enable + checkMaxConnecs->setChecked(true); + spinMaxConnec->setEnabled(true); + spinMaxConnec->setValue(intValue); + } else { + // disable + checkMaxConnecs->setChecked(false); + spinMaxConnec->setEnabled(false); + } + intValue = settings.value(QString::fromUtf8("MaxConnecsPerTorrent"), 100).toInt(); + if(intValue != -1) { + // enable + checkMaxConnecsPerTorrent->setChecked(true); + spinMaxConnecPerTorrent->setEnabled(true); + spinMaxConnecPerTorrent->setValue(intValue); + } else { + // disable + checkMaxConnecsPerTorrent->setChecked(false); + spinMaxConnecPerTorrent->setEnabled(false); + } + intValue = settings.value(QString::fromUtf8("MaxUploadsPerTorrent"), 4).toInt(); + if(intValue != -1) { + // enable + checkMaxUploadsPerTorrent->setChecked(true); + spinMaxUploadsPerTorrent->setEnabled(true); + spinMaxUploadsPerTorrent->setValue(intValue); + } else { + // disable + checkMaxUploadsPerTorrent->setChecked(false); + spinMaxUploadsPerTorrent->setEnabled(false); + } + checkDHT->setChecked(settings.value(QString::fromUtf8("DHT"), true).toBool()); + checkSameDHTPort->setChecked(settings.value(QString::fromUtf8("sameDHTPortAsBT"), true).toBool()); + enableDHTPortSettings(checkSameDHTPort->checkState()); + spinDHTPort->setValue(settings.value(QString::fromUtf8("DHTPort"), 6882).toInt()); + checkLSD->setChecked(settings.value(QString::fromUtf8("LSD"), true).toBool()); + checkAzureusSpoof->setChecked(settings.value(QString::fromUtf8("AzureusSpoof"), false).toBool()); + comboEncryption->setCurrentIndex(settings.value(QString::fromUtf8("Encryption"), 0).toInt()); + floatValue = settings.value(QString::fromUtf8("DesiredRatio"), -1).toDouble(); + if(floatValue >= 1.) { + // Enable + checkRatioLimit->setChecked(true); + spinRatio->setEnabled(true); + spinRatio->setValue(floatValue); + } else { + // Disable + checkRatioLimit->setChecked(false); + spinRatio->setEnabled(false); + } + floatValue = settings.value(QString::fromUtf8("MaxRatio"), -1).toDouble(); + if(floatValue >= 1.) { + // Enable + checkRatioRemove->setChecked(true); + spinMaxRatio->setEnabled(true); + spinMaxRatio->setValue(floatValue); + } else { + // Disable + checkRatioRemove->setChecked(false); + spinMaxRatio->setEnabled(false); + } + // End Bittorrent preferences + settings.endGroup(); + // Misc preferences + // * IP Filter + settings.beginGroup("IPFilter"); + checkIPFilter->setChecked(settings.value(QString::fromUtf8("Enabled"), false).toBool()); + if(isFilteringEnabled()) { + enableFilter(2); // Enable + textFilterPath->setText(settings.value(QString::fromUtf8("File"), QString()).toString()); + } else { + enableFilter(0); // Disable + } + // End IP Filter + settings.endGroup(); + // * RSS + settings.beginGroup("RSS"); + checkEnableRSS->setChecked(settings.value(QString::fromUtf8("RSSEnabled"), false).toBool()); + if(isRSSEnabled()) { + enableRSS(2); // Enable + } else { + enableRSS(0); // Disable + } + spinRSSRefresh->setValue(settings.value(QString::fromUtf8("RSSRefresh"), 5).toInt()); + spinRSSMaxArticlesPerFeed->setValue(settings.value(QString::fromUtf8("RSSMaxArticlesPerFeed"), 50).toInt()); + // End RSS preferences + settings.endGroup(); + // Queueing system preferences + settings.beginGroup("Queueing"); + checkEnableQueueing->setChecked(settings.value("QueueingEnabled", false).toBool()); + if(isQueueingSystemEnabled()) { + enableQueueingSystem(2); // Enable + spinMaxActiveDownloads->setValue(settings.value(QString::fromUtf8("MaxActiveDownloads"), 3).toInt()); + spinMaxActiveUploads->setValue(settings.value(QString::fromUtf8("MaxActiveUploads"), 3).toInt()); + spinMaxActiveTorrents->setValue(settings.value(QString::fromUtf8("MaxActiveTorrents"), 5).toInt()); + } else { + enableQueueingSystem(0); // Disable + } + // End Queueing system preferences + settings.endGroup(); + // Web UI + settings.beginGroup("WebUI"); + checkWebUi->setChecked(settings.value("Enabled", false).toBool()); + enableWebUi(isWebUiEnabled()); + spinWebUiPort->setValue(settings.value("Port", 8080).toInt()); + textWebUiUsername->setText(settings.value("Username", "user").toString()); + textWebUiPassword->setText(settings.value("Password", "").toString()); + // End Web UI + settings.endGroup(); + // Random stuff + srand(time(0)); +} + +// return min & max ports +// [min, max] +int options_imp::getPort() const{ + return spinPort->value(); +} + +void options_imp::on_randomButton_clicked() { + // Range [1024: 65535] + spinPort->setValue(rand() % 64512 + 1024); +} + +int options_imp::getEncryptionSetting() const{ + return comboEncryption->currentIndex(); +} + +int options_imp::getMaxActiveDownloads() const { + return spinMaxActiveDownloads->value(); +} + +int options_imp::getMaxActiveUploads() const { + return spinMaxActiveUploads->value(); +} + +int options_imp::getMaxActiveTorrents() const { + return spinMaxActiveTorrents->value(); +} + +bool options_imp::minimizeToTray() const{ + if(checkNoSystray->isChecked()) return false; + return checkMinimizeToSysTray->isChecked(); +} + +bool options_imp::closeToTray() const{ + if(checkNoSystray->isChecked()) return false; + return checkCloseToSystray->isChecked(); +} + +unsigned int options_imp::getRefreshInterval() const { + return spinRefreshInterval->value(); +} + +bool options_imp::confirmOnExit() const{ + return checkConfirmExit->isChecked(); +} + +bool options_imp::isDirScanEnabled() const { + return checkScanDir->isChecked(); +} + +bool options_imp::isQueueingSystemEnabled() const { + return checkEnableQueueing->isChecked(); +} + +bool options_imp::isDHTEnabled() const{ + return checkDHT->isChecked(); +} + +bool options_imp::isRSSEnabled() const{ + return checkEnableRSS->isChecked(); +} + +bool options_imp::isLSDEnabled() const{ + return checkLSD->isChecked(); +} + +bool options_imp::isUPnPEnabled() const{ + return checkUPnP->isChecked(); +} + +bool options_imp::isNATPMPEnabled() const{ + return checkNATPMP->isChecked(); +} + +// Return Download & Upload limits in kbps +// [download,upload] +QPair options_imp::getGlobalBandwidthLimits() const{ + int DL = -1, UP = -1; + if(checkDownloadLimit->isChecked()){ + DL = spinDownloadLimit->value(); + } + if(checkUploadLimit->isChecked()){ + UP = spinUploadLimit->value(); + } + return qMakePair(DL, UP); +} + +bool options_imp::OSDEnabled() const { + if(checkNoSystray->isChecked()) return false; + return checkSystrayBalloons->isChecked(); +} + +bool options_imp::startMinimized() const { + if(checkStartMinimized->isChecked()) return true; + return checkStartMinimized->isChecked(); +} + +bool options_imp::systrayIntegration() const{ + if (!QSystemTrayIcon::isSystemTrayAvailable()) return false; + return (!checkNoSystray->isChecked()); +} + +int options_imp::getDHTPort() const { +if(isDHTPortSameAsBT()) + return 0; +return spinDHTPort->value(); +} + +// Return Share ratio +float options_imp::getDesiredRatio() const{ + if(checkRatioLimit->isChecked()){ + return spinRatio->value(); + } + return -1; +} + +// Return Share ratio +float options_imp::getDeleteRatio() const{ + if(checkRatioRemove->isChecked()){ + return spinMaxRatio->value(); + } + return -1; +} + +// Return Save Path +QString options_imp::getSavePath() const{ +#ifdef Q_WS_WIN + QString home = QDir::rootPath(); +#else + QString home = QDir::homePath(); +#endif + if(home[home.length()-1] != QDir::separator()){ + home += QDir::separator(); + } + if(textSavePath->text().trimmed().isEmpty()){ + textSavePath->setText(home+QString::fromUtf8("qBT_dir")); + } + return textSavePath->text(); +} + +QString options_imp::getTempPath() const { + return textTempPath->text(); +} + +bool options_imp::isTempPathEnabled() const { + return checkTempFolder->isChecked(); +} + +// Return max connections number +int options_imp::getMaxConnecs() const{ + if(!checkMaxConnecs->isChecked()){ + return -1; + }else{ + return spinMaxConnec->value(); + } +} + +int options_imp::getMaxConnecsPerTorrent() const{ + if(!checkMaxConnecsPerTorrent->isChecked()){ + return -1; + }else{ + return spinMaxConnecPerTorrent->value(); + } +} + +int options_imp::getMaxUploadsPerTorrent() const{ + if(!checkMaxUploadsPerTorrent->isChecked()){ + return -1; + }else{ + return spinMaxUploadsPerTorrent->value(); + } +} + +void options_imp::on_buttonBox_accepted(){ + if(applyButton->isEnabled()){ + saveOptions(); + applyButton->setEnabled(false); + // set infobar text + this->hide(); + emit status_changed(true); + }else{ + setAttribute(Qt::WA_DeleteOnClose); + accept(); + } +} + +void options_imp::applySettings(QAbstractButton* button) { + if(button == applyButton){ + saveOptions(); + emit status_changed(false); + } +} + +void options_imp::closeEvent(QCloseEvent *e){ + setAttribute(Qt::WA_DeleteOnClose); + e->accept(); +} + +void options_imp::on_buttonBox_rejected(){ + setAttribute(Qt::WA_DeleteOnClose); + reject(); +} + +void options_imp::enableDownloadLimit(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinDownloadLimit->setEnabled(false); + }else{ + //enable + spinDownloadLimit->setEnabled(true); + } +} + +void options_imp::enableTempPathInput(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + textTempPath->setEnabled(false); + browseTempDirButton->setEnabled(false); + }else{ + //enable + textTempPath->setEnabled(true); + browseTempDirButton->setEnabled(true); + } +} + +bool options_imp::useAdditionDialog() const{ + return checkAdditionDialog->isChecked(); +} + +void options_imp::enableMaxConnecsLimit(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinMaxConnec->setEnabled(false); + }else{ + //enable + spinMaxConnec->setEnabled(true); + } +} + +void options_imp::enableQueueingSystem(int checkBoxValue) { + if(checkBoxValue != 2) { + //Disable + spinMaxActiveDownloads->setEnabled(false); + spinMaxActiveUploads->setEnabled(false); + label_max_active_dl->setEnabled(false); + label_max_active_up->setEnabled(false); + maxActiveTorrents_lbl->setEnabled(false); + spinMaxActiveTorrents->setEnabled(false); + }else{ + //enable + spinMaxActiveDownloads->setEnabled(true); + spinMaxActiveUploads->setEnabled(true); + label_max_active_dl->setEnabled(true); + label_max_active_up->setEnabled(true); + maxActiveTorrents_lbl->setEnabled(true); + spinMaxActiveTorrents->setEnabled(true); + } +} + +void options_imp::enableMaxConnecsLimitPerTorrent(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinMaxConnecPerTorrent->setEnabled(false); + }else{ + //enable + spinMaxConnecPerTorrent->setEnabled(true); + } +} + +void options_imp::enableSystrayOptions() { + checkCloseToSystray->setEnabled(true); + checkMinimizeToSysTray->setEnabled(true); + checkSystrayBalloons->setEnabled(true); +} + +void options_imp::disableSystrayOptions() { + checkCloseToSystray->setEnabled(false); + checkMinimizeToSysTray->setEnabled(false); + checkSystrayBalloons->setEnabled(false); +} + +void options_imp::setSystrayOptionsState(int checkBoxValue) { + if(checkBoxValue == 2) { + disableSystrayOptions(); + } else { + enableSystrayOptions(); + } +} + +void options_imp::enableMaxUploadsLimitPerTorrent(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinMaxUploadsPerTorrent->setEnabled(false); + }else{ + //enable + spinMaxUploadsPerTorrent->setEnabled(true); + } +} + +void options_imp::enableFilter(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + lblFilterPath->setEnabled(false); + textFilterPath->setEnabled(false); + browseFilterButton->setEnabled(false); + }else{ + //enable + lblFilterPath->setEnabled(true); + textFilterPath->setEnabled(true); + browseFilterButton->setEnabled(true); + } +} + +void options_imp::enableRSS(int checkBoxValue) { + if(checkBoxValue != 2){ + //Disable + groupRSSSettings->setEnabled(false); + }else{ + //enable + groupRSSSettings->setEnabled(true); + } +} + +void options_imp::enableUploadLimit(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinUploadLimit->setEnabled(false); + }else{ + //enable + spinUploadLimit->setEnabled(true); + } +} + +void options_imp::enableApplyButton(){ + if(!applyButton->isEnabled()){ + applyButton->setEnabled(true); + } +} + +void options_imp::enableShareRatio(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinRatio->setEnabled(false); + }else{ + //enable + spinRatio->setEnabled(true); + } +} + +void options_imp::enableDHTPortSettings(int checkBoxValue) { +if(checkBoxValue == 2){ + //Disable + spinDHTPort->setEnabled(false); + dh_port_lbl->setEnabled(false); + }else{ + //enable + spinDHTPort->setEnabled(true); + dh_port_lbl->setEnabled(true); + } +} + +void options_imp::enableDeleteRatio(int checkBoxValue){ + if(checkBoxValue != 2){ + //Disable + spinMaxRatio->setEnabled(false); + }else{ + //enable + spinMaxRatio->setEnabled(true); + } +} + +void options_imp::enableProxy(int index){ + if(index){ + //enable + lblProxyIP->setEnabled(true); + textProxyIP->setEnabled(true); + lblProxyPort->setEnabled(true); + spinProxyPort->setEnabled(true); + checkProxyAuth->setEnabled(true); + ProxyConnecsBox->setEnabled(true); + }else{ + //disable + lblProxyIP->setEnabled(false); + textProxyIP->setEnabled(false); + lblProxyPort->setEnabled(false); + spinProxyPort->setEnabled(false); + checkProxyAuth->setEnabled(false); + checkProxyAuth->setEnabled(false); + ProxyConnecsBox->setEnabled(false); + } +} + +void options_imp::enableProxyHTTP(int index){ + if(index){ + //enable + lblProxyIP_http->setEnabled(true); + textProxyIP_http->setEnabled(true); + lblProxyPort_http->setEnabled(true); + spinProxyPort_http->setEnabled(true); + checkProxyAuth_http->setEnabled(true); + }else{ + //disable + lblProxyIP_http->setEnabled(false); + textProxyIP_http->setEnabled(false); + lblProxyPort_http->setEnabled(false); + spinProxyPort_http->setEnabled(false); + checkProxyAuth_http->setEnabled(false); + checkProxyAuth_http->setEnabled(false); + } +} + +void options_imp::enableProxyAuth(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + lblProxyUsername->setEnabled(true); + lblProxyPassword->setEnabled(true); + textProxyUsername->setEnabled(true); + textProxyPassword->setEnabled(true); + }else{ + //disable + lblProxyUsername->setEnabled(false); + lblProxyPassword->setEnabled(false); + textProxyUsername->setEnabled(false); + textProxyPassword->setEnabled(false); + } +} + +void options_imp::enableProxyAuthHTTP(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + lblProxyUsername_http->setEnabled(true); + lblProxyPassword_http->setEnabled(true); + textProxyUsername_http->setEnabled(true); + textProxyPassword_http->setEnabled(true); + }else{ + //disable + lblProxyUsername_http->setEnabled(false); + lblProxyPassword_http->setEnabled(false); + textProxyUsername_http->setEnabled(false); + textProxyPassword_http->setEnabled(false); + } +} + +void options_imp::enableDirScan(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + textScanDir->setEnabled(true); + browseScanDirButton->setEnabled(true); + }else{ + //disable + textScanDir->setEnabled(false); + browseScanDirButton->setEnabled(false); + } +} + +bool options_imp::speedInTitleBar() const { + return checkSpeedInTitle->isChecked(); +} + +bool options_imp::preAllocateAllFiles() const { + return checkPreallocateAll->isChecked(); +} + +bool options_imp::addTorrentsInPause() const { + return checkStartPaused->isChecked(); +} + +bool options_imp::isDHTPortSameAsBT() const { + return checkSameDHTPort->isChecked(); +} + +// Proxy settings +bool options_imp::isProxyEnabled() const{ + return comboProxyType->currentIndex(); +} + +bool options_imp::isHTTPProxyEnabled() const { + return comboProxyType_http->currentIndex(); +} + +bool options_imp::isProxyAuthEnabled() const{ + return checkProxyAuth->isEnabled() && checkProxyAuth->isChecked(); +} + +bool options_imp::isHTTPProxyAuthEnabled() const{ + return checkProxyAuth_http->isEnabled() && checkProxyAuth_http->isChecked(); +} + +QString options_imp::getProxyIp() const{ + QString ip = textProxyIP->text(); + ip = ip.trimmed(); + return ip; +} + +QString options_imp::getHTTPProxyIp() const{ + QString ip = textProxyIP_http->text(); + ip = ip.trimmed(); + return ip; +} + +unsigned short options_imp::getProxyPort() const{ + return spinProxyPort->value(); +} + +unsigned short options_imp::getHTTPProxyPort() const{ + return spinProxyPort_http->value(); +} + +QString options_imp::getProxyUsername() const{ + QString username = textProxyUsername->text(); + username = username.trimmed(); + return username; +} + +QString options_imp::getHTTPProxyUsername() const{ + QString username = textProxyUsername_http->text(); + username = username.trimmed(); + return username; +} + +QString options_imp::getProxyPassword() const{ + QString password = textProxyPassword->text(); + password = password.trimmed(); + return password; +} + +QString options_imp::getHTTPProxyPassword() const{ + QString password = textProxyPassword_http->text(); + password = password.trimmed(); + return password; +} + +// Locale Settings +QString options_imp::getLocale() const{ + return locales.at(comboI18n->currentIndex()); +} + +void options_imp::setLocale(QString locale){ + int indexLocales=locales.indexOf(QRegExp(locale)); + if(indexLocales != -1){ + comboI18n->setCurrentIndex(indexLocales); + } +} + +// Return scan dir set in options +QString options_imp::getScanDir() const { + if(checkScanDir->isChecked()){ + QString scanDir = textScanDir->text(); + scanDir = scanDir.trimmed(); + return scanDir; + }else{ + return QString(); + } +} + +// Return action on double-click on a downloading torrent set in options +int options_imp::getActionOnDblClOnTorrentDl() const { + if(actionTorrentDlOnDblClBox->currentIndex()<1) + return 0; + return actionTorrentDlOnDblClBox->currentIndex(); +} + +// Return action on double-click on a finished torrent set in options +int options_imp::getActionOnDblClOnTorrentFn() const { + if(actionTorrentFnOnDblClBox->currentIndex()<1) + return 0; + return actionTorrentFnOnDblClBox->currentIndex(); +} + +// Display dialog to choose scan dir +void options_imp::on_browseScanDirButton_clicked() { +#ifdef Q_WS_WIN + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), QDir::rootPath()); +#else + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), QDir::homePath()); +#endif + if(!dir.isNull()){ + textScanDir->setText(dir); + } +} + +void options_imp::on_browseFilterButton_clicked() { +#ifdef Q_WS_WIN + QString ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), QDir::rootPath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)")); +#else + QString ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), QDir::homePath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)")); +#endif + if(!ipfilter.isNull()){ + textFilterPath->setText(ipfilter); + } +} + +// Display dialog to choose save dir +void options_imp::on_browseSaveDirButton_clicked(){ +#ifdef Q_WS_WIN + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::rootPath()); +#else + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath()); +#endif + if(!dir.isNull()){ + textSavePath->setText(dir); + } +} + +// Return Filter object to apply to BT session +QString options_imp::getFilter() const{ + return textFilterPath->text(); +} + +bool options_imp::isToolbarDisplayed() const { + return checkDisplayToolbar->isChecked(); +} + +// Web UI + +void options_imp::enableWebUi(bool checkBoxValue){ + groupWebUiServer->setEnabled(checkBoxValue); + groupWebUiAuth->setEnabled(checkBoxValue); +} + +bool options_imp::isWebUiEnabled() const +{ + return checkWebUi->isChecked(); +} + +quint16 options_imp::webUiPort() const +{ + return spinWebUiPort->value(); +} + +QString options_imp::webUiUsername() const +{ + return textWebUiUsername->text(); +} + +QString options_imp::webUiPassword() const +{ + return textWebUiPassword->text(); +} diff --git a/src/options_imp.h b/src/options_imp.h new file mode 100644 index 000000000..537a8845e --- /dev/null +++ b/src/options_imp.h @@ -0,0 +1,185 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef OPTIONS_IMP_H +#define OPTIONS_IMP_H + +#include "ui_options.h" +#include + +#define HTTP 1 +#define SOCKS5 2 +#define HTTP_PW 3 +#define SOCKS5_PW 4 + +// actions on double-click on torrents +#define TOGGLE_PAUSE 0 +#define OPEN_DEST 1 +#define SHOW_PROPERTIES 2 + +using namespace libtorrent; + +class QCloseEvent; + +class options_imp : public QDialog, private Ui::Dialog { + Q_OBJECT + + private: + QButtonGroup choiceLanguage; + QStringList locales; + QAbstractButton *applyButton; + + public: + // Contructor / Destructor + options_imp(QWidget *parent=0); + ~options_imp(); + + // Methods + void saveOptions(); + void loadOptions(); + // General options + QString getLocale() const; + int getStyle() const; + bool confirmOnExit() const; + bool speedInTitleBar() const; + unsigned int getRefreshInterval() const; + bool systrayIntegration() const; + bool minimizeToTray() const; + bool closeToTray() const; + bool startMinimized() const; + bool OSDEnabled() const; + bool isToolbarDisplayed() const; + // Downloads + QString getSavePath() const; + bool isTempPathEnabled() const; + QString getTempPath() const; + bool preAllocateAllFiles() const; + bool useAdditionDialog() const; + bool addTorrentsInPause() const; + bool isDirScanEnabled() const; + QString getScanDir() const; + int getActionOnDblClOnTorrentDl() const; + int getActionOnDblClOnTorrentFn() const; + // Connection options + int getPort() const; + bool isUPnPEnabled() const; + bool isNATPMPEnabled() const; + QPair getGlobalBandwidthLimits() const; + // Bittorrent options + int getMaxConnecs() const; + int getMaxConnecsPerTorrent() const; + int getMaxUploadsPerTorrent() const; + bool isDHTEnabled() const; + bool isDHTPortSameAsBT() const; + int getDHTPort() const; + bool isPeXEnabled() const; + bool isLSDEnabled() const; + bool isRSSEnabled() const; + bool shouldSpoofAzureus() const; + int getEncryptionSetting() const; + float getDesiredRatio() const; + float getDeleteRatio() const; + // Proxy options + bool isHTTPProxyEnabled() const; + bool isHTTPProxyAuthEnabled() const; + QString getHTTPProxyIp() const; + unsigned short getHTTPProxyPort() const; + QString getHTTPProxyUsername() const; + QString getHTTPProxyPassword() const; + int getHTTPProxyType() const; + bool isProxyEnabled() const; + bool isProxyAuthEnabled() const; + QString getProxyIp() const; + unsigned short getProxyPort() const; + QString getProxyUsername() const; + QString getProxyPassword() const; + int getProxyType() const; + bool useProxyForTrackers() const; + bool useProxyForPeers() const; + bool useProxyForWebseeds() const; + bool useProxyForDHT() const; + // IP Filter + bool isFilteringEnabled() const; + QString getFilter() const; + // Queueing system + bool isQueueingSystemEnabled() const; + int getMaxActiveDownloads() const; + int getMaxActiveUploads() const; + int getMaxActiveTorrents() const; + bool isWebUiEnabled() const; + quint16 webUiPort() const; + QString webUiUsername() const; + QString webUiPassword() const; + + protected slots: + void enableUploadLimit(int checkBoxValue); + void enableDownloadLimit(int checkBoxValue); + void enableTempPathInput(int checkBoxValue); + void enableDirScan(int checkBoxValue); + void enableProxy(int comboIndex); + void enableProxyAuth(int checkBoxValue); + void enableProxyHTTP(int comboIndex); + void enableProxyAuthHTTP(int checkBoxValue); + void enableMaxConnecsLimit(int); + void enableMaxConnecsLimitPerTorrent(int checkBoxValue); + void enableMaxUploadsLimitPerTorrent(int checkBoxValue); + void enableShareRatio(int checkBoxValue); + void enableDeleteRatio(int checkBoxValue); + void enableFilter(int checkBoxValue); + void enableRSS(int checkBoxValue); + void enableDHTPortSettings(int checkBoxValue); + void enableQueueingSystem(int checkBoxValue); + void setStyle(int style); + void on_buttonBox_accepted(); + void closeEvent(QCloseEvent *e); + void on_buttonBox_rejected(); + void applySettings(QAbstractButton* button); + void on_browseScanDirButton_clicked(); + void on_browseFilterButton_clicked(); + void on_browseSaveDirButton_clicked(); + void enableApplyButton(); + void enableSystrayOptions(); + void disableSystrayOptions(); + void setSystrayOptionsState(int checkBoxValue); + void enableWebUi(bool checkBoxValue); + void changePage(QListWidgetItem*, QListWidgetItem*); + void adaptToScreenSize(); + void on_randomButton_clicked(); + + public slots: + void setLocale(QString locale); + void useStyle(); + + signals: + void status_changed(bool) const; + void exitWithCancel(); +}; + +#endif diff --git a/src/pluginSource.h b/src/pluginSource.h new file mode 100644 index 000000000..44c1b1abe --- /dev/null +++ b/src/pluginSource.h @@ -0,0 +1,65 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PLUGIN_SOURCE_H +#define PLUGIN_SOURCE_H + +#include +#include "ui_pluginSource.h" + +class pluginSourceDlg: public QDialog, private Ui::pluginSourceDlg { + Q_OBJECT + + signals: + void askForUrl(); + void askForLocalFile(); + + protected slots: + void on_localButton_clicked() { + emit askForLocalFile(); + close(); + } + + void on_urlButton_clicked() { + emit askForUrl(); + close(); + } + + public: + pluginSourceDlg(QWidget* parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + show(); + } + + ~pluginSourceDlg(){} +}; + +#endif diff --git a/src/pluginSource.ui b/src/pluginSource.ui new file mode 100644 index 000000000..ecfcbc49c --- /dev/null +++ b/src/pluginSource.ui @@ -0,0 +1,52 @@ + + pluginSourceDlg + + + + 0 + 0 + 207 + 76 + + + + Plugin source + + + + + + + 75 + true + true + + + + Search plugin source: + + + + + + + + + Local file + + + + + + + Web link + + + + + + + + + + diff --git a/src/preview.ui b/src/preview.ui new file mode 100644 index 000000000..92bca6266 --- /dev/null +++ b/src/preview.ui @@ -0,0 +1,149 @@ + + + + + preview + + + + 0 + 0 + 414 + 256 + + + + Preview selection + + + + 9 + + + 6 + + + + + + 0 + 37 + + + + + 16777215 + 37 + + + + + Sans Serif + 14 + 75 + false + true + false + false + + + + File preview + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + + 16777215 + 42 + + + + The following files support previewing, <br>please select one of them: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Preview + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + cancelButton + clicked() + preview + reject() + + + 296 + 245 + + + 179 + 282 + + + + + diff --git a/src/previewSelect.h b/src/previewSelect.h new file mode 100644 index 000000000..9c3ffed08 --- /dev/null +++ b/src/previewSelect.h @@ -0,0 +1,139 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PREVIEWSELECT_H +#define PREVIEWSELECT_H + +#include +#include +#include +#include +#include +#include "ui_preview.h" +#include "PreviewListDelegate.h" +#include "misc.h" +#include "qtorrenthandle.h" + +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 + +using namespace libtorrent; + +class previewSelect: public QDialog, private Ui::preview { + Q_OBJECT + + private: + QStandardItemModel *previewListModel; + PreviewListDelegate *listDelegate; + QTorrentHandle h; + QList indexes; + + signals: + void readyToPreviewFile(QString) const; + + protected slots: + void on_previewButton_clicked(){ + QModelIndex index; + QModelIndexList selectedIndexes = previewList->selectionModel()->selectedIndexes(); + if(selectedIndexes.size() == 0) return; + QString path; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + path = h.files_path().at(indexes.at(index.row())); + // File + if(QFile::exists(path)){ + emit readyToPreviewFile(path); + } + close(); + return; + } + } + qDebug("Cannot find file: %s", path.toLocal8Bit().data()); + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + close(); + } + + void on_cancelButton_clicked(){ + close(); + } + + public: + previewSelect(QWidget* parent, QTorrentHandle h): QDialog(parent), h(h){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + // Preview list + previewListModel = new QStandardItemModel(0, 3); + previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); + previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + previewList->setModel(previewListModel); + listDelegate = new PreviewListDelegate(this); + previewList->setItemDelegate(listDelegate); + previewList->header()->resizeSection(0, 200); + // Fill list in + std::vector fp; + h.file_progress(fp); + unsigned int nbFiles = h.num_files(); + for(unsigned int i=0; irowCount(); + previewListModel->insertRow(row); + previewListModel->setData(previewListModel->index(row, NAME), QVariant(fileName)); + previewListModel->setData(previewListModel->index(row, SIZE), QVariant((qlonglong)h.filesize_at(i))); + previewListModel->setData(previewListModel->index(row, PROGRESS), QVariant((double)fp[i]/h.filesize_at(i))); + indexes << i; + } + } + previewList->selectionModel()->select(previewListModel->index(0, NAME), QItemSelectionModel::Select); + previewList->selectionModel()->select(previewListModel->index(0, SIZE), QItemSelectionModel::Select); + previewList->selectionModel()->select(previewListModel->index(0, PROGRESS), QItemSelectionModel::Select); + if(!previewListModel->rowCount()){ + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + close(); + } + connect(this, SIGNAL(readyToPreviewFile(QString)), parent, SLOT(previewFile(QString))); + if(previewListModel->rowCount() == 1){ + // Only one file : no choice + on_previewButton_clicked(); + }else{ + show(); + } + } + + ~previewSelect(){ + delete previewListModel; + delete listDelegate; + } +}; + +#endif diff --git a/src/properties.ui b/src/properties.ui new file mode 100644 index 000000000..2f83b0d11 --- /dev/null +++ b/src/properties.ui @@ -0,0 +1,1080 @@ + + + properties + + + + 0 + 0 + 594 + 621 + + + + Torrent Properties + + + + 6 + + + 9 + + + + + 0 + + + + Main info + + + + + + + 16777215 + 20 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Torrent information + + + + + + + + 6 + + + 0 + + + + + + 0 + 29 + + + + + 75 + true + + + + Save path: + + + + + + + + 0 + 28 + + + + + 75 + true + + + + Creator: + + + + + + + + 0 + 29 + + + + + 75 + true + + + + Torrent hash: + + + + + + + + 0 + 128 + + + + + 16777215 + 120 + + + + + 75 + true + + + + Comment: + + + + + + + + + + + + + + 0 + 29 + + + + + + + + + + + + 21 + 0 + + + + + 21 + 16777215 + + + + ... + + + + + + + + + + 0 + 28 + + + + + + + + + + + + 0 + 29 + + + + + + + + + + + + 16777215 + 120 + + + + false + + + true + + + false + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 0 + 50 + + + + + 75 + true + + + + Downloaded pieces + + + + + + + + 0 + 0 + + + + + 0 + 115 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Current session + + + + 6 + + + 9 + + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total uploaded: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total downloaded: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Share ratio: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total failed: + + + + + + + + + 6 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 181 + 20 + + + + + + + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Download in correct order (slower but good for previewing) + + + + + + + + Trackers + + + + + + 6 + + + 0 + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Trackers: + + + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + QAbstractItemView::ExtendedSelection + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 6 + + + 0 + + + + + + 16777215 + 16 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Current tracker: + + + + + + + + 16777215 + 16 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 40 + + + + + + + + + Url seeds + + + + 6 + + + 9 + + + + + + 75 + true + + + + The following url seeds are available for this torrent: + + + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + + + + + + + + 24 + 24 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Torrent content + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Files contained in current torrent: + + + + + + + + 0 + 301 + + + + Qt::CustomContextMenu + + + QAbstractItemView::AllEditTriggers + + + QAbstractItemView::ExtendedSelection + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Collapse all + + + + + + + Expand all + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Sans Serif + 8 + 50 + false + false + false + false + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Ignored + + + + + Normal + + + + + Maximum + + + + + High + + + + + + + okButton + clicked() + properties + accept() + + + 306 + 556 + + + 96 + 254 + + + + + diff --git a/src/properties_imp.cpp b/src/properties_imp.cpp new file mode 100644 index 000000000..efe99c0ae --- /dev/null +++ b/src/properties_imp.cpp @@ -0,0 +1,739 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include "properties_imp.h" +#include "misc.h" +#include "PropListDelegate.h" +#include "bittorrent.h" +#include "arborescence.h" +#include "realprogressbar.h" +#include "realprogressbarthread.h" +#include "TrackersAdditionDlg.h" +#include "torrentPersistentData.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Constructor +properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h): QDialog(parent), h(h), BTSession(BTSession), changedFilteredfiles(false), hash(h.hash()) { + setupUi(this); + lbl_priorities->setText(tr("Priorities:")+"

    • "+tr("Ignored: file is not downloaded at all")+"
    • "+tr("Normal: normal priority. Download order is dependent on availability")+"
    • "+tr("High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability")+"
    • "+tr("Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority")+"
    "); + // set icons + addTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png"))); + removeTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); + lowerTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/downarrow.png"))); + riseTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/uparrow.png"))); + addWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png"))); + deleteWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); + setAttribute(Qt::WA_DeleteOnClose); + // Set Properties list model + PropListModel = new QStandardItemModel(0,5); + PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); + PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); + filesList->setModel(PropListModel); + filesList->hideColumn(INDEX); + PropDelegate = new PropListDelegate(0, &changedFilteredfiles); + filesList->setItemDelegate(PropDelegate); + connect(filesList, SIGNAL(clicked(const QModelIndex&)), filesList, SLOT(edit(const QModelIndex&))); + connect(collapseAllButton, SIGNAL(clicked()), filesList, SLOT(collapseAll())); + connect(expandAllButton, SIGNAL(clicked()), filesList, SLOT(expandAll())); + connect(filesList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); + connect(addTracker_button, SIGNAL(clicked()), this, SLOT(askForTracker())); + connect(removeTracker_button, SIGNAL(clicked()), this, SLOT(deleteSelectedTrackers())); + connect(riseTracker_button, SIGNAL(clicked()), this, SLOT(riseSelectedTracker())); + connect(lowerTracker_button, SIGNAL(clicked()), this, SLOT(lowerSelectedTracker())); + connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); + connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); + connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); + connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); + connect(addWS_button, SIGNAL(clicked()), this, SLOT(askWebSeed())); + connect(deleteWS_button, SIGNAL(clicked()), this, SLOT(deleteSelectedUrlSeeds())); + // get Infos from torrent handle + fileName->setText(h.name()); + // Torrent Infos + save_path->setText(TorrentPersistentData::getSavePath(hash)); + QString author = h.creator().trimmed(); + if(author.isEmpty()) + author = tr("Unknown"); + creator->setText(author); + hash_lbl->setText(hash); + comment_txt->setText(h.comment()); + //Trackers + loadTrackers(); + // Session infos + failed->setText(misc::friendlyUnit(h.total_failed_bytes())); + upTotal->setText(misc::friendlyUnit(h.total_payload_upload())); + dlTotal->setText(misc::friendlyUnit(h.total_payload_download())); + // Update ratio info + float ratio; + if(h.total_payload_download() == 0){ + if(h.total_payload_upload() == 0) + ratio = 1.; + else + ratio = 10.; // Max ratio + }else{ + ratio = (double)h.total_payload_upload()/(double)h.total_payload_download(); + if(ratio > 10.){ + ratio = 10.; + } + } + shareRatio->setText(QString(QByteArray::number(ratio, 'f', 1))); + std::vector fp; + h.file_progress(fp); + std::vector files_priority = loadFilesPriorities(); + // List files in torrent + h.get_torrent_info(); + arborescence *arb = new arborescence(h.get_torrent_info(), fp, files_priority); + addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); + delete arb; + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + filesList->expandAll(); + // List web seeds + loadWebSeedsFromFile(); + loadWebSeeds(); + // Incremental download + incrementalDownload->setChecked(TorrentPersistentData::isSequentialDownload(hash)); + updateInfosTimer = new QTimer(this); + connect(updateInfosTimer, SIGNAL(timeout()), this, SLOT(updateInfos())); + updateInfosTimer->start(3000); + progressBar = new RealProgressBar(this); + progressBar->setForegroundColor(Qt::blue); + progressBarVbox = new QVBoxLayout(RealProgressBox); + progressBarVbox->addWidget(progressBar); + progressBarUpdater = new RealProgressBarThread(progressBar, h); + progressBarUpdater->start(); + // progressBarUpdater->refresh(); + connect(updateInfosTimer, SIGNAL(timeout()), progressBarUpdater, SLOT(refresh())); + loadSettings(); +} + +properties::~properties(){ + writeSettings(); + qDebug("Properties destroyed"); + delete updateInfosTimer; + delete PropDelegate; + delete PropListModel; + delete progressBarUpdater; + delete progressBar; + delete progressBarVbox; +} + +void properties::addFilesToTree(const torrent_file *root, QStandardItem *parent) { + QList child; + // Name + QStandardItem *first; + if(root->isDir()) { + first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); + } else { + first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); + } + child << first; + // Size + child << new QStandardItem(misc::toQString(root->getSize())); + // Progress + child << new QStandardItem(misc::toQString(root->getProgress())); + // Prio + child << new QStandardItem(misc::toQString(root->getPriority())); + // INDEX + child << new QStandardItem(misc::toQString(root->getIndex())); + // Add the child to the tree + parent->appendRow(child); + // Set row color + if(root->getPriority() == IGNORED) + setItemColor(first->index(), "red"); + else + setItemColor(first->index(), "green"); + // Add childs + foreach(const torrent_file *childFile, root->getChildren()) { + addFilesToTree(childFile, first); + } +} + +void properties::writeSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("PropWindow")); + settings.setValue(QString::fromUtf8("size"), size()); + settings.setValue(QString::fromUtf8("pos"), pos()); + QVariantList contentColsWidths; + for(int i=0; icolumnCount()-1; ++i) { + contentColsWidths.append(filesList->columnWidth(i)); + } + settings.setValue(QString::fromUtf8("contentColsWidths"), contentColsWidths); + settings.endGroup(); +} + +void properties::loadSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + resize(settings.value(QString::fromUtf8("PropWindow/size"), size()).toSize()); + move(settings.value(QString::fromUtf8("PropWindow/pos"), screenCenter()).toPoint()); + QVariantList contentColsWidths = settings.value(QString::fromUtf8("PropWindow/contentColsWidths"), QVariantList()).toList(); + if(contentColsWidths.empty()) { + filesList->header()->resizeSection(NAME, 200); + } else { + for(int i=0; isetColumnWidth(i, contentColsWidths.at(i).toInt()); + } + } +} + +// Center window +QPoint properties::screenCenter() const{ + int scrn = 0; + QWidget *w = this->topLevelWidget(); + + if(w) + scrn = QApplication::desktop()->screenNumber(w); + else if(QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(this); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2); +} + +// priority is the new priority of given item +void properties::updateParentsPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) return; + // Check if children have different priorities + // then folder must have NORMAL priority + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY)->text().toInt() != priority) { + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != NORMAL) { + parentPrio->setText(misc::toQString(NORMAL)); + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } + return; + } + } + // All the children have the same priority + // Parent folder should have the same priority too + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != priority) { + parentPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(parentPrio->index(), "red"); + else + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } +} + +void properties::updateChildrenPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + parent = parent->child(item->row()); + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY); + if(childPrio->text().toInt() != priority) { + childPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(childPrio->index(), "red"); + else + setItemColor(childPrio->index(), "green"); + // recursively update children of this child too + updateChildrenPriority(parent->child(i), priority); + } + } +} + +void properties::updatePriorities(QStandardItem *item) { + qDebug("Priority changed"); + // First we disable the signal/slot on item edition + // temporarily so that it doesn't mess with our manual updates + disconnect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + int priority = parent->child(item->row(), PRIORITY)->text().toInt(); + if(priority == IGNORED) + setItemColor(item->index(), "red"); + else + setItemColor(item->index(), "green"); + // Update parents priorities + updateParentsPriority(item, priority); + // If this is not a directory, then there are + // no children to update + if(parent->child(item->row(), INDEX)->text().toInt() == -1) { + // Updating children + qDebug("Priority changed for a folder to %d", priority); + updateChildrenPriority(item, priority); + } + // Reconnect the signal/slot on item edition so that we + // get future updates + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); +} + +void properties::loadWebSeeds(){ + // Clear url seeds list + listWebSeeds->clear(); + // Add manually added url seeds + foreach(const QString &url_seed, urlSeeds){ + listWebSeeds->addItem(url_seed); + qDebug("Added custom url seed to list: %s", url_seed.toLocal8Bit().data()); + } +} + +std::vector properties::loadFilesPriorities(){ + std::vector fp; + QVariantList files_priority = TorrentPersistentData::getFilesPriority(hash); + if(files_priority.empty()) { + for(int i=0; i 7){ + // Normal priority as default + priority = 1; + } + fp.push_back(priority); + } + } + return fp; +} + +bool properties::allFiltered() const { + unsigned int nbRows = PropListModel->rowCount(); + for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) + return false; + } + return true; +} + + +void properties::getPriorities(QStandardItem *parent, int *priorities) { + qDebug("In getPriorities"); + unsigned int nbRows = parent->rowCount(); + for(unsigned int i=0; ichild(i, INDEX); + int index = item->text().toInt(); + if(index < 0) { + getPriorities(parent->child(i, NAME), priorities); + } else { + item = parent->child(i, PRIORITY); + priorities[index] = item->text().toInt(); + qDebug("File at index %d has priority %d", index, priorities[index]); + } + } +} + +void properties::displayFilesListMenu(const QPoint&){ + if(h.get_torrent_info().num_files() == 1) return; + QMenu myFilesLlistMenu(this); + QModelIndex index; + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + myFilesLlistMenu.setTitle(tr("Priority")); + myFilesLlistMenu.addAction(actionIgnored); + myFilesLlistMenu.addAction(actionNormal); + myFilesLlistMenu.addAction(actionHigh); + myFilesLlistMenu.addAction(actionMaximum); + // Call menu + myFilesLlistMenu.exec(QCursor::pos()); +} + +void properties::ignoreSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(IGNORED)){ + PropListModel->setData(index, QVariant(IGNORED)); + changedFilteredfiles = true; + setItemColor(index, "red"); + } + } + } +} + +void properties::normalSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(NORMAL)){ + PropListModel->setData(index, QVariant(NORMAL)); + changedFilteredfiles = true; + setItemColor(index, "green"); + } + } + } +} + +void properties::highSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(HIGH)){ + PropListModel->setData(index, QVariant(HIGH)); + changedFilteredfiles = true; + setItemColor(index, "green"); + } + } + } +} + +void properties::maximumSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(MAXIMUM)){ + PropListModel->setData(index, QVariant(MAXIMUM)); + changedFilteredfiles = true; + setItemColor(index, "green"); + } + } + } +} + +void properties::loadTrackers(){ + //Trackers + std::vector trackers = h.trackers(); + trackersURLS->clear(); + QHash errors = BTSession->getTrackersErrors(h.hash()); + unsigned int nbTrackers = trackers.size(); + for(unsigned int i=0; isetForeground(QBrush(QColor("red"))); + // Set tooltip + QString msg=""; + unsigned int i=0; + foreach(QString word, errors[current_tracker].split(" ")) { + if(i > 0 && i%5!=1) msg += " "; + msg += word; + if(i> 0 && i%5==0) msg += "\n"; + ++i; + } + item->setToolTip(msg); + } else { + item->setForeground(QBrush(QColor("green"))); + } + } + QString tracker = h.current_tracker().trimmed(); + if(!tracker.isEmpty()){ + trackerURL->setText(tracker); + }else{ + trackerURL->setText(tr("None - Unreachable?")); + } +} + +void properties::askWebSeed(){ + bool ok; + // Ask user for a new url seed + QString url_seed = QInputDialog::getText(this, tr("New url seed", "New HTTP source"), + tr("New url seed:"), QLineEdit::Normal, + QString::fromUtf8("http://www."), &ok); + if(!ok) return; + qDebug("Adding %s web seed", url_seed.toLocal8Bit().data()); + if(urlSeeds.indexOf(url_seed) != -1) { + QMessageBox::warning(this, tr("qBittorrent"), + tr("This url seed is already in the list."), + QMessageBox::Ok); + return; + } + urlSeeds << url_seed; + h.add_url_seed(url_seed); + TorrentPersistentData::saveUrlSeeds(h); + // Refresh the seeds list + loadWebSeeds(); +} + +// Ask the user for a new tracker +// and add it to the download list +// if it is not already in it +void properties::askForTracker(){ + TrackersAddDlg *dlg = new TrackersAddDlg(this); + connect(dlg, SIGNAL(TrackersToAdd(QStringList)), this, SLOT(addTrackerList(QStringList))); +} + +void properties::addTrackerList(QStringList myTrackers) { + // Add the trackers to the list + std::vector trackers = h.trackers(); + foreach(const QString& tracker, myTrackers) { + announce_entry new_tracker(misc::toString(tracker.trimmed().toLocal8Bit().data())); + new_tracker.tier = 0; // Will be fixed a bit later + trackers.push_back(new_tracker); + misc::fixTrackersTiers(trackers); + } + h.replace_trackers(trackers); + h.force_reannounce(); + // Reload Trackers + loadTrackers(); + emit trackersChanged(h.hash()); +} + +void properties::deleteSelectedUrlSeeds(){ + QList selectedItems = listWebSeeds->selectedItems(); + bool change = false; + foreach(QListWidgetItem *item, selectedItems){ + QString url_seed = item->text(); + int index = urlSeeds.indexOf(url_seed); + Q_ASSERT(index != -1); + urlSeeds.removeAt(index); + h.remove_url_seed(url_seed); + change = true; + } + if(change){ + // Save them to disk + TorrentPersistentData::saveUrlSeeds(h); + // Refresh list + loadWebSeeds(); + } +} + +void properties::deleteSelectedTrackers(){ + QList selectedItems = trackersURLS->selectedItems(); + if(!selectedItems.size()) return; + std::vector trackers = h.trackers(); + unsigned int nbTrackers = trackers.size(); + if(nbTrackers == (unsigned int) selectedItems.size()){ + QMessageBox::warning(this, tr("qBittorrent"), + tr("Trackers list can't be empty."), + QMessageBox::Ok); + return; + } + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(unsigned int i=0; i trackers = h.trackers(); + QList selectedItems = trackersURLS->selectedItems(); + bool change = false; + unsigned int nbTrackers = trackers.size(); + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(i=0; i 0){ + announce_entry tmp = trackers[i]; + trackers[i] = trackers[i-1]; + trackers[i-1] = tmp; + change = true; + } + break; + } + } + } + if(change){ + misc::fixTrackersTiers(trackers); + h.replace_trackers(trackers); + h.force_reannounce(); + // Reload Trackers + loadTrackers(); + trackersURLS->item(i-1)->setSelected(true); + emit trackersChanged(h.hash()); + } +} + +void properties::lowerSelectedTracker(){ + unsigned int i = 0; + std::vector trackers = h.trackers(); + QList selectedItems = trackersURLS->selectedItems(); + bool change = false; + unsigned int nbTrackers = trackers.size(); + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(i=0; iitem(i+1)->setSelected(true); + emit trackersChanged(h.hash()); + } +} + +void properties::updateInfos(){ + // Update current tracker + try { + QString tracker = h.current_tracker().trimmed(); + if(!tracker.isEmpty()){ + trackerURL->setText(tracker); + }else{ + trackerURL->setText(tr("None - Unreachable?")); + } + // XXX: This causes selection problems + //loadTrackers(); + }catch(invalid_handle e){ + // torrent was removed, closing properties + close(); + } +} + +void properties::setItemColor(QModelIndex index, QString color){ + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(index.sibling(index.row(), i), QVariant(QColor(color)), Qt::ForegroundRole); + } +} + +void properties::on_incrementalDownload_stateChanged(int state){ + qDebug("Incremental download toggled"); + if(state == Qt::Checked){ + if(!TorrentPersistentData::isSequentialDownload(hash)) { + h.set_sequential_download(true); + TorrentPersistentData::saveSequentialStatus(h); + } + }else{ + h.set_sequential_download(false); + TorrentPersistentData::saveSequentialStatus(h); + } +} + +void properties::on_changeSavePathButton_clicked() { + QString dir; + QDir saveDir(h.save_path()); + if(saveDir.exists()){ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), h.save_path()); + }else{ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); + } + if(!dir.isNull()){ + // Check if savePath exists + QDir savePath(dir); + if(!savePath.exists()){ + if(!savePath.mkpath(savePath.path())){ + QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); + return; + } + } + // Save savepath + TorrentPersistentData::saveSavePath(hash, savePath.path()); + // Actually move storage + if(!BTSession->useTemporaryFolder() || h.is_seed()) + h.move_storage(savePath.path()); + // Update save_path in dialog + save_path->setText(savePath.path()); + } +} + +void properties::on_okButton_clicked(){ + if(savePiecesPriorities()) + close(); +} + +void properties::loadWebSeedsFromFile(){ + urlSeeds.clear(); + QVariantList url_seeds = TorrentPersistentData::getUrlSeeds(hash); + foreach(const QVariant &var_url_seed, url_seeds){ + QString url_seed = var_url_seed.toString(); + if(!url_seed.isEmpty()) + urlSeeds << url_seed; + } + // Load the hard-coded url seeds + QStringList hc_seeds = h.url_seeds(); + // Add hard coded url seeds + foreach(const QString &hc_seed, hc_seeds){ + if(urlSeeds.indexOf(hc_seed) == -1){ + urlSeeds << hc_seed; + } + } +} + +bool properties::savePiecesPriorities() { + if(!changedFilteredfiles) return true; + if(allFiltered()) { + QMessageBox::warning(0, tr("Priorities error"), tr("Error, you can't filter all the files in a torrent.")); + return false; + } + qDebug("Saving pieces priorities"); + int *priorities = new int[h.get_torrent_info().num_files()]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + unsigned int nbFiles = h.get_torrent_info().num_files(); + for(unsigned int i=0; i loadFilesPriorities(); + + protected: + QPoint screenCenter() const; +}; + +#endif diff --git a/src/qgnomelook.h b/src/qgnomelook.h new file mode 100644 index 000000000..b53a8762b --- /dev/null +++ b/src/qgnomelook.h @@ -0,0 +1,96 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef QGNOMELOOK +#define QGNOMELOOK + +#include +#include +#include +#include +#include +#include + +class QGnomeLookStyle : public QCleanlooksStyle { + public: + QGnomeLookStyle() : QCleanlooksStyle() {} + + void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { + switch(element) { + case CE_ProgressBarLabel: + if (const QStyleOptionProgressBar *pb = qstyleoption_cast(option)) { + bool vertical = false; + if (const QStyleOptionProgressBarV2 *pb2 = qstyleoption_cast(option)) { + vertical = (pb2->orientation == Qt::Vertical); + } + if (!vertical) { + QPalette::ColorRole textRole = QPalette::WindowText;/* + if ((pb->textAlignment & Qt::AlignCenter) && pb->textVisible + && ((qint64(pb->progress) - qint64(pb->minimum)) * 2 >= (qint64(pb->maximum) - qint64(pb->minimum)))) { + textRole = QPalette::HighlightedText; + //Draw text shadow, This will increase readability when the background of same color + QRect shadowRect(pb->rect); + shadowRect.translate(1,1); + QColor shadowColor = (pb->palette.color(textRole).value() <= 128) ? QColor(255,255,255,160) : QColor(0,0,0,160); + QPalette shadowPalette = pb->palette; + shadowPalette.setColor(textRole, shadowColor); + drawItemText(painter, shadowRect, Qt::AlignCenter | Qt::TextSingleLine, shadowPalette, pb->state, pb->text, textRole); + } + QPalette shadowPalette = pb->palette; + shadowPalette.setColor(textRole, QColor(0,0,0,160));*/ + drawItemText(painter, pb->rect, Qt::AlignCenter | Qt::TextSingleLine, pb->palette, pb->state, pb->text, textRole); + } + } + break; + default: + QCleanlooksStyle::drawControl(element, option, painter, widget); + } + } + + QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget=0) const + { + QRect rect; + switch (element) { +#ifndef QT_NO_PROGRESSBAR + case SE_ProgressBarLabel: + case SE_ProgressBarContents: + case SE_ProgressBarGroove: + return option->rect; +#endif // QT_NO_PROGRESSBAR + default: + return QCleanlooksStyle::subElementRect(element, option, widget); + } + + return visualRect(option->direction, option->rect, rect); + } + +}; + +#endif diff --git a/src/qrealarray.cpp b/src/qrealarray.cpp new file mode 100644 index 000000000..1e580da6e --- /dev/null +++ b/src/qrealarray.cpp @@ -0,0 +1,33 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include "qrealarray.h" + +int id = qRegisterMetaType(); diff --git a/src/qrealarray.h b/src/qrealarray.h new file mode 100644 index 000000000..23007e0c0 --- /dev/null +++ b/src/qrealarray.h @@ -0,0 +1,41 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef QREALARRAY_H +#define QREALARRAY_H + +#include +#include + +typedef QVarLengthArray QRealArray; + +Q_DECLARE_METATYPE(QRealArray) + +#endif diff --git a/src/qtorrenthandle.cpp b/src/qtorrenthandle.cpp new file mode 100644 index 000000000..2221e2d71 --- /dev/null +++ b/src/qtorrenthandle.cpp @@ -0,0 +1,461 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include "misc.h" +#include "qtorrenthandle.h" +#include + +QTorrentHandle::QTorrentHandle(torrent_handle h): h(h) {} + +// +// Getters +// + +torrent_handle QTorrentHandle::get_torrent_handle() const { + Q_ASSERT(h.is_valid()); + return h; +} + +torrent_info QTorrentHandle::get_torrent_info() const { + Q_ASSERT(h.is_valid()); + return h.get_torrent_info(); +} + +QString QTorrentHandle::hash() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.info_hash()); +} + +QString QTorrentHandle::name() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.name()); +} + +float QTorrentHandle::progress() const { + Q_ASSERT(h.is_valid()); + if(!h.status().total_wanted) + return 0.; + if (h.status().total_wanted_done == h.status().total_wanted) + return 1.; + float progress = (float)h.status().total_wanted_done/(float)h.status().total_wanted; + Q_ASSERT(progress >= 0. && progress <= 1.); + return progress; +} + +bitfield QTorrentHandle::pieces() const { + Q_ASSERT(h.is_valid()); + return h.status().pieces; +} + +void QTorrentHandle::get_download_queue(std::vector& queue) const { + Q_ASSERT(h.is_valid()); + h.get_download_queue(queue); +} + +QString QTorrentHandle::current_tracker() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.status().current_tracker); +} + +bool QTorrentHandle::is_valid() const { + return h.is_valid(); +} + +bool QTorrentHandle::is_paused() const { + Q_ASSERT(h.is_valid()); + return h.is_paused() && !h.is_auto_managed(); +} + +bool QTorrentHandle::is_queued() const { + Q_ASSERT(h.is_valid()); + return h.is_paused() && h.is_auto_managed(); +} + +size_type QTorrentHandle::total_size() const { + Q_ASSERT(h.is_valid()); + return h.get_torrent_info().total_size(); +} + +size_type QTorrentHandle::piece_length() const { + Q_ASSERT(h.is_valid()); + return h.get_torrent_info().piece_length(); +} + +int QTorrentHandle::num_pieces() const { + Q_ASSERT(h.is_valid()); + return h.get_torrent_info().num_pieces(); +} + +size_type QTorrentHandle::total_wanted_done() const { + Q_ASSERT(h.is_valid()); + return h.status().total_wanted_done; +} + +float QTorrentHandle::download_payload_rate() const { + Q_ASSERT(h.is_valid()); + return h.status().download_payload_rate; +} + +float QTorrentHandle::upload_payload_rate() const { + Q_ASSERT(h.is_valid()); + return h.status().upload_payload_rate; +} + +int QTorrentHandle::num_peers() const { + Q_ASSERT(h.is_valid()); + return h.status().num_peers; +} + +int QTorrentHandle::num_seeds() const { + Q_ASSERT(h.is_valid()); + return h.status().num_seeds; +} + +int QTorrentHandle::num_complete() const { + Q_ASSERT(h.is_valid()); + return h.status().num_complete; +} + +void QTorrentHandle::scrape_tracker() const { + Q_ASSERT(h.is_valid()); + h.scrape_tracker(); +} + +int QTorrentHandle::num_incomplete() const { + Q_ASSERT(h.is_valid()); + return h.status().num_incomplete; +} + +QString QTorrentHandle::save_path() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.save_path().string()); +} + +fs::path QTorrentHandle::save_path_boost() const { + Q_ASSERT(h.is_valid()); + return h.save_path(); +} + +QStringList QTorrentHandle::url_seeds() const { + Q_ASSERT(h.is_valid()); + QStringList res; + try { + std::vector existing_seeds = h.get_torrent_info().url_seeds(); + unsigned int nbSeeds = existing_seeds.size(); + QString existing_seed; + for(unsigned int i=0; i piece_priorities = h.piece_priorities(); + for(unsigned int i = 0; i const& QTorrentHandle::trackers() const { + Q_ASSERT(h.is_valid()); + return h.trackers(); +} + +torrent_status::state_t QTorrentHandle::state() const { + Q_ASSERT(h.is_valid()); + return h.status().state; +} + +std::vector QTorrentHandle::file_priorities() const { + Q_ASSERT(h.is_valid()); + return h.file_priorities(); +} + +QString QTorrentHandle::creator() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.get_torrent_info().creator()); +} + +QString QTorrentHandle::comment() const { + Q_ASSERT(h.is_valid()); + return misc::toQString(h.get_torrent_info().comment()); +} + +size_type QTorrentHandle::total_failed_bytes() const { + Q_ASSERT(h.is_valid()); + return h.status().total_failed_bytes; +} + +void QTorrentHandle::file_progress(std::vector& fp) { + Q_ASSERT(h.is_valid()); + return h.file_progress(fp); +} + +size_type QTorrentHandle::all_time_download() { + Q_ASSERT(h.is_valid()); + return h.status().all_time_download; +} + +size_type QTorrentHandle::all_time_upload() { + Q_ASSERT(h.is_valid()); + return h.status().all_time_upload; +} + +size_type QTorrentHandle::total_payload_download() { + Q_ASSERT(h.is_valid()); + return h.status().total_payload_download; +} + +size_type QTorrentHandle::total_payload_upload() { + Q_ASSERT(h.is_valid()); + return h.status().total_payload_upload; +} + +// Return a list of absolute paths corresponding +// to all files in a torrent +QStringList QTorrentHandle::files_path() const { + Q_ASSERT(h.is_valid()); + QString saveDir = misc::toQString(h.save_path().string()) + QDir::separator(); + QStringList res; + torrent_info::file_iterator fi = h.get_torrent_info().begin_files(); + while(fi != h.get_torrent_info().end_files()) { + res << QDir::cleanPath(saveDir + misc::toQString(fi->path.string())); + fi++; + } + return res; +} + +int QTorrentHandle::queue_position() const { + Q_ASSERT(h.is_valid()); + return h.queue_position(); +} + +int QTorrentHandle::num_uploads() const { + Q_ASSERT(h.is_valid()); + return h.status().num_uploads; +} + +bool QTorrentHandle::is_seed() const { + Q_ASSERT(h.is_valid()); + // Affected by bug http://code.rasterbar.com/libtorrent/ticket/402 + //return h.is_seed(); + // May suffer from approximation problems + //return (progress() == 1.); + // This looks safe + return (state() == torrent_status::finished || state() == torrent_status::seeding); +} + +bool QTorrentHandle::is_auto_managed() const { + Q_ASSERT(h.is_valid()); + return h.is_auto_managed(); +} + +int QTorrentHandle::active_time() const { + Q_ASSERT(h.is_valid()); + return h.status().active_time; +} + +bool QTorrentHandle::is_sequential_download() const { + Q_ASSERT(h.is_valid()); + return h.is_sequential_download(); +} + +// +// Setters +// + +void QTorrentHandle::set_download_limit(int limit) { + Q_ASSERT(h.is_valid()); + h.set_download_limit(limit); +} + +void QTorrentHandle::set_upload_limit(int limit) { + Q_ASSERT(h.is_valid()); + h.set_upload_limit(limit); +} + +void QTorrentHandle::pause() { + Q_ASSERT(h.is_valid()); + h.auto_managed(false); + h.pause(); + h.save_resume_data(); +} + +void QTorrentHandle::resume() { + Q_ASSERT(h.is_valid()); + h.auto_managed(true); + h.resume(); +} + +void QTorrentHandle::remove_url_seed(QString seed) { + Q_ASSERT(h.is_valid()); + h.remove_url_seed(misc::toString((const char*)seed.toLocal8Bit())); +} + +void QTorrentHandle::add_url_seed(QString seed) { + Q_ASSERT(h.is_valid()); + h.add_url_seed(misc::toString((const char*)seed.toLocal8Bit())); +} + +void QTorrentHandle::set_max_uploads(int val) { + Q_ASSERT(h.is_valid()); + h.set_max_uploads(val); +} + +void QTorrentHandle::set_max_connections(int val) { + Q_ASSERT(h.is_valid()); + h.set_max_connections(val); +} + +void QTorrentHandle::prioritize_files(std::vector v) { + Q_ASSERT(h.is_valid()); + h.prioritize_files(v); +} + +void QTorrentHandle::set_ratio(float ratio) const { + Q_ASSERT(h.is_valid()); + h.set_ratio(ratio); +} + +void QTorrentHandle::replace_trackers(std::vector const& v) const { + Q_ASSERT(h.is_valid()); + h.replace_trackers(v); +} + +void QTorrentHandle::auto_managed(bool b) const { + Q_ASSERT(h.is_valid()); + h.auto_managed(b); +} + +void QTorrentHandle::queue_position_down() const { + Q_ASSERT(h.is_valid()); + h.queue_position_down(); +} + +void QTorrentHandle::queue_position_up() const { + Q_ASSERT(h.is_valid()); + h.queue_position_up(); + +} + +void QTorrentHandle::force_reannounce() { + Q_ASSERT(h.is_valid()); + h.force_reannounce(); +} + +void QTorrentHandle::set_sequential_download(bool b) { + Q_ASSERT(h.is_valid()); + h.set_sequential_download(b); +} + +void QTorrentHandle::set_tracker_login(QString username, QString password) { + Q_ASSERT(h.is_valid()); + h.set_tracker_login(std::string(username.toLocal8Bit().data()), std::string(password.toLocal8Bit().data())); +} + +void QTorrentHandle::force_recheck() const { + Q_ASSERT(h.is_valid()); + h.force_recheck(); +} + +void QTorrentHandle::move_storage(QString new_path) const { + Q_ASSERT(h.is_valid()); + h.move_storage(new_path.toLocal8Bit().data()); +} + +void QTorrentHandle::file_priority(int index, int priority) const { + Q_ASSERT(h.is_valid()); + h.file_priority(index, priority); +} + +// +// Operators +// + +QTorrentHandle& QTorrentHandle::operator =(const torrent_handle& new_h) { + h = new_h; + return *this; +} + +bool QTorrentHandle::operator ==(const QTorrentHandle& new_h) const{ + QString hash = misc::toQString(h.info_hash()); + return (hash == new_h.hash()); +} diff --git a/src/qtorrenthandle.h b/src/qtorrenthandle.h new file mode 100644 index 000000000..4e2928ab0 --- /dev/null +++ b/src/qtorrenthandle.h @@ -0,0 +1,146 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef QTORRENTHANDLE_H +#define QTORRENTHANDLE_H + +#include +#include + +using namespace libtorrent; + +class QString; +class QStringList; + +// A wrapper for torrent_handle in libtorrent +// to interact well with Qt types +class QTorrentHandle { + private: + torrent_handle h; + + public: + + // + // Constructors + // + + QTorrentHandle() {} + QTorrentHandle(torrent_handle h); + + // + // Getters + // + + torrent_handle get_torrent_handle() const; + torrent_info get_torrent_info() const; + QString hash() const; + QString name() const; + float progress() const; + bitfield pieces() const; + void get_download_queue(std::vector& queue) const; + QString current_tracker() const; + bool is_valid() const; + bool is_paused() const; + bool has_filtered_pieces() const; + size_type total_size() const; + size_type piece_length() const; + int num_pieces() const; + size_type total_wanted_done() const; + float download_payload_rate() const; + float upload_payload_rate() const; + int num_peers() const; + int num_seeds() const; + int num_complete() const; + int num_incomplete() const; + void scrape_tracker() const; + QString save_path() const; + fs::path save_path_boost() const; + QStringList url_seeds() const; + size_type actual_size() const; + int download_limit() const; + int upload_limit() const; + int num_files() const; + bool has_metadata() const; + void save_resume_data() const; + int queue_position() const; + bool is_queued() const; + QString file_at(unsigned int index) const; + size_type filesize_at(unsigned int index) const; + std::vector const& trackers() const; + torrent_status::state_t state() const; + QString creator() const; + QString comment() const; + size_type total_failed_bytes() const; + void file_progress(std::vector& fp); + size_type total_payload_download(); + size_type total_payload_upload(); + size_type all_time_upload(); + size_type all_time_download(); + QStringList files_path() const; + int num_uploads() const; + bool is_seed() const; + bool is_auto_managed() const; + int active_time() const; + std::vector file_priorities() const; + bool is_sequential_download() const; + + // + // Setters + // + + void set_download_limit(int limit); + void set_upload_limit(int limit); + void pause(); + void resume(); + void remove_url_seed(QString seed); + void add_url_seed(QString seed); + void set_max_uploads(int val); + void set_max_connections(int val); + void prioritize_files(std::vector v); + void file_priority(int index, int priority) const; + void set_ratio(float ratio) const; + void replace_trackers(std::vector const&) const; + void force_reannounce(); + void set_sequential_download(bool); + void set_tracker_login(QString username, QString password); + void queue_position_down() const; + void queue_position_up() const; + void auto_managed(bool) const; + void force_recheck() const; + void move_storage(QString path) const; + + // + // Operators + // + QTorrentHandle& operator =(const torrent_handle& new_h); + bool operator ==(const QTorrentHandle& new_h) const; +}; + +#endif diff --git a/src/realprogressbar.cpp b/src/realprogressbar.cpp new file mode 100644 index 000000000..667f3c89b --- /dev/null +++ b/src/realprogressbar.cpp @@ -0,0 +1,116 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include "realprogressbar.h" +#include +#include +#include + +RealProgressBar::RealProgressBar(QWidget *parent) + : QWidget(parent), array(1) +{ + background = Qt::white; + foreground = Qt::black; + active = false; + array[0] = 0.; + drawPixmap(); +} + +RealProgressBar::~RealProgressBar() +{ + qDebug("RealProgressBar destruction"); +} + +void RealProgressBar::setBackgroundColor(const QColor &newColor) +{ + background = newColor; + drawPixmap(); +} + +void RealProgressBar::setForegroundColor(const QColor &newColor) +{ + foreground = newColor; + drawPixmap(); +} +/* +void RealProgressBar::setThread(const RealProgressBarThread *newThread) +{ + thread = newThread; +} +*/ +void RealProgressBar::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.drawPixmap(rect(), pixmap); +} + +void RealProgressBar::resizeEvent(QResizeEvent *event) +{ + if(width() != event->oldSize().width()) + emit widthChanged(width()); +} + +void RealProgressBar::setProgress(QRealArray progress) +{ + qDebug("setProgress called"); + array = progress; + drawPixmap(); +} + +void RealProgressBar::drawPixmap() +{ + if(pixmap.width() != array.size()) + pixmap = QPixmap(array.size(), 1); + QPainter painter(&pixmap); + for(int i=0; i 1.) + x = 1.; + qreal y = 1. - x; +// Q_ASSERT(x >= 0.); +// Q_ASSERT(y >= 0.); + qreal r1, g1, b1, a1, r2, g2, b2, a2; + foreground.getRgbF(&r1, &g1, &b1, &a1); + background.getRgbF(&r2, &g2, &b2, &a2); + QColor color; + color.setRgbF(x*r1+y*r2, x*g1+y*g2, x*b1+y*b2, x*a1+y*a2); + return color; +} diff --git a/src/realprogressbar.h b/src/realprogressbar.h new file mode 100644 index 000000000..85d6c9f1a --- /dev/null +++ b/src/realprogressbar.h @@ -0,0 +1,79 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef REALPROGRESSBAR_H +#define REALPROGRESSBAR_H + +#include "qrealarray.h" +#include +#include + +class RealProgressBar : public QWidget +{ + Q_OBJECT + Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) + Q_PROPERTY(QColor foregroundColor READ foregroundColor WRITE setForegroundColor) + + private: + QColor foreground; + QColor background; + bool active; + QPixmap pixmap; +// RealProgressBarThread *thread; + QRealArray array; + + public: + RealProgressBar(QWidget *parent = 0); + ~RealProgressBar(); + + void setBackgroundColor(const QColor &newColor); + QColor backgroundColor() const {return background;} + void setForegroundColor(const QColor &newColor); + QColor foregroundColor() const {return foreground;} +// void setThread(const RealProgressBarThread *newThread); +// RealProgressBarThread *thread() const {return thread;} + + public slots: + void setProgress(QRealArray progress); + + signals: + void widthChanged(int width); + + protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + + private: + void drawPixmap(); + QColor penColor(qreal f); + +}; + +#endif diff --git a/src/realprogressbarthread.cpp b/src/realprogressbarthread.cpp new file mode 100644 index 000000000..79ca4ea1e --- /dev/null +++ b/src/realprogressbarthread.cpp @@ -0,0 +1,170 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include "realprogressbarthread.h" +#include "realprogressbar.h" +#include +#include + +RealProgressBarThread::RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle) : QThread(pb), thandle(handle), array(pb->width()){ + size = pb->width(); + abort = false; + connect(pb, SIGNAL(widthChanged(int)), this, SLOT(resize(int)), Qt::DirectConnection); + connect(this, SIGNAL(refreshed(QRealArray)), pb, SLOT(setProgress(QRealArray))); +} + +RealProgressBarThread::~RealProgressBarThread(){ + qDebug("RealProgressBarThread destruction"); + resize(-1); + qDebug("RealProgressBarThread waiting"); + wait(); + qDebug("RealProgressBarThread destroyed"); +} + +void RealProgressBarThread::resize(int width) +{ + QMutexLocker locker(&mutex); + size = width; + abort = true; + condition.wakeOne(); +} + +void RealProgressBarThread::refresh() +{ + QMutexLocker locker(&mutex); + condition.wakeOne(); +} + +void RealProgressBarThread::run(){ + forever + { + //start checking the torrent information + if(ifInterrupted() == stop) + { + qDebug("RealProgressBarThread stop"); + return; + } + size_type total_size = thandle.total_size(); + size_type piece_length = thandle.piece_length(); + int num_pieces = thandle.num_pieces(); + bitfield pieces = thandle.pieces(); + //pieces not returned + if (pieces.empty()) + { + qDebug("pieces vector not returned"); + return; + } + //empty the array + mutex.lock(); + for(int i=0; i array.size()) + end = array.size(); + int start_int, end_int; + qreal start_frac, end_frac; + double temp; + start_frac = modf(start, &temp); + start_int = (int) temp; + end_frac = modf(end, &temp); + end_int = (int) temp; + if(start_int == end_int) + { + array[start_int] += progress * (end - start); + return; + } + if (start_frac > 0.) + array[start_int] += progress * (1 - start_frac); + if (end_frac > 0.) + array[end_int] += progress * end_frac; + for(int i=start_int+1; i +#include +#include + +class RealProgressBar; + +enum Interrupt +{ + ignore, + restart, + stop +}; + +class RealProgressBarThread : public QThread { + Q_OBJECT + private: + bool abort; + int size; + QTorrentHandle thandle; + QMutex mutex; + QWaitCondition condition; + QRealArray array; + + public: + RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle); + ~RealProgressBarThread(); + + public slots: + void resize(int width); + void refresh(); + + signals: + void refreshed(QRealArray progress); + + protected: + void run(); + + private: + Interrupt ifInterrupted(); + void mark(qreal start, qreal end, qreal progress = 1.); +}; + +#endif diff --git a/src/rss.cpp b/src/rss.cpp new file mode 100644 index 000000000..dd86e80ef --- /dev/null +++ b/src/rss.cpp @@ -0,0 +1,658 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org arnaud@qbittorrent.org + */ + +#include "rss.h" +#include +#include + +/** RssFolder **/ + +RssFolder::RssFolder(RssFolder *parent, RssManager *rssmanager, bittorrent *BTSession, QString name): parent(parent), rssmanager(rssmanager), BTSession(BTSession), name(name) { + downloader = new downloadThread(this); + connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processFinishedDownload(QString, QString))); + connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(handleDownloadFailure(QString, QString))); +} + +RssFolder::~RssFolder() { + qDebug("Deleting a RSS folder, removing elements"); + qDeleteAll(this->values()); + qDebug("Deleting downloader thread"); + delete downloader; + qDebug("Downloader thread removed"); +} + +unsigned int RssFolder::getNbUnRead() const { + unsigned int nb_unread = 0; + foreach(RssFile *file, this->values()) { + nb_unread += file->getNbUnRead(); + } + return nb_unread; +} + +RssFile::FileType RssFolder::getType() const { + return RssFile::FOLDER; +} + +void RssFolder::refreshAll(){ + qDebug("Refreshing all rss feeds"); + QList items = this->values(); + for(int i=0; igetType() == RssFile::STREAM) { + RssStream* stream = (RssStream*) item; + QString url = stream->getUrl(); + if(stream->isLoading()) return; + stream->setLoading(true); + downloader->downloadUrl(url); + if(!stream->hasCustomIcon()){ + downloader->downloadUrl(stream->getIconUrl()); + } + } else { + RssFolder *folder = (RssFolder*)item; + folder->refreshAll(); + } + } +} + +void RssFolder::removeFile(QString ID) { + if(this->contains(ID)) + delete this->take(ID); +} + +RssFolder* RssFolder::addFolder(QString name) { + RssFolder *subfolder; + if(!this->contains(name)) { + subfolder = new RssFolder(this, rssmanager, BTSession, name); + (*this)[name] = subfolder; + } else { + subfolder = (RssFolder*)this->value(name); + } + return subfolder; +} + +RssStream* RssFolder::addStream(QString url) { + RssStream* stream = new RssStream(this, rssmanager, BTSession, url); + Q_ASSERT(!this->contains(stream->getUrl())); + (*this)[stream->getUrl()] = stream; + refreshStream(stream->getUrl()); + return stream; +} + +// Refresh All Children +void RssFolder::refresh() { + foreach(RssFile *child, this->values()) { + // Little optimization child->refresh() would work too + if(child->getType() == RssFile::STREAM) + refreshStream(child->getID()); + else + child->refresh(); + } +} + +QList RssFolder::getNewsList() const { + QList news; + foreach(RssFile *child, this->values()) { + news.append(child->getNewsList()); + } + return news; +} + +QList RssFolder::getUnreadNewsList() const { + QList unread_news; + foreach(RssFile *child, this->values()) { + unread_news.append(child->getUnreadNewsList()); + } + return unread_news; +} + +void RssFolder::refreshStream(QString url) { + qDebug("Refreshing feed: %s", url.toLocal8Bit().data()); + Q_ASSERT(this->contains(url)); + RssStream *stream = (RssStream*)this->value(url); + if(stream->isLoading()) { + qDebug("Stream %s is already being loaded...", stream->getUrl().toLocal8Bit().data()); + return; + } + stream->setLoading(true); + qDebug("stream %s : loaded=true", stream->getUrl().toLocal8Bit().data()); + downloader->downloadUrl(url); + if(!stream->hasCustomIcon()){ + downloader->downloadUrl(stream->getIconUrl()); + }else{ + qDebug("No need to download this feed's icon, it was already downloaded"); + } +} + +QList RssFolder::getContent() const { + return this->values(); +} + +unsigned int RssFolder::getNbFeeds() const { + unsigned int nbFeeds = 0; + foreach(RssFile* item, this->values()) { + if(item->getType() == RssFile::FOLDER) + nbFeeds += ((RssFolder*)item)->getNbFeeds(); + else + nbFeeds += 1; + } + return nbFeeds; +} + +void RssFolder::processFinishedDownload(QString url, QString path) { + if(url.endsWith("favicon.ico")){ + // Icon downloaded + QImage fileIcon; + if(fileIcon.load(path)) { + QList res = findFeedsWithIcon(url); + RssStream* stream; + foreach(stream, res){ + stream->setIconPath(path); + if(!stream->isLoading()) + rssmanager->forwardFeedIconChanged(stream->getUrl(), stream->getIconPath()); + } + }else{ + qDebug("Unsupported icon format at %s", (const char*)url.toLocal8Bit()); + } + return; + } + RssStream *stream = (RssStream*)this->value(url, 0); + if(!stream){ + qDebug("This rss stream was deleted in the meantime, nothing to update"); + return; + } + stream->processDownloadedFile(path); + stream->setLoading(false); + qDebug("stream %s : loaded=false", stream->getUrl().toLocal8Bit().data()); + // If the feed has no alias, then we use the title as Alias + // this is more user friendly + if(stream->getName().isEmpty()){ + if(!stream->getTitle().isEmpty()) + stream->rename(stream->getTitle()); + } + rssmanager->forwardFeedInfosChanged(url, stream->getName(), stream->getNbUnRead()); +} + +void RssFolder::handleDownloadFailure(QString url, QString reason) { + if(url.endsWith("favicon.ico")){ + // Icon download failure + qDebug("Could not download icon at %s, reason: %s", (const char*)url.toLocal8Bit(), (const char*)reason.toLocal8Bit()); + return; + } + RssStream *stream = (RssStream*)this->value(url, 0); + if(!stream){ + qDebug("This rss stream was deleted in the meantime, nothing to update"); + return; + } + stream->setLoading(false); + qDebug("Could not download Rss at %s, reason: %s", (const char*)url.toLocal8Bit(), (const char*)reason.toLocal8Bit()); + stream->setDownloadFailed(); + rssmanager->forwardFeedInfosChanged(url, stream->getName(), stream->getNbUnRead()); +} + +QList RssFolder::findFeedsWithIcon(QString icon_url) const { + QList res; + RssFile* item; + foreach(item, this->values()){ + if(item->getType() == RssFile::STREAM && ((RssStream*)item)->getIconUrl() == icon_url) + res << (RssStream*)item; + } + return res; +} + +QString RssFolder::getName() const { + return name; +} + +void RssFolder::rename(QString new_name) { + Q_ASSERT(!parent->contains(new_name)); + if(!parent->contains(new_name)) { + // Update parent + (*parent)[new_name] = parent->take(name); + // Actually rename + name = new_name; + } +} + +void RssFolder::markAllAsRead() { + foreach(RssFile *item, this->values()) { + item->markAllAsRead(); + } +} + +QList RssFolder::getAllFeeds() const { + QList streams; + foreach(RssFile *item, this->values()) { + if(item->getType() == RssFile::STREAM) { + streams << ((RssStream*)item); + } else { + foreach(RssStream* stream, ((RssFolder*)item)->getAllFeeds()) { + streams << stream; + } + } + } + return streams; +} + +void RssFolder::addFile(RssFile * item) { + if(item->getType() == RssFile::STREAM) { + Q_ASSERT(!this->contains(((RssStream*)item)->getUrl())); + (*this)[((RssStream*)item)->getUrl()] = item; + qDebug("Added feed %s to folder ./%s", ((RssStream*)item)->getUrl().toLocal8Bit().data(), name.toLocal8Bit().data()); + } else { + Q_ASSERT(!this->contains(((RssFolder*)item)->getName())); + (*this)[((RssFolder*)item)->getName()] = item; + qDebug("Added folder %s to folder ./%s", ((RssFolder*)item)->getName().toLocal8Bit().data(), name.toLocal8Bit().data()); + } + // Update parent + item->setParent(this); +} + +/** RssManager **/ + +RssManager::RssManager(bittorrent *BTSession): RssFolder(0, this, BTSession, QString::null) { + loadStreamList(); + connect(&newsRefresher, SIGNAL(timeout()), this, SLOT(refreshAll())); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + refreshInterval = settings.value(QString::fromUtf8("Preferences/RSS/RSSRefresh"), 5).toInt(); + newsRefresher.start(refreshInterval*60000); +} + +RssManager::~RssManager(){ + qDebug("Deleting RSSManager"); + saveStreamList(); + qDebug("RSSManager deleted"); +} + +void RssManager::loadStreamList(){ + QSettings settings("qBittorrent", "qBittorrent"); + QStringList streamsUrl = settings.value("Rss/streamList").toStringList(); + QStringList aliases = settings.value("Rss/streamAlias").toStringList(); + if(streamsUrl.size() != aliases.size()){ + std::cerr << "Corrupted Rss list, not loading it\n"; + return; + } + unsigned int i = 0; + foreach(QString s, streamsUrl){ + QStringList path = s.split("\\"); + if(path.empty()) continue; + QString feed_url = path.takeLast(); + // Create feed path (if it does not exists) + RssFolder * feed_parent = this; + foreach(QString folder_name, path) { + feed_parent = feed_parent->addFolder(folder_name); + } + // Create feed + RssStream *stream = feed_parent->addStream(feed_url); + QString alias = aliases.at(i); + if(!alias.isEmpty()) { + stream->rename(alias); + } + ++i; + } + qDebug("NB RSS streams loaded: %d", streamsUrl.size()); +} + +void RssManager::forwardFeedInfosChanged(QString url, QString aliasOrUrl, unsigned int nbUnread) { + emit feedInfosChanged(url, aliasOrUrl, nbUnread); +} + +void RssManager::forwardFeedIconChanged(QString url, QString icon_path) { + emit feedIconChanged(url, icon_path); +} + +void RssManager::moveFile(RssFile* file, RssFolder* dest_folder) { + RssFolder* src_folder = file->getParent(); + if(dest_folder != src_folder) { + // Copy to new Folder + dest_folder->addFile(file); + // Remove reference in old folder + src_folder->remove(file->getID()); + } else { + qDebug("Nothing to move, same destination folder"); + } +} + +void RssManager::saveStreamList(){ + QList > streamsList; + QStringList streamsUrl; + QStringList aliases; + QList streams = getAllFeeds(); + foreach(RssStream *stream, streams) { + QString stream_path = stream->getPath().join("\\"); + qDebug("Saving stream path: %s", stream_path.toLocal8Bit().data()); + streamsUrl << stream_path; + aliases << stream->getName(); + } + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Rss"); + // FIXME: Empty folder are not saved + settings.setValue("streamList", streamsUrl); + settings.setValue("streamAlias", aliases); + settings.endGroup(); +} + +/** RssStream **/ + +RssStream::RssStream(RssFolder* parent, RssManager *rssmanager, bittorrent *BTSession, QString _url): parent(parent), rssmanager(rssmanager), BTSession(BTSession), alias(""), iconPath(":/Icons/rss16.png"), refreshed(false), downloadFailure(false), currently_loading(false) { + has_attachments = false; + qDebug("RSSStream constructed"); + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + url = QUrl(_url).toString(); + QHash all_old_items = qBTRSS.value("old_items", QHash()).toHash(); + QVariantList old_items = all_old_items.value(url, QVariantList()).toList(); + qDebug("Loading %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data()); + foreach(const QVariant &var_it, old_items) { + QHash item = var_it.toHash(); + RssItem *rss_item = RssItem::fromHash(this, item); + if(rss_item->isValid()) { + (*this)[rss_item->getTitle()] = rss_item; + if(rss_item->has_attachment()) + has_attachments = true; + } + } +} + +RssStream::~RssStream(){ + qDebug("Deleting a RSS stream: %s", getName().toLocal8Bit().data()); + if(refreshed) { + QSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QVariantList old_items; + foreach(RssItem *item, this->values()) { + old_items << item->toHash(); + } + qDebug("Saving %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data()); + QHash all_old_items = qBTRSS.value("old_items", QHash()).toHash(); + all_old_items[url] = old_items; + qBTRSS.setValue("old_items", all_old_items); + } + qDebug("Removing all item from feed"); + removeAllItems(); + qDebug("All items were removed"); + if(QFile::exists(filePath)) + QFile::remove(filePath); + if(QFile::exists(iconPath) && !iconPath.startsWith(":/")) + QFile::remove(iconPath); +} + +RssFile::FileType RssStream::getType() const { + return RssFile::STREAM; +} + +void RssStream::refresh() { + parent->refreshStream(url); +} + +// delete all the items saved +void RssStream::removeAllItems() { + qDeleteAll(this->values()); + this->clear(); +} + +bool RssStream::itemAlreadyExists(QString name) { + return this->contains(name); +} + +void RssStream::setLoading(bool val) { + currently_loading = val; +} + +bool RssStream::isLoading() { + return currently_loading; +} + +QString RssStream::getTitle() const{ + return title; +} + +void RssStream::rename(QString new_name){ + qDebug("Renaming stream to %s", new_name.toLocal8Bit().data()); + alias = new_name; +} + +// Return the alias if the stream has one, the url if it has no alias +QString RssStream::getName() const{ + if(!alias.isEmpty()) { + //qDebug("getName() returned alias: %s", (const char*)alias.toLocal8Bit()); + return alias; + } + if(!title.isEmpty()) { + //qDebug("getName() returned title: %s", (const char*)title.toLocal8Bit()); + return title; + } + //qDebug("getName() returned url: %s", (const char*)url.toLocal8Bit()); + return url; +} + +QString RssStream::getLink() const{ + return link; +} + +QString RssStream::getUrl() const{ + return url; +} + +QString RssStream::getDescription() const{ + return description; +} + +QString RssStream::getImage() const{ + return image; +} + +QString RssStream::getFilePath() const{ + return filePath; +} + +QString RssStream::getIconPath() const{ + if(downloadFailure) + return ":/Icons/oxygen/unavailable.png"; + return iconPath; +} + +bool RssStream::hasCustomIcon() const{ + return !iconPath.startsWith(":/"); +} + +void RssStream::setIconPath(QString path) { + iconPath = path; +} + +RssItem* RssStream::getItem(QString name) const{ + return this->value(name); +} + +unsigned int RssStream::getNbNews() const{ + return this->size(); +} + +void RssStream::markAllAsRead() { + foreach(RssItem *item, this->values()){ + item->setRead(); + } + rssmanager->forwardFeedInfosChanged(url, getName(), 0); +} + +unsigned int RssStream::getNbUnRead() const{ + unsigned int nbUnread=0; + foreach(RssItem *item, this->values()) { + if(!item->isRead()) + ++nbUnread; + } + return nbUnread; +} + +QList RssStream::getNewsList() const{ + return this->values(); +} + +QList RssStream::getUnreadNewsList() const { + QList unread_news; + foreach(RssItem *item, this->values()) { + if(!item->isRead()) + unread_news << item; + } + return unread_news; +} + +// download the icon from the adress +QString RssStream::getIconUrl() { + QUrl siteUrl(url); + return QString::fromUtf8("http://")+siteUrl.host()+QString::fromUtf8("/favicon.ico"); +} + +// read and create items from a rss document +short RssStream::readDoc(const QDomDocument& doc) { + // is it a rss file ? + QDomElement root = doc.documentElement(); + if(root.tagName() == QString::fromUtf8("html")){ + qDebug("the file is empty, maybe the url is invalid or the server is too busy"); + return -1; + } + else if(root.tagName() != QString::fromUtf8("rss")){ + qDebug("the file is not a rss stream, omitted: %s", root.tagName().toLocal8Bit().data()); + return -1; + } + QDomNode rss = root.firstChild(); + QDomElement channel = root.firstChild().toElement(); + + while(!channel.isNull()) { + // we are reading the rss'main info + if (channel.tagName() == "channel") { + QDomElement property = channel.firstChild().toElement(); + while(!property.isNull()) { + if (property.tagName() == "title") { + title = property.text(); + if(alias==getUrl()) + rename(title); + } + else if (property.tagName() == "link") + link = property.text(); + else if (property.tagName() == "description") + description = property.text(); + else if (property.tagName() == "image") + image = property.text(); + else if(property.tagName() == "item") { + RssItem * item = new RssItem(this, property); + if(item->isValid() && !itemAlreadyExists(item->getTitle())) { + (*this)[item->getTitle()] = item; + if(item->has_attachment()) { + has_attachments = true; + // Check if the item should be automatically downloaded + FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle()); + if(matching_filter != 0) { + // Download the torrent + BTSession->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName())); + if(matching_filter->isValid()) { + QString save_path = matching_filter->getSavePath(); + if(save_path.isEmpty()) + BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl()); + else + BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl(), save_path); + } else { + // All torrents are downloaded from this feed + BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl()); + } + // Item was downloaded, consider it as Read + item->setRead(); + // Clean up + delete matching_filter; + } + } + } else { + delete item; + } + } + property = property.nextSibling().toElement(); + } + } + channel = channel.nextSibling().toElement(); + } + resizeList(); + return 0; +} + +void RssStream::resizeList() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + unsigned int max_articles = settings.value(QString::fromUtf8("Preferences/RSS/RSSMaxArticlesPerFeed"), 100).toInt(); + unsigned int nb_articles = this->size(); + if(nb_articles > max_articles) { + QList listItem = sortNewsList(this->values()); + int excess = nb_articles - max_articles; + for(int i=0; itake(lastItem->getTitle()); + } + } +} + +// existing and opening test after download +short RssStream::openRss(){ + qDebug("openRss() called"); + QDomDocument doc("Rss Seed"); + QFile fileRss(filePath); + if(!fileRss.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug("openRss error: open failed, no file or locked, %s", (const char*)filePath.toLocal8Bit()); + if(QFile::exists(filePath)) { + fileRss.remove(); + } + return -1; + } + if(!doc.setContent(&fileRss)) { + qDebug("can't read temp file, might be empty"); + fileRss.close(); + if(QFile::exists(filePath)) { + fileRss.remove(); + } + return -1; + } + // start reading the xml + short return_lecture = readDoc(doc); + fileRss.close(); + if(QFile::exists(filePath)) { + fileRss.remove(); + } + return return_lecture; +} + +// read and store the downloaded rss' informations +void RssStream::processDownloadedFile(QString file_path) { + filePath = file_path; + downloadFailure = false; + if(openRss() >= 0) { + refreshed = true; + } else { + qDebug("OpenRss: Feed update Failed"); + } +} + +void RssStream::setDownloadFailed(){ + downloadFailure = true; +} diff --git a/src/rss.h b/src/rss.h new file mode 100644 index 000000000..740a58ae4 --- /dev/null +++ b/src/rss.h @@ -0,0 +1,514 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSS_H +#define RSS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "misc.h" +#include "FeedDownloader.h" +#include "bittorrent.h" +#include "downloadThread.h" + +class RssManager; +class RssFile; // Folder or Stream +class RssFolder; +class RssStream; +class RssItem; + +static const char shortDay[][4] = { + "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat", + "Sun" +}; +static const char longDay[][10] = { + "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday", + "Sunday" +}; +static const char shortMonth[][4] = { + "Jan", "Feb", "Mar", "Apr", + "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec" +}; +static const char longMonth[][10] = { + "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" +}; + +class RssFile: public QObject { + Q_OBJECT + +public: + enum FileType {STREAM, FOLDER}; + + RssFile(): QObject() {} + + virtual unsigned int getNbUnRead() const = 0; + virtual FileType getType() const = 0; + virtual QString getName() const = 0; + virtual QString getID() const = 0; + virtual void rename(QString new_name) = 0; + virtual void markAllAsRead() = 0; + virtual RssFolder* getParent() const = 0; + virtual void setParent(RssFolder*) = 0; + virtual void refresh() = 0; + virtual QList getNewsList() const = 0; + virtual QList getUnreadNewsList() const = 0; + QStringList getPath() const { + QStringList path; + if(getParent()) { + path = ((RssFile*)getParent())->getPath(); + path.append(getID()); + } + return path; + } +}; + +// Item of a rss stream, single information +class RssItem: public QObject { + Q_OBJECT +private: + RssStream* parent; + QString title; + QString torrent_url; + QString news_link; + QString description; + QDateTime date; + QString author; + + + bool is_valid; + bool read; + +protected: + // Ported to Qt4 from KDElibs4 + QDateTime parseDate(const QString &string) { + QString str = string.trimmed(); + if (str.isEmpty()) + return QDateTime(); + + int nyear = 6; // indexes within string to values + int nmonth = 4; + int nday = 2; + int nwday = 1; + int nhour = 7; + int nmin = 8; + int nsec = 9; + // Also accept obsolete form "Weekday, DD-Mon-YY HH:MM:SS ±hhmm" + QRegExp rx("^(?:([A-Z][a-z]+),\\s*)?(\\d{1,2})(\\s+|-)([^-\\s]+)(\\s+|-)(\\d{2,4})\\s+(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s+(\\S+)$"); + QStringList parts; + if (!str.indexOf(rx)) { + // Check that if date has '-' separators, both separators are '-'. + parts = rx.capturedTexts(); + bool h1 = (parts[3] == QLatin1String("-")); + bool h2 = (parts[5] == QLatin1String("-")); + if (h1 != h2) + return QDateTime(); + } else { + // Check for the obsolete form "Wdy Mon DD HH:MM:SS YYYY" + rx = QRegExp("^([A-Z][a-z]+)\\s+(\\S+)\\s+(\\d\\d)\\s+(\\d\\d):(\\d\\d):(\\d\\d)\\s+(\\d\\d\\d\\d)$"); + if (str.indexOf(rx)) + return QDateTime(); + nyear = 7; + nmonth = 2; + nday = 3; + nwday = 1; + nhour = 4; + nmin = 5; + nsec = 6; + parts = rx.capturedTexts(); + } + bool ok[4]; + int day = parts[nday].toInt(&ok[0]); + int year = parts[nyear].toInt(&ok[1]); + int hour = parts[nhour].toInt(&ok[2]); + int minute = parts[nmin].toInt(&ok[3]); + if (!ok[0] || !ok[1] || !ok[2] || !ok[3]) + return QDateTime(); + int second = 0; + if (!parts[nsec].isEmpty()) { + second = parts[nsec].toInt(&ok[0]); + if (!ok[0]) + return QDateTime(); + } + bool leapSecond = (second == 60); + if (leapSecond) + second = 59; // apparently a leap second - validate below, once time zone is known + int month = 0; + for ( ; month < 12 && parts[nmonth] != shortMonth[month]; ++month) ; + int dayOfWeek = -1; + if (!parts[nwday].isEmpty()) { + // Look up the weekday name + while (++dayOfWeek < 7 && shortDay[dayOfWeek] != parts[nwday]) ; + if (dayOfWeek >= 7) + for (dayOfWeek = 0; dayOfWeek < 7 && longDay[dayOfWeek] != parts[nwday]; ++dayOfWeek) ; + } + // if (month >= 12 || dayOfWeek >= 7 + // || (dayOfWeek < 0 && format == RFCDateDay)) + // return QDateTime; + int i = parts[nyear].size(); + if (i < 4) { + // It's an obsolete year specification with less than 4 digits + year += (i == 2 && year < 50) ? 2000: 1900; + } + + // Parse the UTC offset part + int offset = 0; // set default to '-0000' + bool negOffset = false; + if (parts.count() > 10) { + rx = QRegExp("^([+-])(\\d\\d)(\\d\\d)$"); + if (!parts[10].indexOf(rx)) { + // It's a UTC offset ±hhmm + parts = rx.capturedTexts(); + offset = parts[2].toInt(&ok[0]) * 3600; + int offsetMin = parts[3].toInt(&ok[1]); + if (!ok[0] || !ok[1] || offsetMin > 59) + return QDateTime(); + offset += offsetMin * 60; + negOffset = (parts[1] == QLatin1String("-")); + if (negOffset) + offset = -offset; + } else { + // Check for an obsolete time zone name + QByteArray zone = parts[10].toLatin1(); + if (zone.length() == 1 && isalpha(zone[0]) && toupper(zone[0]) != 'J') + negOffset = true; // military zone: RFC 2822 treats as '-0000' + else if (zone != "UT" && zone != "GMT") { // treated as '+0000' + offset = (zone == "EDT") ? -4*3600 + : (zone == "EST" || zone == "CDT") ? -5*3600 + : (zone == "CST" || zone == "MDT") ? -6*3600 + : (zone == "MST" || zone == "PDT") ? -7*3600 + : (zone == "PST") ? -8*3600 + : 0; + if (!offset) { + // Check for any other alphabetic time zone + bool nonalpha = false; + for (int i = 0, end = zone.size(); i < end && !nonalpha; ++i) + nonalpha = !isalpha(zone[i]); + if (nonalpha) + return QDateTime(); + // TODO: Attempt to recognize the time zone abbreviation? + negOffset = true; // unknown time zone: RFC 2822 treats as '-0000' + } + } + } + } + QDate qdate(year, month+1, day); // convert date, and check for out-of-range + if (!qdate.isValid()) + return QDateTime(); + QDateTime result(qdate, QTime(hour, minute, second)); + if (!result.isValid() + || (dayOfWeek >= 0 && result.date().dayOfWeek() != dayOfWeek+1)) + return QDateTime(); // invalid date/time, or weekday doesn't correspond with date + if (!offset) { + result.setTimeSpec(Qt::UTC); + } + if (leapSecond) { + // Validate a leap second time. Leap seconds are inserted after 23:59:59 UTC. + // Convert the time to UTC and check that it is 00:00:00. + if ((hour*3600 + minute*60 + 60 - offset + 86400*5) % 86400) // (max abs(offset) is 100 hours) + return QDateTime(); // the time isn't the last second of the day + } + return result; + } + +public: + // public constructor + RssItem(RssStream* parent, const QDomElement& properties): parent(parent), read(false) { + is_valid = false; + torrent_url = QString::null; + news_link = QString::null; + title = QString::null; + QDomElement property = properties.firstChild().toElement(); + while(!property.isNull()) { + if (property.tagName() == "title") { + title = property.text(); + if(title.isEmpty()) { + is_valid = false; + return; + } + } + else if (property.tagName() == "enclosure") { + if(property.attribute("type", "") == "application/x-bittorrent") { + torrent_url = property.attribute("url", QString::null); + } + } + else if (property.tagName() == "link") + news_link = property.text(); + else if (property.tagName() == "description") + description = property.text(); + else if (property.tagName() == "pubDate") + date = parseDate(property.text()); + else if (property.tagName() == "author") + author = property.text(); + property = property.nextSibling().toElement(); + } + is_valid = true; + } + + RssItem(RssStream* parent, QString _title, QString _torrent_url, QString _news_link, QString _description, QDateTime _date, QString _author, bool _read): + parent(parent), title(_title), torrent_url(_torrent_url), news_link(_news_link), description(_description), date(_date), author(_author), read(_read){ + if(!title.isEmpty() && !torrent_url.isEmpty()) { + is_valid = true; + } else { + std::cerr << "ERROR: an invalid RSS item was saved" << std::endl; + is_valid = false; + } + } + + ~RssItem(){ + } + + bool has_attachment() const { + return !torrent_url.isEmpty(); + } + + QHash toHash() const { + QHash item; + item["title"] = title; + item["torrent_url"] = torrent_url; + item["news_link"] = news_link; + item["description"] = description; + item["date"] = date; + item["author"] = author; + item["read"] = read; + return item; + } + + static RssItem* fromHash(RssStream* parent, QHash h) { + RssItem * item = new RssItem(parent, h["title"].toString(), h["torrent_url"].toString(), h["news_link"].toString(), + h["description"].toString(), h["date"].toDateTime(), h["author"].toString(), h["read"].toBool()); + return item; + } + + RssStream* getParent() const { + return parent; + } + + bool isValid() const { + return is_valid; + } + + QString getTitle() const{ + return title; + } + + QString getAuthor() const { + return author; + } + + QString getTorrentUrl() const{ + return torrent_url; + } + + QString getLink() const { + return news_link; + } + + QString getDescription() const{ + if(description.isEmpty()) + return tr("No description available"); + return description; + } + + QDateTime getDate() const { + return date; + } + + bool isRead() const{ + return read; + } + + void setRead(){ + read = true; + } +}; + +// Rss stream, loaded form an xml file +class RssStream: public RssFile, public QHash { + Q_OBJECT + +private: + RssFolder *parent; + RssManager *rssmanager; + bittorrent *BTSession; + QString title; + QString link; + QString description; + QString image; + QString url; + QString alias; + QString filePath; + QString iconPath; + bool read; + bool refreshed; + bool downloadFailure; + bool currently_loading; + bool has_attachments; + +public slots: + void processDownloadedFile(QString file_path); + void setDownloadFailed(); + +public: + RssStream(RssFolder* parent, RssManager *rssmanager, bittorrent *BTSession, QString _url); + ~RssStream(); + RssFolder* getParent() const { return parent; } + void setParent(RssFolder* _parent) { parent = _parent; } + FileType getType() const; + void refresh(); + QString getID() const { return url; } + void removeAllItems(); + bool itemAlreadyExists(QString hash); + void setLoading(bool val); + bool isLoading(); + QString getTitle() const; + void rename(QString _alias); + QString getName() const; + QString getLink() const; + QString getUrl() const; + QString getDescription() const; + QString getImage() const; + QString getFilePath() const; + QString getIconPath() const; + bool hasCustomIcon() const; + void setIconPath(QString path); + RssItem* getItem(QString name) const; + unsigned int getNbNews() const; + void markAllAsRead(); + unsigned int getNbUnRead() const; + QList getNewsList() const; + QList getUnreadNewsList() const; + QString getIconUrl(); + bool hasAttachments() const { return has_attachments; } + +private: + short readDoc(const QDomDocument& doc); + void resizeList(); + short openRss(); +}; + +class RssFolder: public RssFile, public QHash { + Q_OBJECT + +private: + RssFolder *parent; + RssManager *rssmanager; + downloadThread *downloader; + bittorrent *BTSession; + QString name; + +public: + RssFolder(RssFolder *parent, RssManager *rssmanager, bittorrent *BTSession, QString name); + ~RssFolder(); + RssFolder* getParent() const { return parent; } + void setParent(RssFolder* _parent) { parent = _parent; } + unsigned int getNbUnRead() const; + FileType getType() const; + RssStream* addStream(QString url); + RssFolder* addFolder(QString name); + QList findFeedsWithIcon(QString icon_url) const; + unsigned int getNbFeeds() const; + QList getContent() const; + QList getAllFeeds() const; + QString getName() const; + QString getID() const { return name; } + bool hasChild(QString ID) { return this->contains(ID); } + QList getNewsList() const; + QList getUnreadNewsList() const; + +public slots: + void refreshAll(); + void addFile(RssFile * item); + void removeFile(QString ID); + void refresh(); + void refreshStream(QString url); + void processFinishedDownload(QString url, QString path); + void handleDownloadFailure(QString url, QString reason); + void rename(QString new_name); + void markAllAsRead(); +}; + +class RssManager: public RssFolder{ + Q_OBJECT + +private: + QTimer newsRefresher; + unsigned int refreshInterval; + bittorrent *BTSession; + +signals: + void feedInfosChanged(QString url, QString aliasOrUrl, unsigned int nbUnread); + void feedIconChanged(QString url, QString icon_path); + +public slots: + void loadStreamList(); + void saveStreamList(); + void forwardFeedInfosChanged(QString url, QString aliasOrUrl, unsigned int nbUnread); + void forwardFeedIconChanged(QString url, QString icon_path); + void moveFile(RssFile* file, RssFolder* dest_folder); + +public: + RssManager(bittorrent *BTSession); + ~RssManager(); + +}; + +static void insertSortElem(QList &list, RssItem *item) { + int i = 0; + while(i < list.size() && item->getDate() < list.at(i)->getDate()) { + ++i; + } + list.insert(i, item); +} + +static QList sortNewsList(QList news_list) { + QList new_list; + foreach(RssItem *item, news_list) { + insertSortElem(new_list, item); + } + return new_list; +} + +#endif diff --git a/src/rss.ui b/src/rss.ui new file mode 100644 index 000000000..60acdc726 --- /dev/null +++ b/src/rss.ui @@ -0,0 +1,288 @@ + + + RSS + + + + 0 + 0 + 811 + 447 + + + + false + + + Search + + + + + + + + New subscription + + + + :/Icons/oxygen/subscribe.png:/Icons/oxygen/subscribe.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + Mark items read + + + + :/Icons/oxygen/button_ok.png:/Icons/oxygen/button_ok.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 32 + 32 + + + + Refresh RSS streams + + + Update all + + + + :/Icons/oxygen/view-refresh.png:/Icons/oxygen/view-refresh.png + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + 50 + false + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Torrents:</span> <span style=" font-style:italic;">(double-click to download)</span></p></body></html> + + + + + + + Qt::Vertical + + + + Qt::CustomContextMenu + + + QAbstractItemView::ExtendedSelection + + + false + + + false + + + true + + + false + + + true + + + + Bullet + + + + + Article title + + + + + Feed URL + + + + + + + + + + + + + + + :/Icons/oxygen/remove.png:/Icons/oxygen/remove.png + + + Delete + + + Delete + + + + + + :/Icons/oxygen/edit_clear.png:/Icons/oxygen/edit_clear.png + + + Rename + + + Rename + + + + + + :/Icons/oxygen/view-refresh.png:/Icons/oxygen/view-refresh.png + + + Update + + + Update + + + + + + :/Icons/oxygen/subscribe16.png:/Icons/oxygen/subscribe16.png + + + New subscription + + + + + + :/Icons/oxygen/view-refresh.png:/Icons/oxygen/view-refresh.png + + + Update all feeds + + + Update all feeds + + + + + + :/Icons/oxygen/button_ok.png:/Icons/oxygen/button_ok.png + + + Mark items read + + + Mark items read + + + + + + :/Icons/oxygen/download.png:/Icons/oxygen/download.png + + + Download torrent + + + + + + :/Icons/url.png:/Icons/url.png + + + Open news URL + + + + + + :/Icons/oxygen/edit-copy.png:/Icons/oxygen/edit-copy.png + + + Copy feed URL + + + + + + :/Icons/oxygen/download.png:/Icons/oxygen/download.png + + + RSS feed downloader + + + + + + :/Icons/oxygen/folder-new.png:/Icons/oxygen/folder-new.png + + + New folder + + + + + + + + diff --git a/src/rss_imp.cpp b/src/rss_imp.cpp new file mode 100644 index 000000000..7e484af39 --- /dev/null +++ b/src/rss_imp.cpp @@ -0,0 +1,620 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org arnaud@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rss_imp.h" +#include "FeedDownloader.h" +#include "feedList.h" +#include "bittorrent.h" + +#define NEWS_TITLE_COL 1 +#define NEWS_URL_COL 2 + +// display a right-click menu +void RSSImp::displayRSSListMenu(const QPoint& pos){ + if(!listStreams->indexAt(pos).isValid()) { + // No item under the mouse, clear selection + listStreams->clearSelection(); + } + QMenu myRSSListMenu(this); + QList selectedItems = listStreams->selectedItems(); + if(selectedItems.size() > 0) { + myRSSListMenu.addAction(actionUpdate); + myRSSListMenu.addAction(actionMark_items_read); + myRSSListMenu.addSeparator(); + if(selectedItems.size() == 1) { + if(listStreams->getRSSItem(selectedItems.first()) != rssmanager) { + myRSSListMenu.addAction(actionRename); + myRSSListMenu.addAction(actionDelete); + myRSSListMenu.addSeparator(); + if(listStreams->getItemType(selectedItems.first()) == RssFile::FOLDER) + myRSSListMenu.addAction(actionNew_folder); + } + } + myRSSListMenu.addAction(actionNew_subscription); + if(listStreams->getItemType(selectedItems.first()) == RssFile::STREAM) { + myRSSListMenu.addSeparator(); + myRSSListMenu.addAction(actionCopy_feed_URL); + if(selectedItems.size() == 1) { + if(((RssStream*)listStreams->getRSSItem(selectedItems.first()))->hasAttachments()) { + myRSSListMenu.addSeparator(); + myRSSListMenu.addAction(actionRSS_feed_downloader); + } + } + } + }else{ + myRSSListMenu.addAction(actionNew_subscription); + myRSSListMenu.addAction(actionNew_folder); + myRSSListMenu.addSeparator(); + myRSSListMenu.addAction(actionUpdate_all_feeds); + } + myRSSListMenu.exec(QCursor::pos()); +} + +void RSSImp::displayItemsListMenu(const QPoint&){ + QMenu myItemListMenu(this); + QList selectedItems = listNews->selectedItems(); + if(selectedItems.size() > 0) { + bool has_attachment = false; + foreach(QTreeWidgetItem *item, selectedItems) { + qDebug("text(3) URL: %s", item->text(NEWS_URL_COL).toLocal8Bit().data()); + qDebug("text(2) TITLE: %s", item->text(NEWS_TITLE_COL).toLocal8Bit().data()); + if(listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_TITLE_COL))->has_attachment()) { + has_attachment = true; + break; + } + } + if(has_attachment) + myItemListMenu.addAction(actionDownload_torrent); + myItemListMenu.addAction(actionOpen_news_URL); + } + myItemListMenu.exec(QCursor::pos()); +} + +void RSSImp::askNewFolder() { + QTreeWidgetItem *parent_item = 0; + RssFolder *rss_parent; + if(listStreams->selectedItems().size() > 0) { + parent_item = listStreams->selectedItems().at(0); + rss_parent = (RssFolder*)listStreams->getRSSItem(parent_item); + Q_ASSERT(rss_parent->getType() == RssFile::FOLDER); + } else { + rss_parent = rssmanager; + } + bool ok; + QString new_name = QInputDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok); + if(ok) { + RssFolder* new_folder = rss_parent->addFolder(new_name); + QTreeWidgetItem* folder_item; + if(parent_item) + folder_item = new QTreeWidgetItem(parent_item); + else + folder_item = new QTreeWidgetItem(listStreams); + // Notify TreeWidget + listStreams->itemAdded(folder_item, new_folder); + // Set Text + folder_item->setText(0, new_folder->getName() + QString::fromUtf8(" (0)")); + folder_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/folder.png"))); + // Expand parent folder to display new folder + if(parent_item) + parent_item->setExpanded(true); + rssmanager->saveStreamList(); + } +} + +void RSSImp::displayOverwriteError(QString filename) { + QMessageBox::warning(this, tr("Overwrite attempt"), + tr("You cannot overwrite %1 item.", "You cannot overwrite myFolder item.").arg(filename), + QMessageBox::Ok); +} + +// add a stream by a button +void RSSImp::on_newFeedButton_clicked() { + // Determine parent folder for new feed + QTreeWidgetItem *parent_item = 0; + QList selected_items = listStreams->selectedItems(); + if(!selected_items.empty()) { + parent_item = selected_items.first(); + // Consider the case where the user clicked on Unread item + if(parent_item == listStreams->getUnreadItem()) { + parent_item = 0; + } else { + if(listStreams->getItemType(parent_item) != RssFile::FOLDER) + parent_item = parent_item->parent(); + } + } + RssFolder *rss_parent; + if(parent_item) { + rss_parent = (RssFolder*)listStreams->getRSSItem(parent_item); + } else { + rss_parent = rssmanager; + } + // Ask for feed URL + bool ok; + QString clip_txt = qApp->clipboard()->text(); + QString default_url = "http://"; + if(clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive)) { + default_url = clip_txt; + } + QString newUrl = QInputDialog::getText(this, tr("Please type a rss stream url"), tr("Stream URL:"), QLineEdit::Normal, default_url, &ok); + if(ok) { + newUrl = newUrl.trimmed(); + if(!newUrl.isEmpty()){ + if(listStreams->hasFeed(newUrl)) { + QMessageBox::warning(this, tr("qBittorrent"), + tr("This rss feed is already in the list."), + QMessageBox::Ok); + return; + } + RssStream *stream = rss_parent->addStream(newUrl); + // Create TreeWidget item + QTreeWidgetItem* item; + if(parent_item) + item = new QTreeWidgetItem(parent_item); + else + item = new QTreeWidgetItem(listStreams); + // Notify TreeWidget + listStreams->itemAdded(item, stream); + // Set text + item->setText(0, stream->getName() + QString::fromUtf8(" (0)")); + item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + stream->refresh(); + rssmanager->saveStreamList(); + } + } +} + +// delete a stream by a button +void RSSImp::deleteSelectedItems() { + QList selectedItems = listStreams->selectedItems(); + if(selectedItems.size() == 0) return; + int ret; + if(selectedItems.size() > 1) + ret = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete these elements from the list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + else + ret = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete this element from the list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + if(!ret) { + foreach(QTreeWidgetItem *item, selectedItems){ + if(listStreams->currentFeed() == item){ + textBrowser->clear(); + previous_news = 0; + listNews->clear(); + } + RssFile *rss_item = listStreams->getRSSItem(item); + // Notify TreeWidget + listStreams->itemRemoved(item); + // Actually delete the item + rss_item->getParent()->removeFile(rss_item->getID()); + delete item; + } + rssmanager->saveStreamList(); + // Update Unread items + updateItemInfos(listStreams->getUnreadItem()); + } +} + +void RSSImp::loadFoldersOpenState() { + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Rss"); + QVariantList open_folders = settings.value("open_folders", QVariantList()).toList(); + settings.endGroup(); + foreach(QVariant var_path, open_folders) { + QStringList path = var_path.toString().split("\\"); + QTreeWidgetItem *parent = 0; + foreach(QString name, path) { + QList children; + int nbChildren = 0; + if(parent) + nbChildren = parent->childCount(); + else + nbChildren = listStreams->topLevelItemCount(); + for(int i=0; ichild(i); + else + child = listStreams->topLevelItem(i); + if(listStreams->getRSSItem(child)->getID() == name) { + parent = child; + parent->setExpanded(true); + qDebug("expanding folder %s", name.toLocal8Bit().data()); + break; + } + } + } + } +} + +void RSSImp::saveFoldersOpenState() { + QVariantList open_folders; + QList items = listStreams->getAllOpenFolders(); + foreach(QTreeWidgetItem* item, items) { + QString path = listStreams->getItemPath(item).join("\\"); + qDebug("saving open folder: %s", path.toLocal8Bit().data()); + open_folders << path; + } + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Rss"); + settings.setValue("open_folders", open_folders); + settings.endGroup(); +} + +// refresh all streams by a button +void RSSImp::on_updateAllButton_clicked() { + foreach(QTreeWidgetItem *item, listStreams->getAllFeedItems()) { + item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + } + rssmanager->refreshAll(); +} + +void RSSImp::downloadTorrent() { + QList selected_items = listNews->selectedItems(); + foreach(const QTreeWidgetItem* item, selected_items) { + RssItem* article = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_TITLE_COL)); + if(article->has_attachment()) { + BTSession->downloadFromUrl(article->getTorrentUrl()); + } else { + QString link = article->getLink(); + if(!link.isEmpty()) + QDesktopServices::openUrl(QUrl(link)); + } + } +} + +// open the url of the news in a browser +void RSSImp::openNewsUrl() { + QList selected_items = listNews->selectedItems(); + foreach(const QTreeWidgetItem* item, selected_items) { + RssItem* news = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_TITLE_COL)); + QString link = news->getLink(); + if(!link.isEmpty()) + QDesktopServices::openUrl(QUrl(link)); + } +} + +//right-click on stream : give it an alias +void RSSImp::renameFiles() { + QList selectedItems = listStreams->selectedItems(); + Q_ASSERT(selectedItems.size() == 1); + QTreeWidgetItem *item = selectedItems.at(0); + RssFile *rss_item = listStreams->getRSSItem(item); + bool ok; + QString newName; + do { + newName = QInputDialog::getText(this, tr("Please choose a new name for this RSS feed"), tr("New feed name:"), QLineEdit::Normal, listStreams->getRSSItem(item)->getName(), &ok); + // Check if name is already taken + if(ok && rss_item->getParent()->contains(newName)) { + QMessageBox::warning(0, tr("Name already in use"), tr("This name is already used by another item, please choose another one.")); + ok = false; + } + }while(!ok); + if(ok) { + // Rename item + rss_item->rename(newName); + // Update TreeWidget + updateItemInfos(item); + } +} + +//right-click on stream : refresh it +void RSSImp::refreshSelectedItems() { + QList selectedItems = listStreams->selectedItems(); + foreach(QTreeWidgetItem* item, selectedItems){ + RssFile* file = listStreams->getRSSItem(item); + // Update icons + if(item == listStreams->getUnreadItem()) { + foreach(QTreeWidgetItem *feed, listStreams->getAllFeedItems()) { + feed->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + } + file->refresh(); + break; + } else { + if(file->getType() == RssFile::STREAM) { + item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + } else { + // Update feeds in the folder + foreach(QTreeWidgetItem *feed, listStreams->getAllFeedItems(item)) { + feed->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + } + } + } + // Actually refresh + file->refresh(); + } +} + +void RSSImp::copySelectedFeedsURL() { + QStringList URLs; + QList selectedItems = listStreams->selectedItems(); + QTreeWidgetItem* item; + foreach(item, selectedItems){ + if(listStreams->getItemType(item) == RssFile::STREAM) + URLs << listStreams->getItemID(item); + } + qApp->clipboard()->setText(URLs.join("\n")); +} + +void RSSImp::showFeedDownloader() { + QTreeWidgetItem* item = listStreams->selectedItems()[0]; + RssFile* rss_item = listStreams->getRSSItem(item); + if(rss_item->getType() == RssFile::STREAM) + new FeedDownloaderDlg(this, listStreams->getItemID(item), rss_item->getName(), BTSession); +} + +void RSSImp::on_markReadButton_clicked() { + QList selectedItems = listStreams->selectedItems(); + QTreeWidgetItem* item; + foreach(item, selectedItems){ + RssFile *rss_item = listStreams->getRSSItem(item); + rss_item->markAllAsRead(); + updateItemInfos(item); + } + if(selectedItems.size()) + refreshNewsList(listStreams->currentItem()); +} + +void RSSImp::fillFeedsList(QTreeWidgetItem *parent, RssFolder *rss_parent) { + QList children; + if(parent) { + children = rss_parent->getContent(); + } else { + children = rssmanager->getContent(); + } + foreach(RssFile* rss_child, children){ + QTreeWidgetItem* item; + if(!parent) + item = new QTreeWidgetItem(listStreams); + else + item = new QTreeWidgetItem(parent); + item->setData(0, Qt::DisplayRole, rss_child->getName()+ QString::fromUtf8(" (")+QString::number(rss_child->getNbUnRead(), 10)+QString(")")); + // Notify TreeWidget of item addition + listStreams->itemAdded(item, rss_child); + // Set Icon + if(rss_child->getType() == RssFile::STREAM) { + item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/loading.png")))); + } else { + item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/folder.png")))); + // Recurvive call to load sub folders/files + fillFeedsList(item, (RssFolder*)rss_child); + } + } +} + +// fills the newsList +void RSSImp::refreshNewsList(QTreeWidgetItem* item) { + if(!item) { + listNews->clear(); + return; + } + + RssFile *rss_item = listStreams->getRSSItem(item); + + qDebug("Getting the list of news"); + QList news; + if(rss_item == rssmanager) + news = sortNewsList(rss_item->getUnreadNewsList()); + else + news = sortNewsList(rss_item->getNewsList()); + // Clear the list first + textBrowser->clear(); + previous_news = 0; + listNews->clear(); + qDebug("Got the list of news"); + foreach(RssItem* article, news){ + QTreeWidgetItem* it = new QTreeWidgetItem(listNews); + it->setText(NEWS_TITLE_COL, article->getTitle()); + if(article->has_attachment()) + it->setData(NEWS_TITLE_COL, Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/application-x-kgetlist.png"))); + else + it->setData(NEWS_TITLE_COL, Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/application-x-kgetlist-no.png"))); + it->setText(NEWS_URL_COL, article->getParent()->getUrl()); + if(article->isRead()){ + it->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey"))); + it->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png"))); + }else{ + it->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("blue"))); + it->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere2.png"))); + } + } + qDebug("Added all news to the GUI"); + qDebug("First news selected"); +} + +// display a news +void RSSImp::refreshTextBrowser(QTreeWidgetItem *item) { + if(!item || item == previous_news) return; + // Stop displaying previous news if necessary + if(listStreams->currentFeed() == listStreams->getUnreadItem()) { + if(previous_news) { + delete previous_news; + previous_news = 0; + } + previous_news = item; + } + RssStream *stream = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL)); + RssItem* article = stream->getItem(item->text(NEWS_TITLE_COL)); + QString html; + html += "
    "; + html += "
    "+article->getTitle() + "
    "; + if(article->getDate().isValid()) { + html += "
    "+tr("Date: ")+""+article->getDate().toString()+"
    "; + } + if(!article->getAuthor().isEmpty()) { + html += "
    "+tr("Author: ")+""+article->getAuthor()+"
    "; + } + html += "
    "; + html += ""+article->getDescription()+""; + textBrowser->setHtml(html); + article->setRead(); + item->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey"))); + item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png"))); + // Decrement feed nb unread news + updateItemInfos(listStreams->getUnreadItem()); + updateItemInfos(listStreams->getTreeItemFromUrl(item->text(NEWS_URL_COL))); +} + +void RSSImp::saveSlidersPosition() { + // Remember sliders positions + QSettings settings("qBittorrent", "qBittorrent"); + settings.setValue("rss/splitter_h", splitter_h->saveState()); + settings.setValue("rss/splitter_v", splitter_v->saveState()); + qDebug("Splitters position saved"); +} + +void RSSImp::restoreSlidersPosition() { + QSettings settings("qBittorrent", "qBittorrent"); + QByteArray pos_h = settings.value("rss/splitter_h", QByteArray()).toByteArray(); + if(!pos_h.isNull()) { + splitter_h->restoreState(pos_h); + } + QByteArray pos_v = settings.value("rss/splitter_v", QByteArray()).toByteArray(); + if(!pos_v.isNull()) { + splitter_v->restoreState(pos_v); + } +} + +void RSSImp::updateItemsInfos(QList items) { + foreach(QTreeWidgetItem* item, items) { + updateItemInfos(item); + } +} + +void RSSImp::updateItemInfos(QTreeWidgetItem *item) { + RssFile *rss_item = listStreams->getRSSItem(item); + QString name; + if(rss_item == rssmanager) + name = tr("Unread"); + else + name = rss_item->getName(); + item->setText(0, name + QString::fromUtf8(" (") + QString::number(rss_item->getNbUnRead(), 10)+ QString(")")); + // If item has a parent, update it too + if(item->parent()) + updateItemInfos(item->parent()); +} + +void RSSImp::updateFeedIcon(QString url, QString icon_path){ + QTreeWidgetItem *item = listStreams->getTreeItemFromUrl(url); + item->setData(0,Qt::DecorationRole, QVariant(QIcon(icon_path))); +} + +void RSSImp::updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread){ + QTreeWidgetItem *item = listStreams->getTreeItemFromUrl(url); + RssStream *stream = (RssStream*)listStreams->getRSSItem(item); + item->setText(0, aliasOrUrl + QString::fromUtf8(" (") + QString::number(nbUnread, 10)+ QString(")")); + if(!stream->isLoading()) + item->setData(0,Qt::DecorationRole, QVariant(QIcon(stream->getIconPath()))); + // Update parent + if(item->parent()) + updateItemInfos(item->parent()); + // Update Unread item + updateItemInfos(listStreams->getUnreadItem()); + // If the feed is selected, update the displayed news + if(listStreams->currentItem() == item ){ + refreshNewsList(item); + } else { + // Update unread items + if(listStreams->currentItem() == listStreams->getUnreadItem()) { + refreshNewsList(listStreams->getUnreadItem()); + } + } +} + +RSSImp::RSSImp(bittorrent *BTSession) : QWidget(), BTSession(BTSession){ + setupUi(this); + + rssmanager = new RssManager(BTSession); + + listStreams = new FeedList(splitter_h, rssmanager); + splitter_h->insertWidget(0, listStreams); + listNews->hideColumn(NEWS_URL_COL); + listNews->setColumnWidth(0, 16); + + fillFeedsList(); + refreshNewsList(listStreams->currentItem()); + + loadFoldersOpenState(); + connect(rssmanager, SIGNAL(feedInfosChanged(QString, QString, unsigned int)), this, SLOT(updateFeedInfos(QString, QString, unsigned int))); + connect(rssmanager, SIGNAL(feedIconChanged(QString, QString)), this, SLOT(updateFeedIcon(QString, QString))); + + connect(listStreams, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&))); + connect(listNews, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayItemsListMenu(const QPoint&))); + + // Feeds list actions + connect(actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelectedItems())); + connect(actionRename, SIGNAL(triggered()), this, SLOT(renameFiles())); + connect(actionUpdate, SIGNAL(triggered()), this, SLOT(refreshSelectedItems())); + connect(actionNew_folder, SIGNAL(triggered()), this, SLOT(askNewFolder())); + connect(actionNew_subscription, SIGNAL(triggered()), this, SLOT(on_newFeedButton_clicked())); + connect(actionUpdate_all_feeds, SIGNAL(triggered()), this, SLOT(on_updateAllButton_clicked())); + connect(actionCopy_feed_URL, SIGNAL(triggered()), this, SLOT(copySelectedFeedsURL())); + connect(actionRSS_feed_downloader, SIGNAL(triggered()), this, SLOT(showFeedDownloader())); + connect(actionMark_items_read, SIGNAL(triggered()), this, SLOT(on_markReadButton_clicked())); + // News list actions + connect(actionOpen_news_URL, SIGNAL(triggered()), this, SLOT(openNewsUrl())); + connect(actionDownload_torrent, SIGNAL(triggered()), this, SLOT(downloadTorrent())); + + connect(listStreams, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(refreshNewsList(QTreeWidgetItem*))); + connect(listStreams, SIGNAL(foldersAltered(QList)), this, SLOT(updateItemsInfos(QList))); + connect(listStreams, SIGNAL(overwriteAttempt(QString)), this, SLOT(displayOverwriteError(QString))); + + connect(listNews, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(refreshTextBrowser(QTreeWidgetItem *))); + connect(listNews, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(downloadTorrent())); + + // Refresh all feeds + rssmanager->refreshAll(); + // Restore sliders position + restoreSlidersPosition(); + // Bind saveSliders slots + connect(splitter_v, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition())); + connect(splitter_h, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition())); + + qDebug("RSSImp constructed"); +} + +RSSImp::~RSSImp(){ + qDebug("Deleting RSSImp..."); + saveFoldersOpenState(); + delete listStreams; + delete rssmanager; + qDebug("RSSImp deleted"); +} + diff --git a/src/rss_imp.h b/src/rss_imp.h new file mode 100644 index 000000000..c1fb246a0 --- /dev/null +++ b/src/rss_imp.h @@ -0,0 +1,88 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org arnaud@qbittorrent.org + */ +#ifndef __RSS_IMP_H__ +#define __RSS_IMP_H__ + +#define REFRESH_MAX_LATENCY 600000 + +#include + +#include "ui_rss.h" +#include "rss.h" + +class bittorrent; +class FeedList; +class QTreeWidgetItem; + +class RSSImp : public QWidget, public Ui::RSS{ + Q_OBJECT + +private: + RssManager *rssmanager; + bittorrent *BTSession; + FeedList *listStreams; + QTreeWidgetItem* previous_news; + +public slots: + void deleteSelectedItems(); + +protected slots: + void on_newFeedButton_clicked(); + void on_updateAllButton_clicked(); + void on_markReadButton_clicked(); + void displayRSSListMenu(const QPoint&); + void displayItemsListMenu(const QPoint&); + void renameFiles(); + void refreshSelectedItems(); + void copySelectedFeedsURL(); + void refreshNewsList(QTreeWidgetItem* item); + void refreshTextBrowser(QTreeWidgetItem *); + void updateFeedIcon(QString url, QString icon_path); + void updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread); + void updateItemsInfos(QList items); + void updateItemInfos(QTreeWidgetItem *item); + void openNewsUrl(); + void downloadTorrent(); + void fillFeedsList(QTreeWidgetItem *parent=0, RssFolder *rss_parent=0); + void saveSlidersPosition(); + void restoreSlidersPosition(); + void showFeedDownloader(); + void askNewFolder(); + void saveFoldersOpenState(); + void loadFoldersOpenState(); + void displayOverwriteError(QString filename); + +public: + RSSImp(bittorrent *BTSession); + ~RSSImp(); + +}; + +#endif diff --git a/src/search.qrc b/src/search.qrc new file mode 100644 index 000000000..37caac734 --- /dev/null +++ b/src/search.qrc @@ -0,0 +1,18 @@ + + + search_engine/novaprinter.py + search_engine/nova2dl.py + search_engine/helpers.py + search_engine/nova2.py + search_engine/engines/isohunt.py + search_engine/engines/isohunt.png + search_engine/engines/piratebay.py + search_engine/engines/torrentreactor.py + search_engine/engines/piratebay.png + search_engine/engines/btjunkie.png + search_engine/engines/btjunkie.py + search_engine/engines/torrentreactor.png + search_engine/engines/mininova.png + search_engine/engines/mininova.py + + \ No newline at end of file diff --git a/src/search.ui b/src/search.ui new file mode 100644 index 000000000..0abf5569e --- /dev/null +++ b/src/search.ui @@ -0,0 +1,197 @@ + + + search_engine + + + + 0 + 0 + 820 + 453 + + + + Search + + + + + + + + + 16777215 + 22 + + + + Qt::CustomContextMenu + + + + + + + + + + + 16777215 + 29 + + + + Search + + + + + + + + + + + + 16777215 + 35 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Status: + + + + + + + + 200 + 0 + + + + + 16777215 + 35 + + + + + Sans Serif + 9 + 50 + true + false + false + false + + + + Stopped + + + + + + + Qt::Horizontal + + + + 188 + 21 + + + + + + + + + + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + false + + + Download + + + + + + + Qt::Horizontal + + + + 601 + 20 + + + + + + + + Search engines... + + + + + + + + + + + + + + + search_pattern + returnPressed() + search_button + click() + + + 421 + 37 + + + 685 + 45 + + + + + diff --git a/src/searchEngine.cpp b/src/searchEngine.cpp new file mode 100644 index 000000000..94333406c --- /dev/null +++ b/src/searchEngine.cpp @@ -0,0 +1,533 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "searchEngine.h" +#include "bittorrent.h" +#include "downloadThread.h" +#include "misc.h" +#include "SearchListDelegate.h" + +#define SEARCHHISTORY_MAXSIZE 50 + +/*SEARCH ENGINE START*/ +SearchEngine::SearchEngine(bittorrent *BTSession, QSystemTrayIcon *myTrayIcon, bool systrayIntegration) : QWidget(), BTSession(BTSession), myTrayIcon(myTrayIcon), systrayIntegration(systrayIntegration){ + setupUi(this); + // new qCompleter to the search pattern + startSearchHistory(); + searchCompleter = 0; + createCompleter(); + // Add close tab button + closeTab_button = new QPushButton(); + closeTab_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/tab-close.png"))); + closeTab_button->setFlat(true); + connect(closeTab_button, SIGNAL(clicked()), this, SLOT(closeTab_button_clicked())); + tabWidget->setCornerWidget(closeTab_button); + // Boolean initialization + search_stopped = false; + // Creating Search Process + searchProcess = new QProcess(this); + QStringList env = QProcess::systemEnvironment(); + searchProcess->setEnvironment(env); + connect(searchProcess, SIGNAL(started()), this, SLOT(searchStarted())); + connect(searchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readSearchOutput())); + connect(searchProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(searchFinished(int,QProcess::ExitStatus))); + connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int))); + searchTimeout = new QTimer(this); + searchTimeout->setSingleShot(true); + connect(searchTimeout, SIGNAL(timeout()), this, SLOT(on_search_button_clicked())); + // Update nova.py search plugin if necessary + updateNova(); + supported_engines = new SupportedEngines(); + // Fill in category combobox + fillCatCombobox(); + connect(search_pattern, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayPatternContextMenu(QPoint))); +} + +void SearchEngine::fillCatCombobox() { + comboCategory->clear(); + comboCategory->addItem(full_cat_names["all"], QVariant("all")); + QStringList supported_cat = supported_engines->supportedCategories(); + foreach(QString cat, supported_cat) { + qDebug("Supported category: %s", cat.toLocal8Bit().data()); + comboCategory->addItem(full_cat_names[cat], QVariant(cat)); + } +} + +QString SearchEngine::selectedCategory() const { + return comboCategory->itemData(comboCategory->currentIndex()).toString(); +} + +SearchEngine::~SearchEngine(){ + qDebug("Search destruction"); + // save the searchHistory for later uses + saveSearchHistory(); + searchProcess->kill(); + searchProcess->waitForFinished(); + foreach(QProcess *downloader, downloaders) { + downloader->kill(); + downloader->waitForFinished(); + delete downloader; + } + delete searchTimeout; + delete searchProcess; + delete supported_engines; + if(searchCompleter) + delete searchCompleter; +} + +void SearchEngine::displayPatternContextMenu(QPoint) { + QMenu myMenu(this); + QAction cutAct(QIcon(":/Icons/oxygen/edit-cut.png"), tr("Cut"), &myMenu); + QAction copyAct(QIcon(":/Icons/oxygen/edit-copy.png"), tr("Copy"), &myMenu); + QAction pasteAct(QIcon(":/Icons/oxygen/edit-paste.png"), tr("Paste"), &myMenu); + QAction clearAct(QIcon(":/Icons/oxygen/edit_clear.png"), tr("Clear field"), &myMenu); + QAction clearHistoryAct(QIcon(":/Icons/oxygen/edit-clear.png"), tr("Clear completion history"), &myMenu); + bool hasCopyAct = false; + if(search_pattern->hasSelectedText()) { + myMenu.addAction(&cutAct); + myMenu.addAction(©Act); + hasCopyAct = true; + } + if(qApp->clipboard()->mimeData()->hasText()) { + myMenu.addAction(&pasteAct); + hasCopyAct = true; + } + if(hasCopyAct) + myMenu.addSeparator(); + myMenu.addAction(&clearHistoryAct); + myMenu.addAction(&clearAct); + QAction *act = myMenu.exec(QCursor::pos()); + if(act != 0) { + if(act == &clearHistoryAct) { + searchHistory.clear(); + createCompleter(); + } else if (act == &pasteAct) { + } else if (act == &pasteAct) { + search_pattern->paste(); + } + else if (act == &cutAct) { + search_pattern->cut(); + } + else if (act == ©Act) { + search_pattern->copy(); + } + else if (act == &clearAct) { + search_pattern->clear(); + } + } +} + +void SearchEngine::tab_changed(int t) +{//when we switch from a tab that is not empty to another that is empty the download button + //doesn't have to be available + if(t>-1) + {//-1 = no more tab + if(all_tab.at(tabWidget->currentIndex())->getCurrentSearchListModel()->rowCount()) { + download_button->setEnabled(true); + } else { + download_button->setEnabled(false); + } + } +} + +void SearchEngine::on_enginesButton_clicked() { + engineSelectDlg *dlg = new engineSelectDlg(this, supported_engines); + connect(dlg, SIGNAL(enginesChanged()), this, SLOT(fillCatCombobox())); +} + +// get the last searchs from a QSettings to a QStringList +void SearchEngine::startSearchHistory(){ + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Search"); + searchHistory = settings.value("searchHistory",-1).toStringList(); + settings.endGroup(); +} + +// Save the history list into the QSettings for the next session +void SearchEngine::saveSearchHistory() +{ + QSettings settings("qBittorrent", "qBittorrent"); + settings.beginGroup("Search"); + settings.setValue("searchHistory",searchHistory); + settings.endGroup(); +} + +// Function called when we click on search button +void SearchEngine::on_search_button_clicked(){ + if(searchProcess->state() != QProcess::NotRunning){ + searchProcess->terminate(); + search_stopped = true; + if(searchTimeout->isActive()) { + searchTimeout->stop(); + } + search_button->setText("Search"); + return; + } + QString pattern = search_pattern->text().trimmed(); + // No search pattern entered + if(pattern.isEmpty()){ + QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first")); + return; + } + // Tab Addition + currentSearchTab=new SearchTab(this); + connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int))); + all_tab.append(currentSearchTab); + tabWidget->addTab(currentSearchTab, pattern); + tabWidget->setCurrentWidget(currentSearchTab); + closeTab_button->setEnabled(true); + // if the pattern is not in the pattern + if(searchHistory.indexOf(pattern) == -1){ + //update the searchHistory list + searchHistory.append(pattern); + // verify the max size of the history + if(searchHistory.size() > SEARCHHISTORY_MAXSIZE) + searchHistory = searchHistory.mid(searchHistory.size()/2,searchHistory.size()/2); + createCompleter(); + } + + // Getting checked search engines + QStringList params; + QStringList engineNames; + search_stopped = false; + params << misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2.py"; + params << supported_engines->enginesEnabled().join(","); + qDebug("Search with category: %s", selectedCategory().toLocal8Bit().data()); + params << selectedCategory(); + params << pattern.split(" "); + // Update SearchEngine widgets + no_search_results = true; + nb_search_results = 0; + search_result_line_truncated.clear(); + //on change le texte du label courrant + currentSearchTab->getCurrentLabel()->setText(tr("Results")+" (0):"); + // Launch search + searchProcess->start("python", params, QIODevice::ReadOnly); + searchTimeout->start(180000); // 3min +} + +void SearchEngine::createCompleter() { + if(searchCompleter) + delete searchCompleter; + searchCompleter = new QCompleter(searchHistory, this); + searchCompleter->setCaseSensitivity(Qt::CaseInsensitive); + search_pattern->setCompleter(searchCompleter); +} + +void SearchEngine::propagateSectionResized(int index, int , int newsize) { + foreach(SearchTab * tab, all_tab) { + tab->getCurrentTreeView()->setColumnWidth(index, newsize); + } + saveResultsColumnsWidth(); +} + +void SearchEngine::saveResultsColumnsWidth() { + if(all_tab.size() > 0) { + QTreeView* treeview = all_tab.first()->getCurrentTreeView(); + QSettings settings("qBittorrent", "qBittorrent"); + QStringList width_list; + QStringList new_width_list; + short nbColumns = all_tab.first()->getCurrentSearchListModel()->columnCount(); + + QString line = settings.value("SearchResultsColsWidth", QString()).toString(); + if(!line.isEmpty()) { + width_list = line.split(' '); + } + for(short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { + // load the former width + new_width_list << width_list.at(i); + } else if(treeview->columnWidth(i)>=1) { + // usual case, save the current width + new_width_list << QString::fromUtf8(misc::toString(treeview->columnWidth(i)).c_str()); + } else { + // default width + treeview->resizeColumnToContents(i); + new_width_list << QString::fromUtf8(misc::toString(treeview->columnWidth(i)).c_str()); + } + } + settings.setValue("SearchResultsColsWidth", new_width_list.join(" ")); + } +} + +void SearchEngine::downloadTorrent(QString engine_url, QString torrent_url) { + QProcess *downloadProcess = new QProcess(this); + connect(downloadProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(downloadFinished(int,QProcess::ExitStatus))); + downloaders << downloadProcess; + QStringList params; + params << misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2dl.py"; + params << engine_url; + params << torrent_url; + // Launch search + downloadProcess->start("python", params, QIODevice::ReadOnly); +} + +void SearchEngine::searchStarted(){ + // Update SearchEngine widgets + search_status->setText(tr("Searching...")); + search_status->repaint(); + search_button->setText("Stop"); +} + +// search Qprocess return output as soon as it gets new +// stuff to read. We split it into lines and add each +// line to search results calling appendSearchResult(). +void SearchEngine::readSearchOutput(){ + QByteArray output = searchProcess->readAllStandardOutput(); + output.replace("\r", ""); + QList lines_list = output.split('\n'); + if(!search_result_line_truncated.isEmpty()){ + QByteArray end_of_line = lines_list.takeFirst(); + lines_list.prepend(search_result_line_truncated+end_of_line); + } + search_result_line_truncated = lines_list.takeLast().trimmed(); + foreach(const QByteArray &line, lines_list){ + appendSearchResult(QString::fromUtf8(line)); + } + currentSearchTab->getCurrentLabel()->setText(tr("Results")+QString::fromUtf8(" (")+misc::toQString(nb_search_results)+QString::fromUtf8("):")); +} + +void SearchEngine::downloadFinished(int exitcode, QProcess::ExitStatus) { + QProcess *downloadProcess = (QProcess*)sender(); + if(exitcode == 0) { + QString line = QString::fromUtf8(downloadProcess->readAllStandardOutput()).trimmed(); + QStringList parts = line.split(' '); + if(parts.size() == 2) { + QString path = parts[0]; + QString url = parts[1]; + BTSession->processDownloadedFile(url, path); + } + } + qDebug("Deleting downloadProcess"); + downloaders.removeAll(downloadProcess); + delete downloadProcess; +} + +// Update nova.py search plugin if necessary +void SearchEngine::updateNova() { + qDebug("Updating nova"); + // create search_engine directory if necessary + QDir search_dir(misc::qBittorrentPath()+"search_engine"); + if(!search_dir.exists()){ + search_dir.mkdir(misc::qBittorrentPath()+"search_engine"); + } + QFile package_file(search_dir.path()+QDir::separator()+"__init__.py"); + package_file.open(QIODevice::WriteOnly | QIODevice::Text); + package_file.close(); + if(!search_dir.exists("engines")){ + search_dir.mkdir("engines"); + } + QFile package_file2(search_dir.path()+QDir::separator()+"engines"+QDir::separator()+"__init__.py"); + package_file2.open(QIODevice::WriteOnly | QIODevice::Text); + package_file2.close(); + // Copy search plugin files (if necessary) + QString filePath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2.py"; + if(misc::getPluginVersion(":/search_engine/nova2.py") > misc::getPluginVersion(filePath)) { + if(QFile::exists(filePath)) + QFile::remove(filePath); + QFile::copy(":/search_engine/nova2.py", filePath); + } + // Set permissions + QFile::Permissions perm=QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::ReadGroup; + QFile(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2.py").setPermissions(perm); + + filePath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2dl.py"; + if(misc::getPluginVersion(":/search_engine/nova2dl.py") > misc::getPluginVersion(filePath)) { + if(QFile::exists(filePath)){ + QFile::remove(filePath); + } + QFile::copy(":/search_engine/nova2dl.py", filePath); + } + QFile(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2dl.py").setPermissions(perm); + filePath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"novaprinter.py"; + if(misc::getPluginVersion(":/search_engine/novaprinter.py") > misc::getPluginVersion(filePath)) { + if(QFile::exists(filePath)){ + QFile::remove(filePath); + } + QFile::copy(":/search_engine/novaprinter.py", filePath); + } + QFile(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"novaprinter.py").setPermissions(perm); + filePath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"helpers.py"; + if(misc::getPluginVersion(":/search_engine/helpers.py") > misc::getPluginVersion(filePath)) { + if(QFile::exists(filePath)){ + QFile::remove(filePath); + } + QFile::copy(":/search_engine/helpers.py", filePath); + } + QFile(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"helpers.py").setPermissions(perm); + QString destDir = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator(); + QDir shipped_subDir(":/search_engine/engines/"); + QStringList files = shipped_subDir.entryList(); + foreach(const QString &file, files){ + QString shipped_file = shipped_subDir.path()+"/"+file; + // Copy python classes + if(file.endsWith(".py")) { + if(misc::getPluginVersion(shipped_file) > misc::getPluginVersion(destDir+file) ) { + qDebug("shippped %s is more recent then local plugin, updating", file.toLocal8Bit().data()); + if(QFile::exists(destDir+file)) { + qDebug("Removing old %s", (destDir+file).toLocal8Bit().data()); + QFile::remove(destDir+file); + } + qDebug("%s copied to %s", shipped_file.toLocal8Bit().data(), (destDir+file).toLocal8Bit().data()); + QFile::copy(shipped_file, destDir+file); + } + } else { + // Copy icons + if(file.endsWith(".png")) { + if(!QFile::exists(destDir+file)) { + QFile::copy(shipped_file, destDir+file); + } + } + } + } +} + +// Slot called when search is Finished +// Search can be finished for 3 reasons : +// Error | Stopped by user | Finished normally +void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus){ + QSettings settings("qBittorrent", "qBittorrent"); + bool useNotificationBalloons = settings.value("Preferences/General/NotificationBaloons", true).toBool(); + if(systrayIntegration && useNotificationBalloons) { + myTrayIcon->showMessage(tr("Search Engine"), tr("Search has finished"), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + } + if(exitcode){ + search_status->setText(tr("An error occured during search...")); + }else{ + if(search_stopped){ + search_status->setText(tr("Search aborted")); + }else{ + if(no_search_results){ + search_status->setText(tr("Search returned no results")); + }else{ + search_status->setText(tr("Search has finished")); + } + } + } + if(currentSearchTab) + currentSearchTab->getCurrentLabel()->setText(tr("Results", "i.e: Search results")+QString::fromUtf8(" (")+misc::toQString(nb_search_results)+QString::fromUtf8("):")); + search_button->setText("Search"); + if(searchTimeout->isActive()) { + searchTimeout->stop(); + } +} + +// SLOT to append one line to search results list +// Line is in the following form : +// file url | file name | file size | nb seeds | nb leechers | Search engine url +void SearchEngine::appendSearchResult(QString line){ + QStringList parts = line.split("|"); + if(parts.size() != 6){ + return; + } + + // Add item to search result list + QStandardItemModel *cur_model = currentSearchTab->getCurrentSearchListModel(); + int row = cur_model->rowCount(); + cur_model->insertRow(row); + + cur_model->setData(cur_model->index(row, 5), parts.at(0).trimmed()); // download URL + cur_model->setData(cur_model->index(row, 0), parts.at(1).trimmed()); // Name + cur_model->setData(cur_model->index(row, 1), parts.at(2).trimmed().toLongLong()); // Size + bool ok = false; + qlonglong nb_seeders = parts.at(3).trimmed().toLongLong(&ok); + if(!ok || nb_seeders < 0) { + cur_model->setData(cur_model->index(row, 2), tr("Unknown")); // Seeders + } else { + cur_model->setData(cur_model->index(row, 2), nb_seeders); // Seeders + } + qlonglong nb_leechers = parts.at(4).trimmed().toLongLong(&ok); + if(!ok || nb_leechers < 0) { + cur_model->setData(cur_model->index(row, 3), tr("Unknown")); // Leechers + } else { + cur_model->setData(cur_model->index(row, 3), nb_leechers); // Leechers + } + cur_model->setData(cur_model->index(row, 4), parts.at(5).trimmed()); // Engine URL + + no_search_results = false; + ++nb_search_results; + // Enable clear & download buttons + download_button->setEnabled(true); +} + +// Clear search results list +void SearchEngine::closeTab_button_clicked(){ + if(all_tab.size()) { + qDebug("currentTab rank: %d", tabWidget->currentIndex()); + qDebug("currentSearchTab rank: %d", tabWidget->indexOf(currentSearchTab)); + if(tabWidget->currentIndex() == tabWidget->indexOf(currentSearchTab)) { + qDebug("Deleted current search Tab"); + if(searchProcess->state() != QProcess::NotRunning){ + searchProcess->terminate(); + } + if(searchTimeout->isActive()) { + searchTimeout->stop(); + } + search_stopped = true; + currentSearchTab = 0; + } + delete all_tab.takeAt(tabWidget->currentIndex()); + if(!all_tab.size()) { + closeTab_button->setEnabled(false); + download_button->setEnabled(false); + } + } +} + +// Download selected items in search results list +void SearchEngine::on_download_button_clicked(){ + //QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes(); + QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == NAME){ + // Get Item url + QStandardItemModel *model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListModel(); + QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString(); + QString engine_url = model->data(model->index(index.row(), ENGINE_URL_COLUMN)).toString(); + downloadTorrent(engine_url, torrent_url); + all_tab.at(tabWidget->currentIndex())->setRowColor(index.row(), "red"); + } + } +} diff --git a/src/searchEngine.h b/src/searchEngine.h new file mode 100644 index 000000000..bb30a64b4 --- /dev/null +++ b/src/searchEngine.h @@ -0,0 +1,104 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCH_H +#define SEARCH_H + +#define TIME_TRAY_BALLOON 5000 + +#include +#include +#include +#include +#include "ui_search.h" +#include "engineSelectDlg.h" +#include "SearchTab.h" +#include "supportedEngines.h" + +class bittorrent; +class QSystemTrayIcon; +class downloadThread; +class QTimer; +class SearchEngine; + +class SearchEngine : public QWidget, public Ui::search_engine{ + Q_OBJECT + +private: + // Search related + QProcess *searchProcess; + QList downloaders; + bool search_stopped; + bool no_search_results; + QByteArray search_result_line_truncated; + unsigned long nb_search_results; + QPointer searchCompleter; + QStringList searchHistory; + bittorrent *BTSession; + QSystemTrayIcon *myTrayIcon; + bool systrayIntegration; + SupportedEngines *supported_engines; + QTimer *searchTimeout; + SearchTab *currentSearchTab; + QPushButton *closeTab_button; + QList all_tab; // To store all tabs + const SearchCategories full_cat_names; +public: + SearchEngine(bittorrent *BTSession, QSystemTrayIcon *myTrayIcon, bool systrayIntegration); + ~SearchEngine(); + float getPluginVersion(QString filePath) const; + QString selectedCategory() const; + +public slots: + void on_download_button_clicked(); + void downloadTorrent(QString engine_url, QString torrent_url); + +protected slots: + // Search slots + void tab_changed(int);//to prevent the use of the download button when the tab is empty + void on_search_button_clicked(); + void closeTab_button_clicked(); + void appendSearchResult(QString line); + void searchFinished(int exitcode,QProcess::ExitStatus); + void readSearchOutput(); + void searchStarted(); + void startSearchHistory(); + void updateNova(); + void saveSearchHistory(); + void on_enginesButton_clicked(); + void propagateSectionResized(int index, int oldsize , int newsize); + void saveResultsColumnsWidth(); + void downloadFinished(int exitcode, QProcess::ExitStatus); + void displayPatternContextMenu(QPoint); + void createCompleter(); + void fillCatCombobox(); +}; + +#endif diff --git a/src/search_engine/__init__.py b/src/search_engine/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/search_engine/engines/__init__.py b/src/search_engine/engines/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/search_engine/engines/btjunkie.png b/src/search_engine/engines/btjunkie.png new file mode 100644 index 0000000000000000000000000000000000000000..a3161758079ca0ccee7452294e9945d17c22949c GIT binary patch literal 622 zcmV-!0+IcRP)FyLY`R z6Qf`U*`ahZ)7%6vL3RqlgH}X(C=j|-l2N3W2s*S&6c~{aK^LJ2PpNcmRHrT@rUP+X zlbFgJ8#8rfxZnG9kiE{5-t1JcVG zN|>CQ0-#td{?R&`UHFBH;DI8e%B zwXlK1S+!-M{p@|Y^JqduM7nzV1WmV7_BA!xatDL2#DD6poF9I^Gek=F0468KsdD=< z_EZB9kHu(g^Z}rhs<5F07>3SNC_>{Qf z-r5@44|@nSd-zsZV}E-;rfZ))I6V_(E|~%CHwu&`bar?dyLXY-qXYDxIf|t=IdtL% z{wN@O3a~;b424$SY)w&?)5m30=D^L(03v6T5rt;^(6Zzm6L^&uiymc`@I zCoH9NtgL+}mQ3$Z@y9n+mSy)=SuY~e-QBbO$|AyU5Dtg=2^-y+reRWb_y7O^07*qo IM6N<$g2v?%s{jB1 literal 0 HcmV?d00001 diff --git a/src/search_engine/engines/btjunkie.py b/src/search_engine/engines/btjunkie.py new file mode 100644 index 000000000..23464fd5c --- /dev/null +++ b/src/search_engine/engines/btjunkie.py @@ -0,0 +1,116 @@ +#VERSION: 2.21 +#AUTHORS: Christophe Dumez (chris@qbittorrent.org) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + + +from novaprinter import prettyPrinter +from helpers import retrieve_url, download_file +import sgmllib +import re + +class btjunkie(object): + url = 'http://btjunkie.org' + name = 'btjunkie' + supported_categories = {'all': '0', 'movies': '6', 'tv': '4', 'music': '1', 'games': '2', 'anime': '7', 'software': '3'} + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + def download_torrent(self, info): + print download_file(info) + + class SimpleSGMLParser(sgmllib.SGMLParser): + def __init__(self, results, url, *args): + sgmllib.SGMLParser.__init__(self) + self.url = url + self.th_counter = None + self.current_item = None + self.results = results + + def start_a(self, attr): + params = dict(attr) + #print params + if params.has_key('href') and params['href'].startswith("http://dl.btjunkie.org/torrent"): + self.current_item = {} + self.th_counter = 0 + self.current_item['link']=params['href'].strip() + + def handle_data(self, data): + if self.th_counter == 0: + if not self.current_item.has_key('name'): + self.current_item['name'] = '' + self.current_item['name']+= data.strip() + elif self.th_counter == 3: + if not self.current_item.has_key('size'): + self.current_item['size'] = '' + self.current_item['size']+= data.strip() + elif self.th_counter == 5: + if not self.current_item.has_key('seeds'): + self.current_item['seeds'] = '' + self.current_item['seeds']+= data.strip() + elif self.th_counter == 6: + if not self.current_item.has_key('leech'): + self.current_item['leech'] = '' + self.current_item['leech']+= data.strip() + + def start_th(self,attr): + if isinstance(self.th_counter,int): + self.th_counter += 1 + if self.th_counter > 6: + self.th_counter = None + # Display item + if self.current_item: + self.current_item['engine_url'] = self.url + if not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.results.append('a') + + def search(self, what, cat='all'): + ret = [] + i = 1 + while True and i<11: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + dat = retrieve_url(self.url+'/search?q=%s&c=%s&o=52&p=%d'%(what, self.supported_categories[cat], i)) + # Remove tags from page + p = re.compile( '<[/]?font.*?>') + dat = p.sub('', dat) + #print dat + #return + results_re = re.compile('(?s)class="tab_results">.*') + for match in results_re.finditer(dat): + res_tab = match.group(0) + parser.feed(res_tab) + parser.close() + break + if len(results) <= 0: + break + i += 1 + \ No newline at end of file diff --git a/src/search_engine/engines/isohunt.png b/src/search_engine/engines/isohunt.png new file mode 100644 index 0000000000000000000000000000000000000000..e71fb1ca23ff886c2bd8e656d31034943c8ec568 GIT binary patch literal 633 zcmV-<0*3vGP)K z^Us`Ho5TIH?PpHs)1`i}qMAL&FVE-2=izxC_>UD$tjf@GLIRX-H~ea3Lb}gf$6IG3 zwVIL2c7bp@gQl%>w97?BxkczeG@h3CpS+Q8$EM}qfWe`6>@bvZps5i69e6P^PXB{v ze3%OSG5mQUB7@NcjSbb<$_<6U=wt|!s?zFp;9pvihcDcg=LR0hrC3sL6iuXvrLr9H zI_W*uA#`9R{Z-B_gfN@RXmjmh+8IWO0OlfLa`{cXP8(LUN+uZx zz-%@G0ubc4B-yofdOF<5Eead>7goq>IS%dj5QrpLjHGFD*%`Wb1#d&O02m(g$%{80 zqpAw6UWa}xDad)|s3Q z;IvyYs0OBH!^DyqTn>A|#>?kVh?ftqiSAC9C;+M|EaKMHK2G;^;;P*(KKX(GR9a0% zz06X8zT@q>8q+iY_BpGI0)G1oD$vzjkH=k86d-;bWVJP!+mNWn63hmJ_!saU_r<`@ T=4)dh00000NkvXXu0mjfO$8z7 literal 0 HcmV?d00001 diff --git a/src/search_engine/engines/isohunt.py b/src/search_engine/engines/isohunt.py new file mode 100644 index 000000000..d4c083c51 --- /dev/null +++ b/src/search_engine/engines/isohunt.py @@ -0,0 +1,64 @@ +#VERSION: 1.30 +#AUTHORS: Christophe Dumez (chris@qbittorrent.org) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +from novaprinter import prettyPrinter +import re +from helpers import retrieve_url, download_file + +class isohunt(object): + url = 'http://isohunt.com' + name = 'isoHunt' + supported_categories = {'all': '', 'movies': '1', 'tv': '3', 'music': '2', 'games': '4', 'anime': '7', 'software': '5', 'pictures': '6', 'books': '9'} + + def download_torrent(self, info): + print download_file(info) + + def search(self, what, cat='all'): + i = 1 + while True and i<11: + res = 0 + dat = retrieve_url(self.url+'/torrents.php?ihq=%s&iht=%s&ihp=%s&ihs1=2&iho1=d'%(what, self.supported_categories[cat],i)) + # I know it's not very readable, but the SGML parser feels in pain + section_re = re.compile('(?s)id=link.*?.*?[^/]+).*?' + '>(?P.*?)
    .*?' + '>(?P[\d,\.]+\s+MB).*?' + '>(?P\d+).*?' + '>(?P\d+)') + for match in section_re.finditer(dat): + txt = match.group(0) + m = torrent_re.search(txt) + if m: + torrent_infos = m.groupdict() + torrent_infos['name'] = re.sub('<.*?>', '', torrent_infos['name']) + torrent_infos['engine_url'] = self.url + torrent_infos['link'] = 'http://isohunt.com/download/'+torrent_infos['link'] + prettyPrinter(torrent_infos) + res = res + 1 + if res == 0: + break + i = i + 1 diff --git a/src/search_engine/engines/mininova.png b/src/search_engine/engines/mininova.png new file mode 100644 index 0000000000000000000000000000000000000000..1513376b66dd7e8e99e33b045c9932e0bd827679 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`hdjHqtjR3vpFp8so-U3d7N?I+-s^QZL8NW|v*Xhy zxas(o(i_PTskNYV#cU??zny85}S Ib4q9e09Q_ud;kCd literal 0 HcmV?d00001 diff --git a/src/search_engine/engines/mininova.py b/src/search_engine/engines/mininova.py new file mode 100644 index 000000000..14ed946f7 --- /dev/null +++ b/src/search_engine/engines/mininova.py @@ -0,0 +1,114 @@ +#VERSION: 1.31 +#AUTHORS: Fabien Devaux (fab@gnux.info) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +from novaprinter import prettyPrinter +from helpers import retrieve_url, download_file +from xml.dom import minidom +import re + +class mininova(object): + # Mandatory properties + url = 'http://www.mininova.org' + name = 'Mininova' + supported_categories = {'all': '0', 'movies': '4', 'tv': '8', 'music': '5', 'games': '3', 'anime': '1', 'software': '7', 'pictures': '6', 'books': '2'} + + def download_torrent(self, info): + print download_file(info) + + def search(self, what, cat='all'): + + def get_link(lnk): + lnks = lnk.getElementsByTagName('a') + i = 0 + try: + while not lnks.item(i).attributes.get('href').value.startswith('/get'): + i += 1 + except: + return None + return (self.url+lnks.item(i).attributes.get('href').value).strip() + + def get_name(lnk): + lnks = lnk.getElementsByTagName('a') + i = 0 + try: + while not lnks.item(i).attributes.get('href').value.startswith('/tor'): + i += 1 + except: + return None + name = "" + for node in lnks[i].childNodes: + if node.hasChildNodes(): + name += node.firstChild.toxml() + else: + name += node.toxml() + return name + + def get_text(txt): + if txt.nodeType == txt.TEXT_NODE: + return txt.toxml() + else: + return ''.join([ get_text(n) for n in txt.childNodes]) + + if cat == 'all': + self.table_items = 'added cat name size seeds leech'.split() + else: + self.table_items = 'added name size seeds leech'.split() + page = 1 + while True and page<11: + res = 0 + dat = retrieve_url(self.url+'/search/%s/%s/seeds/%d'%(what, self.supported_categories[cat], page)) + dat = re.sub("4;^@v00062NklX{L z>+380ih8{sDmM-+yCIQCgb>2>JR!t!8~_M{01@~0_Cmpr0EI%~{r&y!?(XH~Wj>!j zJUqO;y*)lYZjZ-q2jw_U5CqTj+U<5U8ufj@)oN*)7W({~2@#*3p29MbNNjt?Vljqc z0H9i}dY*@fyF0OMJDbh!@9zVED2lG@5<&pr`}=z{!(y>e6vg-bu#+syk|ZUQNdUOG zxR7O;=Xn4)K0anymJmXX$K$K3t4^nLaBz@Lr+J=VtyaG8hfz6>qiLF^=}M*2@As$E zDU-=$CX-3{cgy9HVHio0E-x=jrBbn2JUKa8uh)iQsH)oSb~%othQr}tFwiuu*=&A% zd^|rtTb6Zrc$m-UP1AH;_w4NK^z`)W>&rAvLI{P3rfHs^pC^;aTrPKXbQF)rMNtfb zU_PJgx-JMpxm@n`de_(2_xJaJh>qi=QYl4IY}>}4ux(pa)!W-!0GQ2YhzN-2`~GM& vvMdY#1H&+Cwc6+BCn8e6ob=Akh8O+^O42Py1rH4t00000NkvXXu0mjf8w?xe literal 0 HcmV?d00001 diff --git a/src/search_engine/engines/piratebay.py b/src/search_engine/engines/piratebay.py new file mode 100644 index 000000000..98f5da9b2 --- /dev/null +++ b/src/search_engine/engines/piratebay.py @@ -0,0 +1,111 @@ +#VERSION: 1.21 +#AUTHORS: Fabien Devaux (fab@gnux.info) +#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +from novaprinter import prettyPrinter +import sgmllib +from helpers import retrieve_url, download_file + +class piratebay(object): + url = 'http://thepiratebay.org' + name = 'The Pirate Bay' + supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'} + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + def download_torrent(self, info): + print download_file(info) + + class SimpleSGMLParser(sgmllib.SGMLParser): + def __init__(self, results, url, *args): + sgmllib.SGMLParser.__init__(self) + self.td_counter = None + self.current_item = None + self.results = results + self.url = url + self.code = 0 + + def start_a(self, attr): + params = dict(attr) + if params['href'].startswith('/browse'): + self.current_item = {} + self.td_counter = 0 + elif params['href'].startswith('/tor'): + self.code = params['href'].split('/')[2] + elif params['href'].startswith('http://torrents.thepiratebay.org/%s'%self.code): + self.current_item['link']=params['href'].strip() + self.td_counter = self.td_counter+1 + + def handle_data(self, data): + if self.td_counter == 1: + if not self.current_item.has_key('name'): + self.current_item['name'] = '' + self.current_item['name']+= data.strip() + if self.td_counter == 5: + if not self.current_item.has_key('size'): + self.current_item['size'] = '' + self.current_item['size']+= data.strip() + elif self.td_counter == 6: + if not self.current_item.has_key('seeds'): + self.current_item['seeds'] = '' + self.current_item['seeds']+= data.strip() + elif self.td_counter == 7: + if not self.current_item.has_key('leech'): + self.current_item['leech'] = '' + self.current_item['leech']+= data.strip() + + def start_td(self,attr): + if isinstance(self.td_counter,int): + self.td_counter += 1 + if self.td_counter > 7: + self.td_counter = None + # Display item + if self.current_item: + self.current_item['engine_url'] = self.url + if not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.results.append('a') + def search(self, what, cat='all'): + ret = [] + i = 0 + order = 'se' + while True and i<11: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + print self.url+'/search/%s/%u/99/%s' % (what, i, self.supported_categories[cat]) + return + dat = retrieve_url(self.url+'/search/%s/%u/99/%s' % (what, i, self.supported_categories[cat])) + parser.feed(dat) + parser.close() + if len(results) <= 0: + break + i += 1 diff --git a/src/search_engine/engines/torrentreactor.png b/src/search_engine/engines/torrentreactor.png new file mode 100644 index 0000000000000000000000000000000000000000..480c0b32e309093c46a31f61d36771d84dd3987a GIT binary patch literal 529 zcmV+s0`C2ZP)yvXtq_B{tDFBnn1fa}qnW57$ zesqjIep;xSjtQe7HDL4dEi4ubcXu~4?{qre@Auu^J?ZP50mdHHP6c7NCO z`F!pg#}S*&HOu94S7v_0&E~q&+E$I36*Eu`#PNP(9vu`7z-ImjfcV#U!f1#e9g`$U ziC4yf7aNe@KY4WVVh3A4e+3$dR72$*s0KuJuf96#VNae>PZHb=-5yE^QPm}tYg?W5 z3JX`4)RP3ubKD&j5kzF~!bAk_l<9O#t 3: + self.td_counter = None + # add item to results + if self.current_item: + self.current_item['engine_url'] = self.url + if not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.has_results = True + self.results.append('a') + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + def search(self, what, cat='all'): + i = 0 + while True and i<11: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + dat = retrieve_url(self.url+'/search.php?search=&words=%s&cid=%s&sid=&type=2&orderby=a.seeds&asc=0&skip=%s'%(what, self.supported_categories[cat], (i*35))) + parser.feed(dat) + parser.close() + if len(results) <= 0: + break + i += 1 diff --git a/src/search_engine/engines/versions.txt b/src/search_engine/engines/versions.txt new file mode 100644 index 000000000..4dc0186ca --- /dev/null +++ b/src/search_engine/engines/versions.txt @@ -0,0 +1,5 @@ +isohunt: 1.30 +torrentreactor: 1.20 +btjunkie: 2.21 +mininova: 1.31 +piratebay: 1.21 diff --git a/src/search_engine/helpers.py b/src/search_engine/helpers.py new file mode 100644 index 000000000..6d1198d0d --- /dev/null +++ b/src/search_engine/helpers.py @@ -0,0 +1,78 @@ +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +#VERSION: 1.02 + +# Author: +# Christophe DUMEZ (chris@qbittorrent.org) + +import re, htmlentitydefs +import urllib2 +import tempfile +import os + +def htmlentitydecode(s): + # First convert alpha entities (such as é) + # (Inspired from http://mail.python.org/pipermail/python-list/2007-June/443813.html) + def entity2char(m): + entity = m.group(1) + if entity in htmlentitydefs.name2codepoint: + return unichr(htmlentitydefs.name2codepoint[entity]) + return u" " # Unknown entity: We replace with a space. + t = re.sub(u'&(%s);' % u'|'.join(htmlentitydefs.name2codepoint), entity2char, s) + + # Then convert numerical entities (such as é) + t = re.sub(u'&#(\d+);', lambda x: unichr(int(x.group(1))), t) + + # Then convert hexa entities (such as é) + return re.sub(u'&#x(\w+);', lambda x: unichr(int(x.group(1),16)), t) + +def retrieve_url(url): + """ Return the content of the url page as a string """ + req = urllib2.Request(url) + response = urllib2.urlopen(req) + dat = response.read() + info = response.info() + charset = 'utf-8' + try: + ignore, charset = info['Content-Type'].split('charset=') + except: + pass + dat = dat.decode(charset, 'replace') + dat = htmlentitydecode(dat) + return dat.encode('utf-8', 'replace') + +def download_file(url): + """ Download file at url and write it to a file, return the path to the file and the url """ + file, path = tempfile.mkstemp() + file = os.fdopen(file, "wb") + # Download url + req = urllib2.Request(url) + response = urllib2.urlopen(req) + dat = response.read() + # Write it to a file + file.write(dat) + file.close() + # return file path + return path+" "+url diff --git a/src/search_engine/nova2.py b/src/search_engine/nova2.py new file mode 100755 index 000000000..5d75642bb --- /dev/null +++ b/src/search_engine/nova2.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + + +#VERSION: 1.23 + +# Author: +# Fabien Devaux +# Contributors: +# Christophe Dumez (qbittorrent integration) +# Thanks to gab #gcu @ irc.freenode.net (multipage support on PirateBay) +# Thanks to Elias (torrentreactor and isohunt search engines) +# +# Licence: BSD + +import sys +import threading +import os +import glob + +THREADED = True +CATEGORIES = ('all', 'movies', 'tv', 'music', 'games', 'anime', 'software', 'pictures', 'books') + +################################################################################ +# Every engine should have a "search" method taking +# a space-free string as parameter (ex. "family+guy") +# it should call prettyPrinter() with a dict as parameter. +# The keys in the dict must be: link,name,size,seeds,leech,engine_url +# As a convention, try to list results by decrasing number of seeds or similar +################################################################################ + +supported_engines = [] + +engines = glob.glob(os.path.join(os.path.dirname(__file__), 'engines','*.py')) +for engine in engines: + e = engine.split(os.sep)[-1][:-3] + if len(e.strip()) == 0: continue + if e.startswith('_'): continue + try: + exec "from engines.%s import %s"%(e,e) + supported_engines.append(e) + except: + pass + +def engineToXml(short_name): + xml = "<%s>\n"%short_name + exec "engine = %s()"%short_name + xml += "%s\n"%engine.name + xml += "%s\n"%engine.url + xml += "" + if hasattr(engine, 'supported_categories'): + supported_categories = engine.supported_categories.keys() + supported_categories.remove('all') + xml += " ".join(supported_categories) + xml += "\n" + xml += "\n"%short_name + return xml + +def displayCapabilities(): + """ + Display capabilities in XML format + + + long name + http://example.com + movies music games + + + """ + xml = "" + for short_name in supported_engines: + xml += engineToXml(short_name) + xml += "" + print xml + +class EngineLauncher(threading.Thread): + def __init__(self, engine, what, cat='all'): + threading.Thread.__init__(self) + self.engine = engine + self.what = what + self.cat = cat + def run(self): + if hasattr(self.engine, 'supported_categories'): + if self.cat == 'all' or self.cat in self.engine.supported_categories.keys(): + self.engine.search(self.what, self.cat) + elif self.cat == 'all': + self.engine.search(self.what) + +if __name__ == '__main__': + if len(sys.argv) < 2: + raise SystemExit('./nova2.py [all|engine1[,engine2]*] \navailable engines: %s'% + (','.join(supported_engines))) + + if len(sys.argv) == 2: + if sys.argv[1] == "--capabilities": + displayCapabilities() + sys.exit(0) + else: + raise SystemExit('./nova.py [all|engine1[,engine2]*] \navailable engines: %s'% + (','.join(supported_engines))) + + engines_list = [e.lower() for e in sys.argv[1].strip().split(',')] + + if 'all' in engines_list: + engines_list = supported_engines + + cat = sys.argv[2].lower() + + if cat not in CATEGORIES: + raise SystemExit('Invalid category!') + + what = '+'.join(sys.argv[3:]) + + threads = [] + for engine in engines_list: + try: + if THREADED: + exec "l = EngineLauncher(%s(), what, cat)"%engine + threads.append(l) + l.start() + else: + exec "e = %s()"%engine + if hasattr(engine, 'supported_categories'): + if cat == 'all' or cat in e.supported_categories.keys(): + e.search(what, cat) + elif self.cat == 'all': + e.search(what) + engine().search(what, cat) + except: + pass + if THREADED: + for t in threads: + t.join() diff --git a/src/search_engine/nova2dl.py b/src/search_engine/nova2dl.py new file mode 100755 index 000000000..4f505b2dd --- /dev/null +++ b/src/search_engine/nova2dl.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +#VERSION: 1.00 + +# Author: +# Christophe DUMEZ (chris@qbittorrent.org) + +import sys +import os +import glob + +supported_engines = dict() + +engines = glob.glob(os.path.join(os.path.dirname(__file__), 'engines','*.py')) +for engine in engines: + e = engine.split(os.sep)[-1][:-3] + if len(e.strip()) == 0: continue + if e.startswith('_'): continue + try: + exec "from engines.%s import %s"%(e,e) + exec "engine_url = %s.url"%e + supported_engines[engine_url] = e + except: + pass + +if __name__ == '__main__': + if len(sys.argv) < 3: + raise SystemExit('./nova2dl.py engine_url download_parameter') + engine_url = sys.argv[1].strip() + download_param = sys.argv[2].strip() + if engine_url not in supported_engines.keys(): + raise SystemExit('./nova2dl.py: this engine_url was not recognized') + exec "engine = %s()"%supported_engines[engine_url] + engine.download_torrent(download_param) + sys.exit(0) \ No newline at end of file diff --git a/src/search_engine/novaprinter.py b/src/search_engine/novaprinter.py new file mode 100644 index 000000000..5650e58a2 --- /dev/null +++ b/src/search_engine/novaprinter.py @@ -0,0 +1,63 @@ +#VERSION: 1.32 + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +import sys, codecs + +# Force UTF-8 printing +sys.stdout = codecs.getwriter('utf-8')(sys.stdout) + +def prettyPrinter(dictionary): + # Convert everything to unicode for safe printing + for key,value in dictionary.items(): + if isinstance(dictionary[key], str): + dictionary[key] = unicode(dictionary[key], 'utf-8') + dictionary['size'] = anySizeToBytes(dictionary['size']) + print u"%s|%s|%s|%s|%s|%s"%(dictionary['link'],dictionary['name'],dictionary['size'],dictionary['seeds'],dictionary['leech'],dictionary['engine_url']) + +def anySizeToBytes(size_string): + """ + Convert a string like '1 KB' to '1024' (bytes) + """ + # separate integer from unit + try: + size, unit = size_string.split() + except: + try: + size = size_string.strip() + unit = ''.join([c for c in size if c.isalpha()]) + size = size[:-len(unit)] + except: + return -1 + if len(size) == 0: + return -1 + size = float(size) + short_unit = unit.upper()[0] + + # convert + units_dict = { 'T': 40, 'G': 30, 'M': 20, 'K': 10 } + if units_dict.has_key( short_unit ): + size = size * 2**units_dict[short_unit] + return int(size) diff --git a/src/seeding.ui b/src/seeding.ui new file mode 100644 index 000000000..6cf5f042b --- /dev/null +++ b/src/seeding.ui @@ -0,0 +1,159 @@ + + + seeding + + + + 0 + 0 + 811 + 453 + + + + Search + + + + 6 + + + 9 + + + + + Qt::CustomContextMenu + + + QAbstractItemView::ExtendedSelection + + + + + + + + true + + + + <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. + + + + + + + Start + + + + + Pause + + + + + Delete + + + + + Delete Permanently + + + + + Torrent Properties + + + + + Preview file + + + + + Set upload limit + + + + + + :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png + + + Open destination folder + + + + + Name + + + + + Size + + + + + Upload Speed + + + + + Connected peers + + + Connected peers + + + + + Ratio + + + + + + :/Icons/oxygen/wallet.png:/Icons/oxygen/wallet.png + + + Buy it + + + + + + :/Icons/oxygen/gear.png:/Icons/oxygen/gear.png + + + Force recheck + + + + + Total uploaded + + + + + Seeds / Leechers + + + Seeds / Leechers + + + + + Copy magnet link + + + + + + + + diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 000000000..11ee94bc2 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,233 @@ +# Vars +LANG_PATH = lang +ICONS_PATH = Icons + +# Set the following variable to 1 to enable debug +DEBUG_MODE = 0 + +# Global +TEMPLATE = app +TARGET = qbittorrent +CONFIG += qt \ + thread \ + x11 \ + network + +# Update this VERSION for each release +DEFINES += VERSION=\\\"v1.5.3\\\" +DEFINES += VERSION_MAJOR=1 +DEFINES += VERSION_MINOR=5 +DEFINES += VERSION_BUGFIX=3 +!mac:QMAKE_LFLAGS += -Wl,--as-needed +contains(DEBUG_MODE, 1) { + CONFIG += debug + CONFIG -= release + message(Debug build!) +} +contains(DEBUG_MODE, 0) { + CONFIG -= debug + CONFIG += release + DEFINES += QT_NO_DEBUG_OUTPUT + message(Release build!) +} + +# Install +!win32 { + # Binary + exists(../conf.pri) { + include(../conf.pri) + + # Target + target.path = $$BINDIR + INSTALLS += target + } + + # Man page + man.files = ../doc/qbittorrent.1 + man.path = $$PREFIX/share/man/man1/ + INSTALLS += man + + # Menu Icon + menuicon.files = Icons/qBittorrent.desktop + menuicon.path = $$PREFIX/share/applications/ + INSTALLS += menuicon + icon16.files = menuicons/16x16/apps/qbittorrent.png + icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps/ + icon22.files = menuicons/22x22/apps/qbittorrent.png + icon22.path = $$PREFIX/share/icons/hicolor/22x22/apps/ + icon24.files = menuicons/24x24/apps/qbittorrent.png + icon24.path = $$PREFIX/share/icons/hicolor/24x24/apps/ + icon32.files = menuicons/32x32/apps/qbittorrent.png + icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps/ + icon36.files = menuicons/36x36/apps/qbittorrent.png + icon36.path = $$PREFIX/share/icons/hicolor/36x36/apps/ + icon48.files = menuicons/48x48/apps/qbittorrent.png + icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps/ + icon64.files = menuicons/64x64/apps/qbittorrent.png + icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps/ + icon72.files = menuicons/72x72/apps/qbittorrent.png + icon72.path = $$PREFIX/share/icons/hicolor/72x72/apps/ + icon96.files = menuicons/96x96/apps/qbittorrent.png + icon96.path = $$PREFIX/share/icons/hicolor/96x96/apps/ + icon128.files = menuicons/128x128/apps/qbittorrent.png + icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps/ + icon192.files = menuicons/192x192/apps/qbittorrent.png + icon192.path = $$PREFIX/share/icons/hicolor/192x192/apps/ + INSTALLS += icon16 \ + icon22 \ + icon24 \ + icon32 \ + icon36 \ + icon48 \ + icon64 \ + icon72 \ + icon96 \ + icon128 \ + icon192 +} + +# QMAKE_CXXFLAGS_RELEASE += -fwrapv +# QMAKE_CXXFLAGS_DEBUG += -fwrapv +unix:QMAKE_LFLAGS_SHAPP += -rdynamic +CONFIG += link_pkgconfig +PKGCONFIG += "libtorrent-rasterbar libcurl" +QT += network \ + xml +DEFINES += QT_NO_CAST_TO_ASCII + +# QT_NO_CAST_FROM_ASCII +# Windows +# usually built as static +# win32:LIBS += -ltorrent -lcurl -lboost_system +# win32:LIBS += -lz ? +win32:LIBS += -lssl32 \ + -lws2_32 \ + -lwsock32 \ + -ladvapi32 \ + -lwinmm +RESOURCES = icons.qrc \ + lang.qrc \ + search.qrc \ + webui.qrc + +# Translations +TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \ + $$LANG_PATH/qbittorrent_zh.ts \ + $$LANG_PATH/qbittorrent_zh_TW.ts \ + $$LANG_PATH/qbittorrent_en.ts \ + $$LANG_PATH/qbittorrent_ca.ts \ + $$LANG_PATH/qbittorrent_es.ts \ + $$LANG_PATH/qbittorrent_pl.ts \ + $$LANG_PATH/qbittorrent_ko.ts \ + $$LANG_PATH/qbittorrent_de.ts \ + $$LANG_PATH/qbittorrent_nl.ts \ + $$LANG_PATH/qbittorrent_tr.ts \ + $$LANG_PATH/qbittorrent_sv.ts \ + $$LANG_PATH/qbittorrent_el.ts \ + $$LANG_PATH/qbittorrent_ru.ts \ + $$LANG_PATH/qbittorrent_uk.ts \ + $$LANG_PATH/qbittorrent_bg.ts \ + $$LANG_PATH/qbittorrent_it.ts \ + $$LANG_PATH/qbittorrent_sk.ts \ + $$LANG_PATH/qbittorrent_ro.ts \ + $$LANG_PATH/qbittorrent_pt.ts \ + $$LANG_PATH/qbittorrent_nb.ts \ + $$LANG_PATH/qbittorrent_fi.ts \ + $$LANG_PATH/qbittorrent_da.ts \ + $$LANG_PATH/qbittorrent_ja.ts \ + $$LANG_PATH/qbittorrent_hu.ts \ + $$LANG_PATH/qbittorrent_pt_BR.ts \ + $$LANG_PATH/qbittorrent_cs.ts + +# Source code +HEADERS += GUI.h \ + misc.h \ + options_imp.h \ + about_imp.h \ + properties_imp.h \ + createtorrent_imp.h \ + DLListDelegate.h \ + SearchListDelegate.h \ + PropListDelegate.h \ + previewSelect.h \ + PreviewListDelegate.h \ + trackerLogin.h \ + downloadThread.h \ + downloadFromURLImp.h \ + torrentAddition.h \ + bittorrent.h \ + searchEngine.h \ + rss.h \ + rss_imp.h \ + FinishedTorrents.h \ + allocationDlg.h \ + FinishedListDelegate.h \ + qtorrenthandle.h \ + downloadingTorrents.h \ + engineSelectDlg.h \ + pluginSource.h \ + arborescence.h \ + qgnomelook.h \ + realprogressbar.h \ + realprogressbarthread.h \ + qrealarray.h \ + httpserver.h \ + httpconnection.h \ + httprequestparser.h \ + httpresponsegenerator.h \ + json.h \ + eventmanager.h \ + filterParserThread.h \ + TrackersAdditionDlg.h \ + searchTab.h \ + console_imp.h \ + ico.h \ + stacktrace.h \ + torrentPersistentData.h \ + FeedDownloader.h \ + feedList.h \ + supportedEngines.h +FORMS += MainWindow.ui \ + options.ui \ + about.ui \ + properties.ui \ + createtorrent.ui \ + preview.ui \ + login.ui \ + downloadFromURL.ui \ + addTorrentDialog.ui \ + search.ui \ + rss.ui \ + seeding.ui \ + bandwidth_limit.ui \ + download.ui \ + engineSelect.ui \ + pluginSource.ui \ + trackersAdd.ui \ + console.ui \ + FeedDownloader.ui +SOURCES += GUI.cpp \ + main.cpp \ + options_imp.cpp \ + properties_imp.cpp \ + createtorrent_imp.cpp \ + bittorrent.cpp \ + searchEngine.cpp \ + rss_imp.cpp \ + FinishedTorrents.cpp \ + qtorrenthandle.cpp \ + downloadingTorrents.cpp \ + engineSelectDlg.cpp \ + downloadThread.cpp \ + realprogressbar.cpp \ + realprogressbarthread.cpp \ + qrealarray.cpp \ + httpserver.cpp \ + httpconnection.cpp \ + httprequestparser.cpp \ + httpresponsegenerator.cpp \ + eventmanager.cpp \ + SearchTab.cpp \ + ico.cpp \ + rss.cpp +DESTDIR = . diff --git a/src/stacktrace.h b/src/stacktrace.h new file mode 100644 index 000000000..48dfa9b3b --- /dev/null +++ b/src/stacktrace.h @@ -0,0 +1,94 @@ +// stacktrace.h (c) 2008, Timo Bingmann from http://idlebox.net/ +// published under the WTFPL v2.0 + +#ifndef _STACKTRACE_H_ +#define _STACKTRACE_H_ + +#include +#include +#include +#include + +/** Print a demangled stack backtrace of the caller function to FILE* out. */ +static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63) +{ + fprintf(out, "stack trace:\n"); + + // storage array for stack trace address data + void* addrlist[max_frames+1]; + + // retrieve current stack addresses + int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*)); + + if (addrlen == 0) { + fprintf(out, " \n"); + return; + } + + // resolve addresses into strings containing "filename(function+address)", + // this array must be free()-ed + char** symbollist = backtrace_symbols(addrlist, addrlen); + + // allocate string which will be filled with the demangled function name + size_t funcnamesize = 256; + char* funcname = (char*)malloc(funcnamesize); + + // iterate over the returned symbol lines. skip the first, it is the + // address of this function. + for (int i = 2; i < addrlen; i++) + { + char *begin_name = 0, *begin_offset = 0, *end_offset = 0; + + // find parentheses and +address offset surrounding the mangled name: + // ./module(function+0x15c) [0x8048a6d] + //fprintf(out, "%s TT\n", symbollist[i]); + for (char *p = symbollist[i]; *p; ++p) + { + if (*p == '(') + begin_name = p; + else if (*p == '+') + begin_offset = p; + else if (*p == ')' && begin_offset) { + end_offset = p; + break; + } + } + + if (begin_name && begin_offset && end_offset + && begin_name < begin_offset) + { + *begin_name++ = '\0'; + *begin_offset++ = '\0'; + *end_offset = '\0'; + + // mangled name is now in [begin_name, begin_offset) and caller + // offset in [begin_offset, end_offset). now apply + // __cxa_demangle(): + + int status; + char* ret = abi::__cxa_demangle(begin_name, + funcname, &funcnamesize, &status); + if (status == 0) { + funcname = ret; // use possibly realloc()-ed string + fprintf(out, " %s : %s+%s %s\n", + symbollist[i], funcname, begin_offset, ++end_offset); + } + else { + // demangling failed. Output function name as a C function with + // no arguments. + fprintf(out, " %s : %s()+%s %s\n", + symbollist[i], begin_name, begin_offset, ++end_offset); + } + } + else + { + // couldn't parse the line? print the whole line. + fprintf(out, " %s\n", symbollist[i]); + } + } + + free(funcname); + free(symbollist); +} + +#endif // _STACKTRACE_H_ diff --git a/src/supportedEngines.h b/src/supportedEngines.h new file mode 100644 index 000000000..1f3a51d71 --- /dev/null +++ b/src/supportedEngines.h @@ -0,0 +1,175 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCHENGINES_H +#define SEARCHENGINES_H + +#include +#include +#include +#include +#include +#include +#include + +#include "misc.h" + +class SearchCategories: public QObject, public QHash { + Q_OBJECT + +public: + SearchCategories() { + (*this)["all"] = tr("All categories"); + (*this)["movies"] = tr("Movies"); + (*this)["tv"] = tr("TV shows"); + (*this)["music"] = tr("Music"); + (*this)["games"] = tr("Games"); + (*this)["anime"] = tr("Anime"); + (*this)["software"] = tr("Software"); + (*this)["pictures"] = tr("Pictures"); + (*this)["books"] = tr("Books"); + } +}; + +class SupportedEngine { +private: + QString name; + QString full_name; + QString url; + QStringList supported_categories; + bool enabled; + +public: + SupportedEngine(QDomElement engine_elem) { + name = engine_elem.tagName(); + full_name = engine_elem.elementsByTagName("name").at(0).toElement().text(); + url = engine_elem.elementsByTagName("url").at(0).toElement().text(); + supported_categories = engine_elem.elementsByTagName("categories").at(0).toElement().text().split(" "); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QVariantList disabled_engines = settings.value(QString::fromUtf8("SearchEngines/disabledEngines"), QVariantList()).toList(); + enabled = !disabled_engines.contains(QVariant(name)); + } + + QString getName() const { return name; } + QString getUrl() const { return url; } + QString getFullName() const { return full_name; } + QStringList getSupportedCategories() const { return supported_categories; } + bool isEnabled() const { return enabled; } + void setEnabled(bool _enabled) { + enabled = _enabled; + // Save to Hard disk + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QVariantList disabled_engines = settings.value(QString::fromUtf8("SearchEngines/disabledEngines"), QVariantList()).toList(); + if(enabled) { + disabled_engines.removeAll(QVariant(name)); + } else { + disabled_engines.append(QVariant(name)); + } + settings.setValue("SearchEngines/disabledEngines", disabled_engines); + } +}; + +class SupportedEngines: public QObject, public QHash { + Q_OBJECT + +signals: + void newSupportedEngine(QString name); + +public: + SupportedEngines() { + update(); + } + + ~SupportedEngines() { + qDeleteAll(this->values()); + } + + QStringList enginesEnabled() const { + QStringList engines; + foreach(SupportedEngine *engine, values()) { + if(engine->isEnabled()) + engines << engine->getName(); + } + return engines; + } + + QStringList supportedCategories() const { + QStringList supported_cat; + foreach(SupportedEngine *engine, values()) { + if(engine->isEnabled()) { + QStringList s = engine->getSupportedCategories(); + foreach(QString cat, s) { + cat = cat.trimmed(); + if(!cat.isEmpty() && !supported_cat.contains(cat)) + supported_cat << cat; + } + } + } + return supported_cat; + } + +public slots: + void update() { + QProcess nova; + QStringList params; + params << misc::qBittorrentPath()+"search_engine"+QDir::separator()+"nova2.py"; + params << "--capabilities"; + nova.start("python", params, QIODevice::ReadOnly); + nova.waitForStarted(); + nova.waitForFinished(); + QString capabilities = QString(nova.readAll()); + QDomDocument xml_doc; + if(!xml_doc.setContent(capabilities)) { + std::cerr << "Could not parse Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data() << std::endl; + return; + } + QDomElement root = xml_doc.documentElement(); + if(root.tagName() != "capabilities") { + std::cout << "Invalid XML file for Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data() << std::endl; + return; + } + for(QDomNode engine_node = root.firstChild(); !engine_node.isNull(); engine_node = engine_node.nextSibling()) { + QDomElement engine_elem = engine_node.toElement(); + if(!engine_elem.isNull()) { + SupportedEngine *s = new SupportedEngine(engine_elem); + if(this->contains(s->getName())) { + // Already in the list + delete s; + } else { + qDebug("Supported search engine: %s", s->getFullName().toLocal8Bit().data()); + (*this)[s->getName()] = s; + emit newSupportedEngine(s->getName()); + } + } + } + } +}; + +#endif // SEARCHENGINES_H diff --git a/src/torrentAddition.h b/src/torrentAddition.h new file mode 100644 index 000000000..fe295fd8a --- /dev/null +++ b/src/torrentAddition.h @@ -0,0 +1,462 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TORRENTADDITION_H +#define TORRENTADDITION_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "bittorrent.h" +#include "misc.h" +#include "PropListDelegate.h" +#include "ui_addTorrentDialog.h" +#include "arborescence.h" +#include "torrentPersistentData.h" + +using namespace libtorrent; + +class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{ + Q_OBJECT + +private: + bittorrent *BTSession; + QString fileName; + QString hash; + QString filePath; + QString from_url; + QStandardItemModel *PropListModel; + PropListDelegate *PropDelegate; + unsigned int nbFiles; + boost::intrusive_ptr t; + +public: + torrentAdditionDialog(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + BTSession = _BTSession; + // Set Properties list model + PropListModel = new QStandardItemModel(0,5); + PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); + PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); + torrentContentList->setModel(PropListModel); + torrentContentList->hideColumn(PROGRESS); + torrentContentList->hideColumn(INDEX); + PropDelegate = new PropListDelegate(); + torrentContentList->setItemDelegate(PropDelegate); + connect(torrentContentList, SIGNAL(clicked(const QModelIndex&)), torrentContentList, SLOT(edit(const QModelIndex&))); + connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); + connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); + connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); + connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); + connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); + connect(collapseAllButton, SIGNAL(clicked()), torrentContentList, SLOT(collapseAll())); + connect(expandAllButton, SIGNAL(clicked()), torrentContentList, SLOT(expandAll())); + + torrentContentList->header()->resizeSection(0, 200); + //torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch); + QString home = QDir::homePath(); + if(home[home.length()-1] != QDir::separator()){ + home += QDir::separator(); + } + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + savePathTxt->setText(settings.value(QString::fromUtf8("LastDirTorrentAdd"), home+QString::fromUtf8("qBT_dir")).toString()); + if(settings.value("Preferences/Downloads/StartInPause", false).toBool()) { + addInPause->setChecked(true); + addInPause->setEnabled(false); + } + } + + ~torrentAdditionDialog() { + delete PropDelegate; + delete PropListModel; + } + + void showLoad(QString filePath, QString from_url=QString::null){ + if(!QFile::exists(filePath)) { + close(); + return; + } + this->filePath = filePath; + this->from_url = from_url; + // Getting torrent file informations + try { + t = new torrent_info(filePath.toLocal8Bit().data()); + } catch(std::exception&) { + qDebug("Caught error loading torrent"); + if(!from_url.isNull()){ + BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+from_url+QString::fromUtf8("'"), QString::fromUtf8("red")); + QFile::remove(filePath); + }else{ + BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+filePath+QString::fromUtf8("'"), QString::fromUtf8("red")); + } + close(); + return; + } + nbFiles = t->num_files(); + // Setting file name + fileName = misc::toQString(t->name()); + hash = misc::toQString(t->info_hash()); + // Use left() to remove .old extension + QString newFileName; + if(fileName.endsWith(QString::fromUtf8(".old"))){ + newFileName = fileName.left(fileName.size()-4); + }else{ + newFileName = fileName; + } + fileNameLbl->setText(QString::fromUtf8("
    ")+newFileName+QString::fromUtf8("
    ")); + // List files in torrent + arborescence *arb = new arborescence(t); + addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); + delete arb; + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + //torrentContentList->expandAll(); + connect(savePathTxt, SIGNAL(textChanged(QString)), this, SLOT(updateDiskSpaceLabels())); + updateDiskSpaceLabels(); + show(); + } + + void addFilesToTree(const torrent_file *root, QStandardItem *parent) { + QList child; + // Name + QStandardItem *first; + if(root->isDir()) { + first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); + } else { + first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); + } + child << first; + // Size + child << new QStandardItem(misc::toQString(root->getSize())); + // Hidden progress + child << new QStandardItem(""); + // Prio + child << new QStandardItem(misc::toQString(NORMAL)); + // INDEX + child << new QStandardItem(misc::toQString(root->getIndex())); + + // Add the child to the tree + parent->appendRow(child); + + // set row Color + setItemColor(first->index(), "green"); + // Add children + QList children = root->getChildren(); + foreach(const torrent_file *child, children) { + addFilesToTree(child, first); + } + } + +public slots: + + // priority is the new priority of given item + void updateParentsPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) return; + // Check if children have different priorities + // then folder must have NORMAL priority + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY)->text().toInt() != priority) { + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != NORMAL) { + parentPrio->setText(misc::toQString(NORMAL)); + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } + return; + } + } + // All the children have the same priority + // Parent folder should have the same priority too + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != priority) { + parentPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(parentPrio->index(), "red"); + else + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } + } + + void updateChildrenPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + parent = parent->child(item->row()); + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY); + if(childPrio->text().toInt() != priority) { + childPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(childPrio->index(), "red"); + else + setItemColor(childPrio->index(), "green"); + // recursively update children of this child too + updateChildrenPriority(parent->child(i), priority); + } + } + } + + void updatePriorities(QStandardItem *item) { + qDebug("Priority changed"); + // First we disable the signal/slot on item edition + // temporarily so that it doesn't mess with our manual updates + disconnect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + int priority = parent->child(item->row(), PRIORITY)->text().toInt(); + if(priority == IGNORED) + setItemColor(item->index(), "red"); + else + setItemColor(item->index(), "green"); + // Update parents priorities + updateParentsPriority(item, priority); + // If this is not a directory, then there are + // no children to update + if(parent->child(item->row(), INDEX)->text().toInt() == -1) { + // Updating children + qDebug("Priority changed for a folder to %d", priority); + updateChildrenPriority(item, priority); + } + // Reconnect the signal/slot on item edition so that we + // get future updates + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + // Update disk space labels + updateDiskSpaceLabels(); + } + + void updateDiskSpaceLabels() { + long long available = misc::freeDiskSpaceOnPath(savePathTxt->text()); + lbl_disk_space->setText(misc::friendlyUnit(available)); + + // Determine torrent size + unsigned long long torrent_size = 0; + int nbFiles = t->num_files(); + int *priorities = new int[nbFiles]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + for(int i=0; i 0) + torrent_size += t->file_at(i).size; + } + lbl_torrent_size->setText(misc::friendlyUnit(torrent_size)); + // Check if free space is sufficient + if(available > 0) { + if((unsigned long long)available > torrent_size) { + // Space is sufficient + label_space_msg->setText(tr("(%1 left after torrent download)", "e.g. (100MiB left after torrent download)").arg(misc::friendlyUnit(available-torrent_size))); + } else { + // Space is unsufficient + label_space_msg->setText(""+tr("(%1 more are required to download)", "e.g. (100MiB more are required to download)").arg(misc::friendlyUnit(torrent_size-available))+""); + } + } else { + // Available disk space is unknown + label_space_msg->setText(""); + } + } + + void on_browseButton_clicked(){ + QString dir; + QDir saveDir(savePathTxt->text()); + if(saveDir.exists()){ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), savePathTxt->text()); + }else{ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); + } + if(!dir.isNull()){ + savePathTxt->setText(dir); + } + } + + void on_CancelButton_clicked(){ + close(); + } + + // Set the color of a row in data model + void setItemColor(QModelIndex index, QString color){ + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(index.sibling(index.row(), i), QVariant(QColor(color)), Qt::ForegroundRole); + } + } + + bool allFiltered() const { + unsigned int nbRows = PropListModel->rowCount(); + for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) + return false; + } + return true; + } + + void displayFilesListMenu(const QPoint&){ + if(nbFiles == 1) return; + QMenu myFilesLlistMenu(this); + QModelIndex index; + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + myFilesLlistMenu.setTitle(tr("Priority")); + myFilesLlistMenu.addAction(actionIgnored); + myFilesLlistMenu.addAction(actionNormal); + myFilesLlistMenu.addAction(actionHigh); + myFilesLlistMenu.addAction(actionMaximum); + // Call menu + myFilesLlistMenu.exec(QCursor::pos()); + } + + void ignoreSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(IGNORED)); + setItemColor(index, "red"); + } + } + } + + void normalSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(NORMAL)); + setItemColor(index, "green"); + } + } + } + + void highSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(HIGH)); + setItemColor(index, "green"); + } + } + } + + void maximumSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(MAXIMUM)); + setItemColor(index, "green"); + } + } + } + + void getPriorities(QStandardItem *parent, int *priorities) { + unsigned int nbRows = parent->rowCount(); + for(unsigned int i=0; ichild(i, INDEX); + int index = item->text().toInt(); + if(index < 0) { + qDebug("getPriorities(), found a folder, checking its children"); + getPriorities(parent->child(i), priorities); + } else { + item = parent->child(i, PRIORITY); + qDebug("getPriorities(), found priority %d for file at index %d", item->text().toInt(), index); + priorities[index] = item->text().toInt(); + } + } + } + + void savePiecesPriorities(){ + qDebug("Saving pieces priorities"); + int *priorities = new int[nbFiles]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + std::vector vect_prio; + for(unsigned int i=0; itext()); + if(savePathTxt->text().trimmed().isEmpty()){ + QMessageBox::critical(0, tr("Empty save path"), tr("Please enter a save path")); + return; + } + // Check if savePath exists + if(!savePath.exists()){ + if(!savePath.mkpath(savePath.path())){ + QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); + return; + } + } + // Save savepath + TorrentTempData::setSavePath(hash, savePath.path()); + // Save last dir to remember it + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.setValue(QString::fromUtf8("LastDirTorrentAdd"), savePathTxt->text()); + // Create .incremental file if necessary + TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked()); + // Check if there is at least one selected file + if(allFiltered()){ + QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); + return; + } + // save filtered files + savePiecesPriorities(); + // Add to download list + QTorrentHandle h = BTSession->addTorrent(filePath, false, from_url); + if(addInPause->isChecked() && h.is_valid()) + h.pause(); + close(); + } +}; + +#endif diff --git a/src/torrentPersistentData.h b/src/torrentPersistentData.h new file mode 100644 index 000000000..72afc15c7 --- /dev/null +++ b/src/torrentPersistentData.h @@ -0,0 +1,378 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TORRENTPERSISTENTDATA_H +#define TORRENTPERSISTENTDATA_H + +#include +#include +#include +#include + +#include "qtorrenthandle.h" +#include "misc.h" + +class TorrentTempData { +public: + static bool hasTempData(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + return all_data.contains(hash); + } + + static void deleteTempData(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + if(all_data.contains(hash)) { + all_data.remove(hash); + settings.setValue("torrents-tmp", all_data); + } + } + + static void setFilesPriority(QString hash, std::vector pp) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + std::vector::iterator pp_it = pp.begin(); + QVariantList pieces_priority; + while(pp_it != pp.end()) { + pieces_priority << *pp_it; + pp_it++; + } + data["files_priority"] = pieces_priority; + all_data[hash] = data; + settings.setValue("torrents-tmp", all_data); + } + + static void setSavePath(QString hash, QString save_path) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + data["save_path"] = save_path; + all_data[hash] = data; + settings.setValue("torrents-tmp", all_data); + } + + static void setSequential(QString hash, bool sequential) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + data["sequential"] = sequential; + all_data[hash] = data; + settings.setValue("torrents-tmp", all_data); + } + + static bool isSequential(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + if(data.contains("sequential")) + return data["sequential"].toBool(); + return false; + + } + + static QString getSavePath(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + if(data.contains("save_path")) + return data["save_path"].toString(); + qDebug("Warning Temp::getSavePath returns null string!"); + return QString::null; + } + + static QVariantList getFilesPriority(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + if(data.contains("files_priority")) + return data["files_priority"].toList(); + return QVariantList(); + } +}; + +class TorrentPersistentData { +public: + + static bool isKnownTorrent(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + return all_data.contains(hash); + } + + static QStringList knownTorrents() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + return all_data.keys(); + } + + static void deletePersistentData(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + if(all_data.contains(hash)) { + all_data.remove(hash); + settings.setValue("torrents", all_data); + } + } + + static void saveTorrentPersistentData(QTorrentHandle h, bool is_magnet = false) { + Q_ASSERT(h.is_valid()); + qDebug("Saving persistent data for %s", h.hash().toLocal8Bit().data()); + // First, remove temp data + TorrentTempData::deleteTempData(h.hash()); + Q_ASSERT(!TorrentTempData::hasTempData(h.hash())); + // Save persistent data + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data; + data["is_magnet"] = is_magnet; + if(is_magnet) { + data["magnet_uri"] = misc::toQString(make_magnet_uri(h.get_torrent_handle())); + } + data["seed"] = h.is_seed(); + data["priority"] = h.queue_position(); + QVariantList files_priority; + std::vector fp = h.file_priorities(); + std::vector::iterator fp_it = fp.begin(); + while(fp_it != fp.end()) { + files_priority << *fp_it; + fp_it++; + } + data["files_priority"] = files_priority; + data["save_path"] = h.save_path(); + QHash trackers; + std::vector tr = h.trackers(); + std::vector::iterator tr_it = tr.begin(); + while(tr_it != tr.end()) { + trackers[misc::toQString((*tr_it).url)] = (*tr_it).tier; + tr_it++; + } + data["trackers"] = trackers; + if(!is_magnet) { + QVariantList url_seeds; + foreach(QString url_seed, h.url_seeds()) { + url_seeds << url_seed; + } + data["url_seeds"] = url_seeds; + } + // Sequential download + data["sequential"] = h.is_sequential_download(); + // Speed limits + data["up_speed"] = h.upload_limit(); + data["dl_speed"] = h.download_limit(); + // Save data + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + qDebug("TorrentPersistentData: Saving save_path %s, hash: %s", h.save_path().toLocal8Bit().data(), h.hash().toLocal8Bit().data()); + } + + static void saveTrackers(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + QVariantList trackers; + std::vector tr = h.trackers(); + std::vector::iterator tr_it = tr.begin(); + while(tr_it != tr.end()) { + trackers << misc::toQString((*tr_it).url); + tr_it++; + } + data["trackers"] = trackers; + // Save data + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + // Setters + + static void saveFilesPriority(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + std::vector fp = h.file_priorities(); + std::vector::iterator fp_it = fp.begin(); + QVariantList files_priority; + while(fp_it != fp.end()) { + files_priority << *fp_it; + fp_it++; + } + data["files_priority"] = files_priority; + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + static void saveSavePath(QString hash, QString save_path) { + Q_ASSERT(!hash.isEmpty()); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + data["save_path"] = save_path; + all_data[hash] = data; + settings.setValue("torrents", all_data); + qDebug("TorrentPersistentData: Saving save_path: %s, hash: %s", save_path.toLocal8Bit().data(), hash.toLocal8Bit().data()); + } + + static void saveSpeedLimits(QTorrentHandle h) { + Q_ASSERT(!h.hash().isEmpty()); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + data["up_speed"] = h.upload_limit(); + data["dl_speed"] = h.download_limit(); + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + static void saveUrlSeeds(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + QVariantList url_seeds; + foreach(QString url_seed, h.url_seeds()) { + url_seeds << url_seed; + } + data["url_seeds"] = url_seeds; + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + static void savePriority(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + data["priority"] = h.queue_position(); + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + static void saveSeedStatus(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + data["seed"] = h.is_seed(); + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + static void saveSequentialStatus(QTorrentHandle h) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[h.hash()].toHash(); + data["sequential"] = h.is_sequential_download(); + all_data[h.hash()] = data; + settings.setValue("torrents", all_data); + } + + // Getters + static QHash getTrackers(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["trackers"].toHash(); + } + + static QVariantList getFilesPriority(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["files_priority"].toList(); + } + + static int getUploadLimit(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data.value("up_speed", -1).toInt(); + } + + static int getDownloadLimit(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data.value("dl_speed", -1).toInt(); + } + + static QString getSavePath(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + qDebug("TorrentPersistentData: getSavePath %s", data["save_path"].toString().toLocal8Bit().data()); + return data["save_path"].toString(); + } + + static int getPriority(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["priority"].toInt(); + } + + static QVariantList getUrlSeeds(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + if(data.contains("url_seeds")) { + return data["url_seeds"].toList(); + } + return QVariantList(); + } + + static bool isSeed(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["seed"].toBool(); + } + + static bool isMagnet(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["is_magnet"].toBool(); + } + + static QString getMagnetUri(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + Q_ASSERT(data["is_magnet"].toBool()); + return data["magnet_uri"].toString(); + } + + static bool isSequentialDownload(QString hash) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + return data["sequential"].toBool(); + } + +}; +#endif // TORRENTPERSISTENTDATA_H diff --git a/src/trackerLogin.h b/src/trackerLogin.h new file mode 100644 index 000000000..6d94b9511 --- /dev/null +++ b/src/trackerLogin.h @@ -0,0 +1,77 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. 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), 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TRACKERLOGIN_H +#define TRACKERLOGIN_H + +#include +#include +#include +#include "ui_login.h" +#include "qtorrenthandle.h" + +using namespace libtorrent; + +class trackerLogin : public QDialog, private Ui::authentication{ + Q_OBJECT + + private: + QTorrentHandle h; + + public: + trackerLogin(QWidget *parent, QTorrentHandle h): QDialog(parent), h(h){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + login_logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/oxygen/encrypted.png"))); + tracker_url->setText(h.current_tracker()); + connect(this, SIGNAL(trackerLoginCancelled(QPair)), parent, SLOT(addUnauthenticatedTracker(QPair))); + show(); + } + + ~trackerLogin(){} + + signals: + void trackerLoginCancelled(QPair tracker); + + public slots: + void on_loginButton_clicked(){ + // login + h.set_tracker_login(lineUsername->text(), linePasswd->text()); + close(); + } + + void on_cancelButton_clicked(){ + // Emit a signal to GUI to stop asking for authentication + emit trackerLoginCancelled(QPair(h, h.current_tracker())); + close(); + } +}; + +#endif diff --git a/src/trackersAdd.ui b/src/trackersAdd.ui new file mode 100644 index 000000000..363158018 --- /dev/null +++ b/src/trackersAdd.ui @@ -0,0 +1,73 @@ + + TrackersAdditionDlg + + + + 0 + 0 + 367 + 201 + + + + Trackers addition dialog + + + + + + List of trackers to add (one per line): + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + TrackersAdditionDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TrackersAdditionDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/update_qrc_files.py b/src/update_qrc_files.py new file mode 100755 index 000000000..fe6fae412 --- /dev/null +++ b/src/update_qrc_files.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + +# Small script to update qrc files (lang.qrc, icons.qrc) +# by Christophe Dumez + +import os +from os.path import splitext, join + +# update languages files directory +languages_list = [x for x in os.listdir('lang') if x.endswith('.qm')] +output = ''' + +''' +for language in languages_list: + output += ' %s'%('lang'+os.sep+language) + output += os.linesep +output += ''' +''' +lang_file = open('lang.qrc', 'w') +lang_file.write(output) +lang_file.close() + +# update search_engine directory +search_list = [] +for root, dirs, files in os.walk('search_engine'): + for file in files: + if file.startswith("__"): + continue + if splitext(file)[-1] in ('.py', '.png'): + search_list.append(join(root, file)) + +output = ''' + +''' +for file in search_list: + output += ' %s'%(file) + output += os.linesep +output += ''' +''' +search_file = open('search.qrc', 'w') +search_file.write(output) +search_file.close() + +# update icons files directory +icons_list = [] +for root, dirs, files in os.walk('Icons'): + if 'skin_unused' in dirs: + dirs.remove('skin_unused') + for file in files: + if splitext(file)[-1] in ('.png', '.jpg', '.gif'): + icons_list.append(join(root, file)) + +output = ''' + +''' +for icon in icons_list: + output += ' %s'%(icon) + output += os.linesep +output += ''' +''' +icons_file = open('icons.qrc', 'w') +icons_file.write(output) +icons_file.close() + diff --git a/src/webui.qrc b/src/webui.qrc new file mode 100644 index 000000000..36914feb3 --- /dev/null +++ b/src/webui.qrc @@ -0,0 +1,23 @@ + + + webui/index.html + webui/download.html + webui/upload.html + webui/uploadframe.html + webui/about.html + webui/css/mocha.css + webui/css/dynamicTable.css + webui/css/style.css + webui/css/mootabs1.2.css + webui/scripts/excanvas-compressed.js + webui/scripts/mocha.js + webui/scripts/mocha-init.js + webui/scripts/mootools-1.2-core-yc.js + webui/scripts/mootools-1.2-more.js + webui/scripts/dynamicTable.js + webui/scripts/client.js + webui/scripts/download.js + webui/scripts/mootabs1.2.js + webui/scripts/progressbar.js + + diff --git a/src/webui/about.html b/src/webui/about.html new file mode 100644 index 000000000..85247865f --- /dev/null +++ b/src/webui/about.html @@ -0,0 +1,380 @@ + + + + qBittorrent web User Interface + + + + + + + +

    About

    + +

    qBittorrent WebUI version 1.0

    +

    Copyright (c) 2008 by Christopher Dumez

    +

    Homepage : http://www.qbittorrent.com

    + +

    Authors

    + +Name : Ishan Arora
    +Email : ishanarora@gmail.com
    +
    +Name : Ankit Gupta
    +Email : ank.iitd@gmail.com
    +
    +Name : Chandan Shikhar Dua
    +Email : shikhar.ap@gmail.com
    +
    +Name : Swapnil Kumar
    +Email : swapnil.iitd@gmail.com
    + +

    License

    +
    +
    +GNU GENERAL PUBLIC LICENSE
    +
    +Version 2, June 1991
    +Copyright (C) 1989, 1991 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.
    +
    +
    +Preamble
    +The licenses for most software are designed to take away your
    +freedom to share and change it. By contrast, the GNU General Public
    +License is intended to guarantee your freedom to share and change free
    +software--to make sure the software is free for all its users. This
    +General Public License applies to most of the Free Software
    +Foundation's software and to any other program whose authors commit to
    +using it. (Some other Free Software Foundation software is covered by
    +the GNU Library General Public License instead.) You can apply it to
    +your programs, too.
    +
    +When we speak of free software, we are referring to freedom, not
    +price. Our General Public Licenses are designed to make sure that you
    +have the freedom to distribute copies of free software (and charge for
    +this service if you wish), that you receive source code or can get it
    +if you want it, that you can change the software or use pieces of it
    +in new free programs; and that you know you can do these things.
    +
    +To protect your rights, we need to make restrictions that forbid
    +anyone to deny you these rights or to ask you to surrender the rights.
    +These restrictions translate to certain responsibilities for you if you
    +distribute copies of the software, or if you modify it.
    +
    +For example, if you distribute copies of such a program, whether
    +gratis or for a fee, you must give the recipients all the rights that
    +you have. You must make sure that they, too, receive or can get the
    +source code. And you must show them these terms so they know their
    +rights.
    +
    +We protect your rights with two steps: (1) copyright the software, and
    +(2) offer you this license which gives you legal permission to copy,
    +distribute and/or modify the software.
    +
    +Also, for each author's protection and ours, we want to make certain
    +that everyone understands that there is no warranty for this free
    +software. If the software is modified by someone else and passed on, we
    +want its recipients to know that what they have is not the original, so
    +that any problems introduced by others will not reflect on the original
    +authors' reputations.
    +
    +Finally, any free program is threatened constantly by software
    +patents. We wish to avoid the danger that redistributors of a free
    +program will individually obtain patent licenses, in effect making the
    +program proprietary. To prevent this, we have made it clear that any
    +patent must be licensed for everyone's free use or not licensed at all.
    +
    +The precise terms and conditions for copying, distribution and
    +modification follow.
    +
    +
    +GNU GENERAL PUBLIC LICENSE
    +
    +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    +0. This License applies to any program or other work which contains
    +a notice placed by the copyright holder saying it may be distributed
    +under the terms of this General Public License. The 'Program', below,
    +refers to any such program or work, and a 'work based on the Program'
    +means either the Program or any derivative work under copyright law:
    +that is to say, a work containing the Program or a portion of it,
    +either verbatim or with modifications and/or translated into another
    +language. (Hereinafter, translation is included without limitation in
    +the term 'modification'.) Each licensee is addressed as 'you'.
    +
    +Activities other than copying, distribution and modification are not
    +covered by this License; they are outside its scope. The act of
    +running the Program is not restricted, and the output from the Program
    +is covered only if its contents constitute a work based on the
    +Program (independent of having been made by running the Program).
    +Whether that is true depends on what the Program does.
    +
    +1. You may copy and distribute verbatim copies of the Program's
    +source code as you receive it, in any medium, provided that you
    +conspicuously and appropriately publish on each copy an appropriate
    +copyright notice and disclaimer of warranty; keep intact all the
    +notices that refer to this License and to the absence of any warranty;
    +and give any other recipients of the Program a copy of this License
    +along with the Program.
    +
    +You may charge a fee for the physical act of transferring a copy, and
    +you may at your option offer warranty protection in exchange for a fee.
    +
    +2. You may modify your copy or copies of the Program or any portion
    +of it, thus forming a work based on the Program, and copy and
    +distribute such modifications or work under the terms of Section 1
    +above, provided that you also meet all of these conditions:
    +
    +a) You must cause the modified files to carry prominent notices
    +stating that you changed the files and the date of any change.
    +
    +b) You must cause any work that you distribute or publish, that in
    +whole or in part contains or is derived from the Program or any
    +part thereof, to be licensed as a whole at no charge to all third
    +parties under the terms of this License.
    +
    +c) If the modified program normally reads commands interactively
    +when run, you must cause it, when started running for such
    +interactive use in the most ordinary way, to print or display an
    +announcement including an appropriate copyright notice and a
    +notice that there is no warranty (or else, saying that you provide
    +a warranty) and that users may redistribute the program under
    +these conditions, and telling the user how to view a copy of this
    +License. (Exception: if the Program itself is interactive but
    +does not normally print such an announcement, your work based on
    +the Program is not required to print an announcement.)
    +
    +These requirements apply to the modified work as a whole. If
    +identifiable sections of that work are not derived from the Program,
    +and can be reasonably considered independent and separate works in
    +themselves, then this License, and its terms, do not apply to those
    +sections when you distribute them as separate works. But when you
    +distribute the same sections as part of a whole which is a work based
    +on the Program, the distribution of the whole must be on the terms of
    +this License, whose permissions for other licensees extend to the
    +entire whole, and thus to each and every part regardless of who wrote it.
    +
    +Thus, it is not the intent of this section to claim rights or contest
    +your rights to work written entirely by you; rather, the intent is to
    +exercise the right to control the distribution of derivative or
    +collective works based on the Program.
    +
    +In addition, mere aggregation of another work not based on the Program
    +with the Program (or with a work based on the Program) on a volume of
    +a storage or distribution medium does not bring the other work under
    +the scope of this License.
    +
    +3. You may copy and distribute the Program (or a work based on it,
    +under Section 2) in object code or executable form under the terms of
    +Sections 1 and 2 above provided that you also do one of the following:
    +
    +a) Accompany it with the complete corresponding machine-readable
    +source code, which must be distributed under the terms of Sections
    +1 and 2 above on a medium customarily used for software interchange; or,
    +
    +b) Accompany it with a written offer, valid for at least three
    +years, to give any third party, for a charge no more than your
    +cost of physically performing source distribution, a complete
    +machine-readable copy of the corresponding source code, to be
    +distributed under the terms of Sections 1 and 2 above on a medium
    +customarily used for software interchange; or,
    +
    +c) Accompany it with the information you received as to the offer
    +to distribute corresponding source code. (This alternative is
    +allowed only for noncommercial distribution and only if you
    +received the program in object code or executable form with such
    +an offer, in accord with Subsection b above.)
    +
    +The source code for a work means the preferred form of the work for
    +making modifications to it. For an executable work, complete source
    +code means all the source code for all modules it contains, plus any
    +associated interface definition files, plus the scripts used to
    +control compilation and installation of the executable. However, as a
    +special exception, the source code distributed need not include
    +anything that is normally distributed (in either source or binary
    +form) with the major components (compiler, kernel, and so on) of the
    +operating system on which the executable runs, unless that component
    +itself accompanies the executable.
    +
    +If distribution of executable or object code is made by offering
    +access to copy from a designated place, then offering equivalent
    +access to copy the source code from the same place counts as
    +distribution of the source code, even though third parties are not
    +compelled to copy the source along with the object code.
    +
    +4. You may not copy, modify, sublicense, or distribute the Program
    +except as expressly provided under this License. Any attempt
    +otherwise to copy, modify, sublicense or distribute the Program is
    +void, and will automatically terminate your rights under this License.
    +However, parties who have received copies, or rights, from you under
    +this License will not have their licenses terminated so long as such
    +parties remain in full compliance.
    +
    +5. You are not required to accept this License, since you have not
    +signed it. However, nothing else grants you permission to modify or
    +distribute the Program or its derivative works. These actions are
    +prohibited by law if you do not accept this License. Therefore, by
    +modifying or distributing the Program (or any work based on the
    +Program), you indicate your acceptance of this License to do so, and
    +all its terms and conditions for copying, distributing or modifying
    +the Program or works based on it.
    +
    +6. Each time you redistribute the Program (or any work based on the
    +Program), the recipient automatically receives a license from the
    +original licensor to copy, distribute or modify the Program subject to
    +these terms and conditions. You may not impose any further
    +restrictions on the recipients' exercise of the rights granted herein.
    +You are not responsible for enforcing compliance by third parties to
    +this License.
    +
    +7. If, as a consequence of a court judgment or allegation of patent
    +infringement or for any other reason (not limited to patent issues),
    +conditions are imposed on you (whether by court order, agreement or
    +otherwise) that contradict the conditions of this License, they do not
    +excuse you from the conditions of this License. If you cannot
    +distribute so as to satisfy simultaneously your obligations under this
    +License and any other pertinent obligations, then as a consequence you
    +may not distribute the Program at all. For example, if a patent
    +license would not permit royalty-free redistribution of the Program by
    +all those who receive copies directly or indirectly through you, then
    +the only way you could satisfy both it and this License would be to
    +refrain entirely from distribution of the Program.
    +
    +If any portion of this section is held invalid or unenforceable under
    +any particular circumstance, the balance of the section is intended to
    +apply and the section as a whole is intended to apply in other
    +circumstances.
    +
    +It is not the purpose of this section to induce you to infringe any
    +patents or other property right claims or to contest validity of any
    +such claims; this section has the sole purpose of protecting the
    +integrity of the free software distribution system, which is
    +implemented by public license practices. Many people have made
    +generous contributions to the wide range of software distributed
    +through that system in reliance on consistent application of that
    +system; it is up to the author/donor to decide if he or she is willing
    +to distribute software through any other system and a licensee cannot
    +impose that choice.
    +
    +This section is intended to make thoroughly clear what is believed to
    +be a consequence of the rest of this License.
    +
    +8. If the distribution and/or use of the Program is restricted in
    +certain countries either by patents or by copyrighted interfaces, the
    +original copyright holder who places the Program under this License
    +may add an explicit geographical distribution limitation excluding
    +those countries, so that distribution is permitted only in or among
    +countries not thus excluded. In such case, this License incorporates
    +the limitation as if written in the body of this License.
    +
    +9. The Free Software Foundation may publish revised and/or new versions
    +of the General Public License from time to time. Such new versions will
    +be similar in spirit to the present version, but may differ in detail to
    +address new problems or concerns.
    +
    +Each version is given a distinguishing version number. If the Program
    +specifies a version number of this License which applies to it and 'any
    +later version', you have the option of following the terms and conditions
    +either of that version or of any later version published by the Free
    +Software Foundation. If the Program does not specify a version number of
    +this License, you may choose any version ever published by the Free Software
    +Foundation.
    +
    +10. If you wish to incorporate parts of the Program into other free
    +programs whose distribution conditions are different, write to the author
    +to ask for permission. For software which is copyrighted by the Free
    +Software Foundation, write to the Free Software Foundation; we sometimes
    +make exceptions for this. Our decision will be guided by the two goals
    +of preserving the free status of all derivatives of our free software and
    +of promoting the sharing and reuse of software generally.
    +
    +
    +NO WARRANTY
    +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
    +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
    +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
    +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    +REPAIR OR CORRECTION.
    +
    +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    +POSSIBILITY OF SUCH DAMAGES.
    +
    +
    +END OF TERMS AND CONDITIONS
    +
    +How to Apply These Terms to Your New Programs
    +If you develop a new program, and you want it to be of the greatest
    +possible use to the public, the best way to achieve this is to make it
    +free software which everyone can redistribute and change under these terms.
    +
    +To do so, attach the following notices to the program. It is safest
    +to attach them to the start of each source file to most effectively
    +convey the exclusion of warranty; and each file should have at least
    +the 'copyright' line and a pointer to where the full notice is found.
    +
    +
    +Copyright (C) 
    +
    +This program is free software; you can redistribute it and/or modify
    +it under the terms of the GNU General Public License as published by
    +the Free Software Foundation; either version 2 of the License, or
    +(at your option) any later version.
    +
    +This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRANTY; without even the implied warranty of
    +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    +GNU General Public License for more details.
    +
    +You should have received a copy of the GNU General Public License
    +along with this program; if not, write to the Free Software
    +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
    +
    +
    +Also add information on how to contact you by electronic and paper mail.
    +
    +If the program is interactive, make it output a short notice like this
    +when it starts in an interactive mode:
    +
    +Gnomovision version 69, Copyright (C) year name of author
    +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +This is free software, and you are welcome to redistribute it
    +under certain conditions; type `show c' for details.
    +
    +The hypothetical commands `show w' and `show c' should show the appropriate
    +parts of the General Public License. Of course, the commands you use may
    +be called something other than `show w' and `show c'; they could even be
    +mouse-clicks or menu items--whatever suits your program.
    +
    +You should also get your employer (if you work as a programmer) or your
    +school, if any, to sign a 'copyright disclaimer' for the program, if
    +necessary. Here is a sample; alter the names:
    +
    +Yoyodyne, Inc., hereby disclaims all copyright interest in the program
    +`Gnomovision' (which makes passes at compilers) written by James Hacker.
    +
    +'signature of Ty Coon', 1 April 1989
    +Ty Coon, President of Vice
    +
    +This General Public License does not permit incorporating your program into
    +proprietary programs. If your program is a subroutine library, you may
    +consider it more useful to permit linking proprietary applications with the
    +library. If this is what you want to do, use the GNU Library General
    +Public License instead of this License.
    +
    +
    +
    + + diff --git a/src/webui/css/dynamicTable.css b/src/webui/css/dynamicTable.css new file mode 100644 index 000000000..ccef67487 --- /dev/null +++ b/src/webui/css/dynamicTable.css @@ -0,0 +1,43 @@ + + +/************************************************************** + + Dynamic Table + v 0.4 + +**************************************************************/ + +table { + border: 1px solid #ccc; + width: 100%; +} + +th { + background-color: #eee; + padding: 4px; +} + +tr { + background-color: #fff; + padding: 4px; +} + +tr.alt { + background-color: #eee; + padding: 4px; +} + +td { + padding: 0 2px; +} + +tr.selected { + background-color: #354158; + color: #fff; +} + +tr.over { + background-color: #ee6600; + color: #fff; + cursor: pointer; +} diff --git a/src/webui/css/mocha.css b/src/webui/css/mocha.css new file mode 100644 index 000000000..cf853a6c5 --- /dev/null +++ b/src/webui/css/mocha.css @@ -0,0 +1,1030 @@ +/* + +CSS for Mocha UI + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +*/ + +/* Layout +---------------------------------------------------------------- */ + +html, body { + overflow: hidden; +} + +body { + margin: 0; /* Required */ + background: #fff; /* #6989b3 url(../images/splash.gif) center center no-repeat; */ +} + +#desktop { + visibility: hidden; + position: relative; + min-width: 750px; /* Helps keep header content from wrapping */ + height: 100%; + overflow: hidden; + cursor: default; /* Fix for issue in IE7. IE7 wants to use the I-bar text cursor */ +} + +#desktopHeader { + background: #f1f1f1; +} + +#desktopTitlebarWrapper { + position: relative; + height: 45px; + overflow: hidden; + background: #333 url(../images/bg-header.gif) repeat-x; +} + +#desktopTitlebar { + padding: 5px 8px 7px 8px; + background: #f0f0f0; + border-top: 1px solid #fff; + border-bottom: 1px solid #bbb; + height: 25px; +} + +#desktopTitlebar h1.applicationTitle { + /*display: none;*/ + margin: 0; + padding: 4px 0 0 0; + font-size: 18px; + font-weight: bold; + color: #e60; +} + +#desktopTitlebar h1 .version { + font-size: 12px; + color: #333; +} + +#desktopTitlebar h2.tagline { + font-size: 12px; + color: #b2b2b2; + font-weight: bold; + padding: 5px 0 0 0; + text-align: center; +} + +#desktopTitlebar h2.tagline .taglineEm { + color: #fff; + font-weight: bold; +} + +#topNav { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + position: absolute; + right: 0; + top: 0; + color: #b2b2b2; + text-align: right; + padding: 13px 10px 0 0; +} + +#topNav a { + color: #7DD0FA; + font-weight: normal; +} + +#topNav a:hover { + text-decoration: none; +} + +/* Toolboxes */ + +.toolbox { + float: right; + padding: 6px 3px 0 5px; + height: 23px; + overflow: hidden; +} + +div.toolbox.divider { /* Have to specify div here for IE6's sake */ + background: url(../images/toolbox-divider.gif) left center no-repeat; + padding: 6px 3px 0 12px; +} + +div.toolbox.divider2 { /* Have to specify div here for IE6's sake */ + background: url(../images/toolbox-divider2.gif) left center no-repeat; + padding: 6px 4px 0 12px; +} + +.toolbox img { + cursor: pointer; + margin-right: 6px; + padding: 0; + float: left; +} + +.toolbox img.disabled { + cursor: default; +} + +#spinnerWrapper { + width: 16px; + height: 16px; + background: url(../images/spinner-placeholder.gif) no-repeat; + margin-right: 5px; +} + +#spinner { + visibility: hidden; + background: url(../images/spinner.gif) no-repeat; + width: 16px; + height: 16px; +} + +/* Navbar */ + +#desktopNavbar { + padding: 0; + background: #f0f0f0; + border-top: 1px solid #fff; + border-bottom: 1px solid #bbb; + height: 22px; +} + +#desktopNavbar ul { + padding: 0; + margin: 0; + list-style: none; + font-size: 12px; +} + +#desktopNavbar li { + float: left; +} + +#desktopNavbar a { + display: block; +} + +#desktopNavbar ul li a { + padding: 2px 9px 2px 9px; + color: #000; +} + +#desktopNavbar ul li a:hover { + background: #e4e4e4; +} + +#desktopNavbar li ul { + padding: 2px; + border: 1px solid #999; + background: #fff; + position: absolute; + width: 148px; + left: -999em; + z-index: 8000; +} + +#desktopNavbar li ul li { +} + +#desktopNavbar li ul li a { + padding: 1px 9px 1px 9px; + width: 130px; +} + +#desktopNavbar li:hover ul, #desktopNavbar li.ieHover ul { /* lists nested under hovered list items */ + left: auto; +} + +#desktopNavbar li:hover, #desktopNavbar li.hover { + position: static; +} + +#desktopNavbar li:hover { /* For IE7 */ + position: static; +} + +li.divider { + margin-top: 2px; + padding-top: 3px; + border-top: 1px solid #ebebeb; +} + +#pageWrapper { + position: relative; + overflow: hidden; /* This can be set to hidden or auto */ + /*border-top: 1px solid #222;*/ +} + +/* Footer */ +#desktopFooterWrapper { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 30px; + overflow: hidden; + border-top: 1px solid #222; +} + +#desktopFooter { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + height: 24px; + padding: 6px 8px 0 8px; + background: #333; + color: #b2b2b2; +} + +#desktopFooter a { + color: #7DD0FA; + font-weight: normal; +} + +#desktopFooter a:hover { + text-decoration: none; +} + +/* Dock/Taskbar */ + +#dockWrapper { + display: none; + width: 100%; + border-top: 1px solid #222; +} + +#dockWrapper.top { + border: 0; +} + +#dock { + position: relative; + padding: 3px 16px 0 6px; + bottom: 0; + left: 0; + background: #4c4c4c; + min-height: 27px; + height: auto; +} + +*html #dock { + height: 30px; /* Used for IE 6.0 since it does not support min-height */ +} + +.dockTab { + float: left; + position: relative; + font-size: 11px; + width: 150px; + height: 24px; + margin: 0 3px 2px 0; + overflow: hidden; + cursor: pointer; + background: url(../images/dock-tabs.gif) left top no-repeat; +} + +.dockTab.activeDockTab { + background-position: left -24px; +} + +.dockText { + position: absolute; + top: 0; + left: 0; + display: block; + font-weight: normal; + color: #bbb; + text-align: left; + padding: 4px 10px 2px 10px; + width: 130px; + height: 19px; + overflow: hidden; +} + +.dockText:hover { + color: #fff; +} + +.dockTab.activeDockTab .dockText { + color: #fff; +} + +#dockCanvas { + position: absolute; + top: 5px; + right: 3px; + z-index: 2; +} + +#dockPlacement { + position: absolute; + top: 4px; + right: 8px; + width: 10px; + height: 9px; + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + background: #f00; /* for troubleshooting */ + cursor: pointer; + z-index: 3; /* for IE */ + text-align: right; +} + +#dockAutoHide { + position: absolute; + top: 14px; + right: 8px; + width: 10px; + height: 9px; + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + background: #f00; /* for troubleshooting */ + cursor: pointer; + z-index: 3; /* for IE */ +} + +/* Panel Layout +---------------------------------------------------------------- */ + +/* Columns */ + +.column { + position: relative; + float: left; + overflow: hidden; + background: #f1f1f1; +} + +/* Panels */ + +.panel { + position: relative; + overflow: auto; + border-bottom: 1px solid #b9b9b9; + border-top: 0; +} + +.pad { + position: absolute; + top: 0; + left: 0; + padding: 8px; + overflow: hidden; +} + +#mainPanel { + background: #fff; +} + +.panel-header { + position: relative; + background: #f1f1f1 url(../images/bg-panel-header.gif) repeat-x; + height: 30px; + overflow: hidden; + border-bottom: 1px solid #d3d3d3; +} + +.panel-headerContent { + padding-top: 2px; +} + +.panel-headerContent.tabs { + background: url(../images/tabs.gif) repeat-x; + background-position: left -68px; +} + +.panel-header h2 { + display: inline-block; + font-size: 12px; + margin: 0; + padding: 3px 8px 0 8px; + height: 22px; + overflow: hidden; + color: #3f3f3f; +} + +.panel-header-toolbox { + float: right; + height: 26px; + margin: 2px 5px 5px 0; + text-align: right; +} + +.panel-collapse { + background: url(../images/collapse-expand.gif) left top no-repeat; +} + +.panel-expand { + background: url(../images/collapse-expand.gif) left -16px no-repeat; +} + +.icon16 { + margin: 5px 0 0 2px; + cursor: pointer; +} + +.panel-footerWrapper { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + background: #f9f9f9; + height: 30px; + overflow: hidden; + border-top: 1px solid #b9b9b9; +} + +.panel-footer { + padding: 1px 0 0 8px; +} + +.panel-footerContent { + margin-top: 5px; +} + +/* Handles */ + +.horizontalHandle { + height: 4px; + line-height: 1px; + font-size: 1px; + overflow: hidden; + background: #d1d1d1 url(../images/bg-handle-horizontal.gif) repeat-x; +} + +.horizontalHandle.detached .handleIcon { + background: transparent; +} + +.horizontalHandle .handleIcon { + margin: 0 auto; + height: 4px; + line-height: 1px; + font-size: 1px; + overflow: hidden; + background: url(../images/handle-icon-horizontal.gif) center center no-repeat; +} + +.columnHandle { + min-height: 10px; + float: left; + width: 4px; + overflow: hidden; + background: #bbb url(../images/handle-icon.gif) center center no-repeat; + border: 1px solid #9a9a9a; + border-top: 0; +} + +/* Viewport overlays +---------------------------------------------------------------- */ + +#modalOverlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + background: #000; + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + z-index: 10000; +} + +* html #modalOverlay { + position: absolute; +} + +/* Fix for IE6 select z-index issue */ +#modalFix { + display: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + z-index: 9999; +} + +/* Underlay */ + +#windowUnderlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + background: #fff; +} + +* html #windowUnderlay { + position: absolute; +} + +/* Windows +---------------------------------------------------------------- */ + +.mocha { + position: absolute; + top: 0; + left: 0; + display: none; + overflow: hidden; +} + +.mocha.isFocused { +} + +.mochaOverlay { + position: absolute; + top: 0; + left: 0; +} + +.mochaTitlebar { + width: 100%; + overflow: hidden; +} + +.mochaTitlebar h3 { + font-size: 12px; + line-height: 15px; + font-weight: bold; + margin: 5px 10px 4px 12px; + padding: 0; + color: #888; +} + +.mocha.isFocused .mochaTitlebar h3 { + color: #141414; +} + +.mochaToolbarWrapper { + width: 100%; /* For IE */ + position: relative; + height: 29px; + background: #f1f1f1; + overflow: hidden; + border-top: 1px solid #d9d9d9; +} + +div.mochaToolbarWrapper.bottom { + border: 0; + border-bottom: 1px solid #d9d9d9; +} + +#mochaToolbar { + padding: 4px 4px 4px 4px; + background: #f0f0f0; + border-top: 1px solid #fff; + border-bottom: 1px solid #bbb; + height: 40px; + width: 100%; +} + +.mochaToolButton { + padding: 4px 4px 4px 4px; +} + +.mochaContentBorder { + border-top: 1px solid #dadada; + border-bottom: 1px solid #dadada; +} + +.mochaContentWrapper { /* Has a fixed height and scrollbars if required. */ + font-size: 12px; + overflow: auto; +} + +.mochaContent { + padding: 10px 12px; +} + +.mocha .handle { + position: absolute; + background: #0f0; + width: 3px; + height: 3px; + z-index: 2; + opacity: .0; + filter: alpha(opacity=0); + -moz-opacity: .0; + overflow: hidden; + font-size: 1px; /* For IE6 */ +} + +.mocha .corner { /* Corner resize handles */ + background: #f00; + width: 10px; + height: 10px; +} + +.mocha .cornerSE { /* Bottom right resize handle */ + background: #f00; + width: 20px; + height: 20px; +} + +.mochaCanvasHeader { + position: absolute; + top: 0; + left: 0; + background: transparent; + z-index: -1; + display: none; + overflow: hidden; +} + +.mochaControls { + position: absolute; + width: 52px; + top: 8px; + right: 8px; + height: 14px; + z-index: 4; + background: transparent; +} + +.mochaCanvasControls { + position: absolute; + top: 8px; + right: 8px; + z-index: 3; + background: transparent; +} + +/* + To use images for these buttons: + 1. Set the useCanvasControls window option to false. + 2. If you use a different button size you may need to reposition the controls. + Modify the controlsOffset window option. + 2. Add background images to each button. + +*/ +.mochaMinimizeButton, .mochaMaximizeButton, .mochaCloseButton { + float: right; + width: 14px; + height: 14px; + font-size: 1px; + cursor: pointer; + z-index: 4; + background: #f00; + margin-left: 5px; +} + +.mochaMinimizeButton { + margin-left: 0; +} + +.mochaMaximizeButton { +} + +.mochaCloseButton { +} + +.mochaSpinner{ + visibility: hidden; + position: absolute; + bottom: 7px; + left: 6px; + width: 16px; + height: 16px; + background: url(../images/spinner.gif) no-repeat; +} + +.mochaIframe { + width: 100%; +} + +/* Fix for IE6 select z-index issue */ +.zIndexFix { + display: block; + position: absolute; + top: 0; + left: 0; + z-index: -1; + filter: mask(); + width: 100px; + height: 100px; + border: 1px solid transparent; +} + +/* Modals */ + +.modal2 { + border: 8px solid #fff; +} + +.modal2 .mochaContentBorder { + border-width: 0px; +} + +/* Window Themes */ + +.mocha.no-canvas { + background: #f1f1f1; + border: 2px solid #555; +} + +.mocha.no-canvas .mochaTitlebar { + background: #f1f1f1; +} + +.mocha.transparent .mochaTitlebar h3 { + color: #fff; + display: none; +} + +.mocha.notification .mochaTitlebar { + opacity: .0; + filter: alpha(opacity=0); + -moz-opacity: 0; +} + +.mocha.notification .mochaContentBorder { + border-width: 0px; +} + +.mocha.notification .mochaContentWrapper { + text-align: center; + font-size: 12px; + font-weight: bold; +} + +/* Compontents +---------------------------------------------------------------- */ + +/* Toolbar Tabs */ + +.toolbarTabs { + padding: 0 5px 2px 2px; + background: url(../images/tabs.gif) repeat-x; + background-position: left -70px; + overflow: visible; +} + +.tab-menu { + padding-top: 1px; + list-style: none; + margin: 0; + padding: 0; + line-height: 16px; + font-size: 11px; +} + +.tab-menu li { + display: block; + float: left; + margin: 0 0 5px 0; + cursor: pointer; + background: url(../images/tabs.gif) repeat-x; + background-position: left -35px; +} + +.tab-menu li.selected { + background: url(../images/tabs.gif) repeat-x; + background-position: left 0; +} + +.tab-menu li a { + display: block; + margin-left: 8px; + padding: 6px 16px 5px 10px; + text-align: center; + font-weight: normal; + color: #141414; + background: url(../images/tabs.gif) repeat-x; + background-position: right -35px; +} + +.tab-menu li.selected a { + color: #141414; + font-weight: bold; + background: url(../images/tabs.gif) repeat-x; + background-position: right 0; +} + +/* Accordian */ + +.accordianWrapper { + padding: 0; + background: #fff; +} + +.accordianToggler { + margin: 0; + padding: 6px 10px; + background: #f1f1f1 url(../images/bg-panel-header.gif) repeat-x; + font-size: 12px; + cursor: pointer; + border-top: 1px solid #e3e3e3; +} + +.topToggler { + border-top: none; +} + +.accordianToggler.open { + background: #fff url(../images/bg-panel-header.gif) repeat-x; +} + +.accordianContent { + padding: 10px 10px 5px 10px; +} + +/* Sliders */ + +.slider { + clear: both; + position: relative; + font-size: 12px; + font-weight: bold; + width: 200px; + margin-bottom: 15px; +} + +.sliderWrapper { + position: relative; + font-size: 1px; + line-height: 1px; + height: 9px; + width: 222px; +} + +.sliderarea { + position: absolute; + top: 0; + left: 0; + height: 7px; + width: 220px; + font-size: 1px; + line-height: 1px; + background: url(../images/slider-area.gif) repeat-x; + border: 1px solid #a3a3a3; + border-bottom: 1px solid #ccc; + border-left: 1px solid #ccc; + margin: 0; + padding: 0; + overflow: hidden; +} + +.sliderknob { + position: absolute; + top: 0; + left: 0; + height: 9px; + width: 19px; + font-size: 1px; + line-height: 1px; + background: url(../images/knob.gif) no-repeat; + cursor: pointer; + overflow: hidden; + z-index: 2; +} + +.update { + padding-bottom: 5px; +} + +/* Folder Tree */ + +.tree { + font-size: 11px; + line-height: 15px; + margin: 0; +} + +.tree ul { + margin: 0; +} + +.tree li { + list-style-type: none; + white-space: nowrap; +} + +.tree li a { + color: #3f3f3f; +} + +.tree li img { + vertical-align: middle; + width: 18px; + height: 18px; + overflow: hidden; +} + +.tree li span { + padding-left: 2px; +} + +/* View Toggle */ + +.viewToggle { + position: absolute; + top: 4px; + right: 5px; + width: 60px; + text-align: right; +} + +.viewToggle img.viewToggleList, .viewToggle img.viewToggleGrid { + width: 28px; + height: 22px; +} + +.viewToggle img.viewToggleList { + background: url(../images/view-toggle.gif) no-repeat; + background-position: 0 -66px; +} + +.viewToggle img.viewToggleGrid { + background: url(../images/view-toggle.gif) no-repeat; + background-position: 0 0; +} + +/* Miscellaneous +---------------------------------------------------------------- */ + +/* Window Builder Form Elements */ + +#desktop form { + margin: 0 0 0 0; + padding: 5px 0 0 0; +} + +#newWindowForm { + width: 320px; +} + +#desktop .input { + width: 225px; + padding: 1px 0 1px 3px; + border: 1px solid #bbb; +} + +#desktop textarea { + width: 225px; + height: 100px; + padding: 1px 0 1px 3px; + border: 1px solid #bbb; +} + +#desktop .formLabel { + float: left; + text-align: right; + width: 80px; + margin: 0 0 5px 0; +} + +#desktop .formField { + float: right; + margin: 0 0 5px 0; + padding: 0 0 0 0; + width: 230px; +} + +#desktop form .number { + width: 40px; +} + +/* Menus */ + +.menu-right li { + list-style-type: none; + display: inline; + margin: 0 0 0 15px; +} + +/* Notifications */ + +/* Success, error & notice boxes for messages and errors. */ +.error, +.notice, +.success { padding: 8px; margin-bottom: 10px; border: 2px solid #ddd; } +.error { background: #FBE3E4; color: #D12F19; border-color: #FBC2C4; } +.notice { background: #FFF6BF; color: #817134; border-color: #FFD324; } +.success { background: #E6EFC2; color: #529214; border-color: #C6D880; } +.error a { color: #D12F19; } +.notice a { color: #817134; } +.success a { color: #529214; } + + +/* Clears */ + +.clear { + clear: both; + height: 0; +} + +*html .clear { + height: 1%; + font-size: 1px; + line-height: 1px; + overflow: hidden; + visibility: hidden; +} diff --git a/src/webui/css/mootabs1.2.css b/src/webui/css/mootabs1.2.css new file mode 100644 index 000000000..029e1cff9 --- /dev/null +++ b/src/webui/css/mootabs1.2.css @@ -0,0 +1,92 @@ +/* + * MIT License + * Copyright (c) 2008 Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * Original code from http://www.silverscripting.com/mootabs/ + * Edited by Christophe Dumez + */ + +.toolbarTabs { + padding: 0 5px 2px 2px; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left -70px; + overflow: visible; +} + +.mootabs_title { + padding-top: 1px; + list-style: none; + margin: 0; + padding: 0; + line-height: 16px; + font-size: 11px; +} + +.mootabs_title li { + display: block; + float: left; + margin: 0 0 5px 0; + cursor: pointer; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left -35px; + +} + +.mootabs_title li.active { + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left 0; +} + +.mootabs_title li a { + display: block; + margin-left: 8px; + padding: 6px 16px 5px 10px; + text-align: center; + font-weight: normal; + color: #141414; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: right -35px; +} + +.mootabs_title li.active a { + color: #141414; + font-weight: bold; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: right 0; +} + +.mootabs_panel { + display: none; + background-color: #ddd; + position: relative; + width: 100%; + top: -1px; + clear: both; + overflow: auto; + +} + +.mootabs_panel.active { + background-color: #e6e6e6; + display: block; +} \ No newline at end of file diff --git a/src/webui/css/style.css b/src/webui/css/style.css new file mode 100644 index 000000000..e1830fbcf --- /dev/null +++ b/src/webui/css/style.css @@ -0,0 +1,122 @@ +/* Reset */ + +ul,ol,dl,li,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,fieldset,input,object,iframe { margin: 0; padding: 0; } +a img,:link img,:visited img { border: none; } +table { border-collapse: collapse; border-spacing: 0; } +:focus { outline: none; } + +/* Structure */ + +body { + margin: 0; + text-align: left; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 18px; + color: #555; +} + +.aside { + width: 300px; +} + +.invisible { + display: none; +} + +/* Typography */ + +h2, h3, h4 { + margin: 0; + padding: 0 0 5px 0; + font-size: 12px; + font-weight: bold; + color: #333; +} + +h2 { + font-size: 14px; + color: #555; + font-weight: bold; +} + +#mochaPage h3 { + display: block; + font-size: 12px; + padding: 6px 0 6px 0; + margin: 0 0 8px 0; + border-bottom: 1px solid #bbb; +} + +#error_div { + color: #f00; + font-weight: bold; +} + +h4 { + font-size: 11px; +} + +a { + color: #e60; + text-decoration: none; + cursor: pointer; +} + +a:hover { + text-decoration: none; +} + +p { + margin: 0; + padding: 0 0 9px 0; +} + +/* List Elements */ + +ul { + list-style: outside; + margin: 0 0 9px 16px; +} + +dt { + font-weight: bold; + } + +dd { + padding: 0 0 9px 0; +} + +/* Code */ + +pre { + background-color: #f6f6f6; + color: #006600; + display: block; + font-family: 'Courier New', Courier, monospace; + font-size: 11px; + max-height: 250px; + overflow: auto; + margin: 0 0 10px 0; + padding: 10px; + border: 1px solid #d1d7dc; + } + +/* Dividers */ + +hr { + background-color: #ddd; + color: #ccc; + height: 1px; + border: 0px; +} + +.vcenter { + vertical-align: middle; +} + +#urls { + width:90%; + height:100%; +} + diff --git a/src/webui/download.html b/src/webui/download.html new file mode 100644 index 000000000..dfbbd4ca0 --- /dev/null +++ b/src/webui/download.html @@ -0,0 +1,17 @@ + + + + + Download from URL + + + + + + +
    +

    Download Torrents from their URL or Magnet link

    +

    Only one link per line

    Download +
    + + diff --git a/src/webui/index.html b/src/webui/index.html new file mode 100644 index 000000000..dab60ae30 --- /dev/null +++ b/src/webui/index.html @@ -0,0 +1,113 @@ + + + + + qBittorrent web User Interface + + + + + + + + + + + + + + + +
    +
    +
    +

    qBittorrent Web User Interface version 1.3.2

    +
    + +
    + + + + + + + + + + + + +
    +
    +
    +
    + +
    + + + + + + + + + + + + + +
    NameSizeProgressDL SpeedUP SpeedPriority
    +
    +
    + + + + + + + + + + +
    NameSizeUP Speed
    +
    +
    +
    +
    + + diff --git a/src/webui/scripts/client.js b/src/webui/scripts/client.js new file mode 100644 index 000000000..5b07e2b14 --- /dev/null +++ b/src/webui/scripts/client.js @@ -0,0 +1,191 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora , + * Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +myTable = new dynamicTable(); +myTableUP = new dynamicTable(); + +window.addEvent('domready', function(){ + MochaUI.Desktop = new MochaUI.Desktop(); + MochaUI.Desktop.desktop.setStyles({ + 'background': '#fff', + 'visibility': 'visible' + }); + initializeWindows(); + // Tabs + myTabs1 = new mootabs('myTabs', { + width: '100%', + height: '100%' + }); + myTable.setup('myTable', 3); + myTableUP.setup('myTableUP', -1); + var r=0; + var waiting=false; + var stateToImg = function(state){ + switch (state) + { + case 'paused': + return ''; + case 'seeding': + return ''; + case 'checking': + return ''; + case 'downloading': + return ''; + case 'stalled': + return ''; + case 'queued': + return ''; + default: + return ''; + } + return ''; + }; + var round1 = function(val){return Math.round(val*10)/10}; + var fspeed = function(val){return round1(val/1024) + ' KiB/s';}; + var fsize = function(val){ + var units = ['B', 'KiB', 'MiB', 'GiB']; + for(var i=0; i<5; i++){ + if (val < 1024) { + return round1(val) + ' ' + units[i]; + } + val /= 1024; + } + return round1(val) + ' TiB'; + }; + var ajaxfn = function(){ + var queueing_enabled = false; + var url = 'json/events'; + if (!waiting){ + waiting=true; + var request = new Request.JSON({ + url: url, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'qBittorrent client is not reachable'); + waiting=false; + ajaxfn.delay(2000); + }, + onSuccess: function(events) { + $('error_div').set('html', ''); + if(events){ + // Add new torrents or update them + unfinished_hashes = myTable.getRowIds(); + finished_hashes = myTableUP.getRowIds(); + events_hashes = new Array(); + events.each(function(event){ + events_hashes[events_hashes.length] = event.hash; + if(event.seed) { + var row = new Array(); + row.length = 4; + row[0] = stateToImg(event.state); + row[1] = event.name; + row[2] = fsize(event.size); + row[3] = fspeed(event.upspeed); + if(!finished_hashes.contains(event.hash)) { + // New finished torrent + finished_hashes[finished_hashes.length] = event.hash; + myTableUP.insertRow(event.hash, row); + if(unfinished_hashes.contains(event.hash)) { + // Torrent used to be in unfinished list + // Remove it + myTable.removeRow(event.hash); + unfinished_hashes.erase(event.hash); + } + } else { + // Update torrent data + myTableUP.updateRow(event.hash, row); + } + } else { + var row = new Array(); + row.length = 6; + row[0] = stateToImg(event.state); + row[1] = event.name; + row[2] = fsize(event.size); + row[3] = round1(event.progress*100); + row[4] = fspeed(event.dlspeed); + row[5] = fspeed(event.upspeed); + row[6] = event.priority + if(row[6] != -1) + queueing_enabled = true; + if(!unfinished_hashes.contains(event.hash)) { + // New unfinished torrent + unfinished_hashes[unfinished_hashes.length] = event.hash; + myTable.insertRow(event.hash, row); + if(finished_hashes.contains(event.hash)) { + // Torrent used to be in unfinished list + // Remove it + myTableUP.removeRow(event.hash); + finished_hashes.erase(event.hash); + } + } else { + // Update torrent data + myTable.updateRow(event.hash, row); + } + } + }); + // Remove deleted torrents + unfinished_hashes.each(function(hash){ + if(!events_hashes.contains(hash)) { + myTable.removeRow(hash); + } + }); + finished_hashes.each(function(hash){ + if(!events_hashes.contains(hash)) { + myTableUP.removeRow(hash); + } + }); + if(queueing_enabled) { + $('queueingButtons').removeClass('invisible'); + myTable.showPriority(); + } else { + $('queueingButtons').addClass('invisible'); + myTable.hidePriority(); + } + } + waiting=false; + ajaxfn.delay(1000); + } + }).send(); + } + }; + ajaxfn(); +// ajaxfn.periodical(5000); +}); + +// This runs when a person leaves your page. + +window.addEvent('unload', function(){ + if (MochaUI) MochaUI.garbageCleanUp(); +}); + +window.addEvent('keydown', function(event){ + if (event.key == 'a' && event.control) { + event.stop(); + if($("Tab1").hasClass('active')) { + myTable.selectAll(); + } else { + myTableUP.selectAll(); + } + } +}); diff --git a/src/webui/scripts/download.js b/src/webui/scripts/download.js new file mode 100644 index 000000000..a9e395dea --- /dev/null +++ b/src/webui/scripts/download.js @@ -0,0 +1,34 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +window.addEvent('domready', function(){ + $('urls').focus(); + $('downButton').addEvent('click', function(e){ + new Event(e).stop(); + new Request({url: '/command/download', method: 'post', data: {urls: $('urls').value}, + onComplete: function() { + window.parent.document.getElementById('downloadPage').parentNode.removeChild(window.parent.document.getElementById('downloadPage')); + } + }).send(); + }); +}); diff --git a/src/webui/scripts/dynamicTable.js b/src/webui/scripts/dynamicTable.js new file mode 100644 index 000000000..36a7ad469 --- /dev/null +++ b/src/webui/scripts/dynamicTable.js @@ -0,0 +1,234 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora & Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/************************************************************** + + Script : Dynamic Table + Version : 0.5 + Authors : Ishan Arora & Christophe Dumez + Desc : Programable sortable table + Licence : Open Source MIT Licence + +**************************************************************/ + +var dynamicTable = new Class ({ + + initialize: function(){ + }, + + setup: function(table, progressIndex){ + this.table = $(table); + this.rows = new Object(); + this.cur = new Array(); + this.priority_hidden = false; + this.progressIndex = progressIndex; + }, + + altRow: function() + { + var trs = this.table.getElements('tr'); + trs.each(function(el,i){ + if(i % 2){ + el.addClass('alt'); + }else{ + el.removeClass('alt'); + } + }.bind(this)); + }, + + hidePriority: function(){ + if(this.priority_hidden) return; + $('prioHeader').addClass('invisible'); + var trs = this.table.getElements('tr'); + trs.each(function(tr,i){ + var tds = tr.getElements('td'); + tds.getLast().addClass('invisible'); + }.bind(this)); + this.priority_hidden = true; + }, + + showPriority: function(){ + if(!this.priority_hidden) return; + $('prioHeader').removeClass('invisible'); + var trs = this.table.getElements('tr'); + trs.each(function(tr,i){ + var tds = tr.getElements('td'); + tds.getLast().removeClass('invisible'); + }.bind(this)); + this.priority_hidden = false; + }, + + insertRow: function(id, row){ + var tr = this.rows[id]; + if($defined(tr)) + return; + //this.removeRow(id); + var tr = new Element('tr'); + this.rows[id] = tr; + for(var i=0; i endIndex) { + // Backward shift + tmp = beginIndex; + beginIndex = endIndex-1; + endIndex = tmp-1; + } + for(i=beginIndex+1; i<(endIndex+1); i++) { + curID = ids[i]; + this.cur[this.cur.length] = curID; + // Add selected style + temptr = this.rows[curID]; + if(temptr){ + temptr.addClass('selected'); + } + } + } else { + // Simple selection + // Remove selected style from previous ones + for(i=0; i"){var d="/"+a.tagName,e;while((e=a.nextSibling)&&e.tagName!=d){e.removeNode()}if(e){e.removeNode()}}a.parentNode.replaceChild(c,a);return c},initElement:function(a){a=this.q(a);a.getContext=function(){if(this.l){return this.l}return this.l=new K(this)};a.attachEvent("onpropertychange",V);a.attachEvent("onresize", +W);var b=a.attributes;if(b.width&&b.width.specified){a.style.width=b.width.nodeValue+"px"}else{a.width=a.clientWidth}if(b.height&&b.height.specified){a.style.height=b.height.nodeValue+"px"}else{a.height=a.clientHeight}return a}};function V(a){var b=a.srcElement;switch(a.propertyName){case "width":b.style.width=b.attributes.width.nodeValue+"px";b.getContext().clearRect();break;case "height":b.style.height=b.attributes.height.nodeValue+"px";b.getContext().clearRect();break}}function W(a){var b=a.srcElement; +if(b.firstChild){b.firstChild.style.width=b.clientWidth+"px";b.firstChild.style.height=b.clientHeight+"px"}}Q.init();var R=[];for(var E=0;E<16;E++){for(var F=0;F<16;F++){R[E*16+F]=E.toString(16)+F.toString(16)}}function J(){return[[1,0,0],[0,1,0],[0,0,1]]}function G(a,b){var c=J();for(var d=0;d<3;d++){for(var e=0;e<3;e++){var g=0;for(var h=0;h<3;h++){g+=a[d][h]*b[h][e]}c[d][e]=g}}return c}function N(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit= +a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.d=a.d;b.e=a.e}function O(a){var b,c=1;a=String(a);if(a.substring(0,3)=="rgb"){var d=a.indexOf("(",3),e=a.indexOf(")",d+1),g=a.substring(d+1,e).split(",");b="#";for(var h=0;h<3;h++){b+=R[Number(g[h])]}if(g.length==4&&a.substr(3,1)=="a"){c=g[3]}}else{b=a}return[b,c]}function S(a){switch(a){case "butt":return"flat";case "round":return"round"; +case "square":default:return"square"}}function K(a){this.a=J();this.m=[];this.k=[];this.c=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=m*1;this.globalAlpha=1;this.canvas=a;var b=a.ownerDocument.createElement("div");b.style.width=a.clientWidth+"px";b.style.height=a.clientHeight+"px";b.style.overflow="hidden";b.style.position="absolute";a.appendChild(b);this.j=b;this.d=1;this.e=1}var j=K.prototype;j.clearRect=function(){this.j.innerHTML= +"";this.c=[]};j.beginPath=function(){this.c=[]};j.moveTo=function(a,b){this.c.push({type:"moveTo",x:a,y:b});this.f=a;this.g=b};j.lineTo=function(a,b){this.c.push({type:"lineTo",x:a,y:b});this.f=a;this.g=b};j.bezierCurveTo=function(a,b,c,d,e,g){this.c.push({type:"bezierCurveTo",cp1x:a,cp1y:b,cp2x:c,cp2y:d,x:e,y:g});this.f=e;this.g=g};j.quadraticCurveTo=function(a,b,c,d){var e=this.f+0.6666666666666666*(a-this.f),g=this.g+0.6666666666666666*(b-this.g),h=e+(c-this.f)/3,l=g+(d-this.g)/3;this.bezierCurveTo(e, +g,h,l,c,d)};j.arc=function(a,b,c,d,e,g){c*=m;var h=g?"at":"wa",l=a+M(d)*c-A,n=b+L(d)*c-A,o=a+M(e)*c-A,f=b+L(e)*c-A;if(l==o&&!g){l+=0.125}this.c.push({type:h,x:a,y:b,radius:c,xStart:l,yStart:n,xEnd:o,yEnd:f})};j.rect=function(a,b,c,d){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath()};j.strokeRect=function(a,b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.stroke()};j.fillRect=function(a, +b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.fill()};j.createLinearGradient=function(a,b,c,d){var e=new H("gradient");return e};j.createRadialGradient=function(a,b,c,d,e,g){var h=new H("gradientradial");h.n=c;h.o=g;h.i.x=a;h.i.y=b;return h};j.drawImage=function(a,b){var c,d,e,g,h,l,n,o,f=a.runtimeStyle.width,k=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var q=a.width,r=a.height;a.runtimeStyle.width= +f;a.runtimeStyle.height=k;if(arguments.length==3){c=arguments[1];d=arguments[2];h=(l=0);n=(e=q);o=(g=r)}else if(arguments.length==5){c=arguments[1];d=arguments[2];e=arguments[3];g=arguments[4];h=(l=0);n=q;o=r}else if(arguments.length==9){h=arguments[1];l=arguments[2];n=arguments[3];o=arguments[4];c=arguments[5];d=arguments[6];e=arguments[7];g=arguments[8]}else{throw"Invalid number of arguments";}var s=this.b(c,d),t=[],v=10,w=10;t.push(" ','","");this.j.insertAdjacentHTML("BeforeEnd",t.join(""))};j.stroke=function(a){var b=[],c=O(a?this.fillStyle:this.strokeStyle),d=c[0],e=c[1]*this.globalAlpha,g=10,h=10;b.push("n.x){n.x=k.x}if(l.y== +null||k.yn.y){n.y=k.y}}}b.push(' ">');if(typeof this.fillStyle=="object"){var v={x:"50%",y:"50%"},w=n.x-l.x,x=n.y-l.y,p=w>x?w:x;v.x=i(this.fillStyle.i.x/w*100+50)+"%";v.y=i(this.fillStyle.i.y/x*100+50)+"%";var y=[];if(this.fillStyle.p=="gradientradial"){var z=this.fillStyle.n/p*100,B=this.fillStyle.o/p*100-z}else{var z=0,B=100}var C={offset:null,color:null},D={offset:null,color:null};this.fillStyle.h.sort(function(T,U){return T.offset-U.offset});for(var o=0;oC.offset||C.offset==null){C.offset=u.offset;C.color=u.color}if(u.offset')}else if(a){b.push('')}else{b.push("')}b.push("");this.j.insertAdjacentHTML("beforeEnd",b.join(""));this.c=[]};j.fill=function(){this.stroke(true)};j.closePath=function(){this.c.push({type:"close"})};j.b=function(a,b){return{x:m*(a*this.a[0][0]+b*this.a[1][0]+this.a[2][0])-A,y:m*(a*this.a[0][1]+b*this.a[1][1]+this.a[2][1])-A}};j.save=function(){var a={};N(this,a); +this.k.push(a);this.m.push(this.a);this.a=G(J(),this.a)};j.restore=function(){N(this.k.pop(),this);this.a=this.m.pop()};j.translate=function(a,b){var c=[[1,0,0],[0,1,0],[a,b,1]];this.a=G(c,this.a)};j.rotate=function(a){var b=M(a),c=L(a),d=[[b,c,0],[-c,b,0],[0,0,1]];this.a=G(d,this.a)};j.scale=function(a,b){this.d*=a;this.e*=b;var c=[[a,0,0],[0,b,0],[0,0,1]];this.a=G(c,this.a)};j.clip=function(){};j.arcTo=function(){};j.createPattern=function(){return new P};function H(a){this.p=a;this.n=0;this.o= +0;this.h=[];this.i={x:0,y:0}}H.prototype.addColorStop=function(a,b){b=O(b);this.h.push({offset:1-a,color:b})};function P(){}G_vmlCanvasManager=Q;CanvasRenderingContext2D=K;CanvasGradient=H;CanvasPattern=P})()}; diff --git a/src/webui/scripts/mocha-init.js b/src/webui/scripts/mocha-init.js new file mode 100644 index 000000000..cfa58bb78 --- /dev/null +++ b/src/webui/scripts/mocha-init.js @@ -0,0 +1,162 @@ +/* ----------------------------------------------------------------- + + ATTACH MOCHA LINK EVENTS + Notes: Here is where you define your windows and the events that open them. + If you are not using links to run Mocha methods you can remove this function. + + If you need to add link events to links within windows you are creating, do + it in the onContentLoaded function of the new window. + + ----------------------------------------------------------------- */ + +initializeWindows = function(){ + + function addClickEvent(el, fn){ + ['Link','Button'].each(function(item) { + if ($(el+item)){ + $(el+item).addEvent('click', fn); + } + }); + } + + addClickEvent('download', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'downloadPage', + title: 'Download from URLs', + loadMethod: 'iframe', + contentURL:'download.html', + scrollbars: false, + resizable: false, + maximizable: false, + closable: true, + paddingVertical: 0, + paddingHorizontal: 0, + width: 500, + height: 270 + }); + }); + + addClickEvent('upload', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'uploadPage', + title: 'Upload torrent file', + loadMethod: 'iframe', + contentURL:'upload.html', + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 500, + height: 120 + }); + }); + + addClickEvent('delete', function(e){ + new Event(e).stop(); + if($("Tab1").hasClass('active')) { + var h = myTable.selectedIds(); + } else { + var h = myTableUP.selectedIds(); + } + if(h.length && confirm('Are you sure you want to delete the selected item in download list?')) { + h.each(function(item, index){ + new Request({url: '/command/delete', method: 'post', data: {hash: item}}).send(); + }); + } + }); + + addClickEvent('deletePerm', function(e){ + new Event(e).stop(); + if($("Tab1").hasClass('active')) { + var h = myTable.selectedIds(); + } else { + var h = myTableUP.selectedIds(); + } + if(h.length && confirm('Are you sure you want to delete from hard drive the selected item in download list?')) { + h.each(function(item, index){ + new Request({url: '/command/deletePerm', method: 'post', data: {hash: item}}).send(); + }); + } + }); + + ['pause','resume','decreasePrio','increasePrio'].each(function(item) { + addClickEvent(item, function(e){ + new Event(e).stop(); + if($("Tab1").hasClass('active')) { + var h = myTable.selectedIds(); + } else { + if(item=='decreasePrio' || item=='increasePrio') + return; + var h = myTableUP.selectedIds(); + } + if(h.length){ + h.each(function(hash, index){ + new Request({url: '/command/'+item, method: 'post', data: {hash: hash}}).send(); + }); + } + }); + + addClickEvent(item+'All', function(e){ + new Event(e).stop(); + new Request({url: '/command/'+item+'all'}).send(); + }); + }); + + addClickEvent('bug', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'bugPage', + title: 'Report a Bug', + loadMethod: 'iframe', + contentURL: 'http://bugs.qbittorrent.org/', + width: 650, + height: 400 + }); + }); + + addClickEvent('site', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'sitePage', + title: 'qBittorrent Website', + loadMethod: 'iframe', + contentURL: 'http://www.qbittorrent.org/', + width: 650, + height: 400 + }); + }); + + addClickEvent('docs', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'docsPage', + title: 'qBittorrent official wiki', + loadMethod: 'iframe', + contentURL: 'http://wiki.qbittorrent.org/', + width: 650, + height: 400 + }); + }); + + addClickEvent('about', function(e){ + new Event(e).stop(); + new MochaUI.Window({ + id: 'aboutpage', + title: 'About', + loadMethod: 'iframe', + contentURL: 'about.html', + width: 650, + height: 400 + }); + }); + + // Deactivate menu header links + $$('a.returnFalse').each(function(el){ + el.addEvent('click', function(e){ + new Event(e).stop(); + }); + }); +} diff --git a/src/webui/scripts/mocha.js b/src/webui/scripts/mocha.js new file mode 100644 index 000000000..170a7b871 --- /dev/null +++ b/src/webui/scripts/mocha.js @@ -0,0 +1,4593 @@ +/* + +Script: Core.js + MochaUI - A Web Applications User Interface Framework. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Contributors: + - Scott F. Frederick + - Joel Lindau + +Note: + This documentation is taken directly from the javascript source files. It is built using Natural Docs. + +Todo: + Consider making title tooltips optional and using them more often. + +*/ + +var MochaUI = new Hash({ + options: new Hash({ + useEffects: true // Toggles the majority of window fade and move effects. + }), + Columns: { + instances: new Hash() + }, + Panels: { + instances: new Hash() + }, + Windows: { + instances: new Hash(), + indexLevel: 100, // Used for z-Index + windowIDCount: 0, // Used for windows without an ID defined by the user + windowsVisible: true // Ctrl-Alt-Q to toggle window visibility + }, + ieSupport: 'excanvas', // Makes it easier to switch between Excanvas and Moocanvas for testing + focusingWindow: 'false', + /* + + Function: updateContent + Replace the content of a window or panel. + + Arguments: + element - The parent window or panel. + childElement - The child element of the window or panel recieving the content. + title - (string) Change this if you want to change the title of the window or panel. + content - (string or element) An html loadMethod option. + loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html'. + url - Used if loadMethod is set to 'xhr' or 'iframe'. + padding - (object) + + */ + updateContent: function(updateOptions){ + + var options = { + 'element': null, + 'childElement': null, + 'title': null, + 'content': null, + 'loadMethod': null, + 'url': null, + 'padding': null + }; + $extend(options, updateOptions); + + if (!options.element) return; + var element = options.element; + + if (MochaUI.Windows.instances.get(element.id)) { + var recipient = 'window'; + var currentInstance = MochaUI.Windows.instances.get(element.id); + var spinnerEl = currentInstance.spinnerEl; + if (options.title) { + currentInstance.titleEl.set('html', options.title); + } + } + else { + var recipient = 'panel'; + var currentInstance = MochaUI.Panels.instances.get(element.id); + if (options.title) { + currentInstance.titleEl.set('html', options.title); + } + } + + var contentEl = currentInstance.contentEl; + if (options.childElement != null) { + var contentContainer = options.childElement; + } + else { + var contentContainer = currentInstance.contentEl; + } + + var loadMethod = options.loadMethod != null ? options.loadMethod : currentInstance.options.loadMethod; + + // Set scrollbars if loading content in main content container. + // Always use 'hidden' for iframe windows + if (contentContainer == currentInstance.contentEl) { + currentInstance.contentWrapperEl.setStyles({ + 'overflow': currentInstance.options.scrollbars == true && loadMethod != 'iframe' ? 'auto' : 'hidden' + }); + } + + var contentWrapperEl = currentInstance.contentWrapperEl; + + if (options.padding != null) { + contentEl.setStyles({ + 'padding-top': options.padding.top, + 'padding-bottom': options.padding.bottom, + 'padding-left': options.padding.left, + 'padding-right': options.padding.right + }); + } + + // Remove old content. + if (contentContainer == contentEl){ + contentEl.empty(); + } + + // Load new content. + switch(loadMethod){ + case 'xhr': + new Request.HTML({ + url: options.url, + update: contentContainer, + evalScripts: currentInstance.options.evalScripts, + evalResponse: currentInstance.options.evalResponse, + onRequest: function(){ + if (recipient == 'window' && contentContainer == contentEl){ + currentInstance.showSpinner(spinnerEl); + } + else if (recipient == 'panel' && contentContainer == contentEl && $('spinner')){ + $('spinner').setStyle('visibility','visible'); + } + }.bind(this), + onFailure: function(){ + if (contentContainer == contentEl){ + contentContainer.set('html','

    Error Loading XMLHttpRequest

    '); + if (recipient == 'window') { + currentInstance.hideSpinner(spinnerEl); + } + else if (recipient == 'panel' && $('spinner')) { + $('spinner').setStyle('visibility', 'hidden'); + } + } + }.bind(this), + onException: function(){}.bind(this), + onSuccess: function(){ + if (contentContainer == contentEl){ + if (recipient == 'window'){ + currentInstance.hideSpinner(spinnerEl); + } + else if (recipient == 'panel' && $('spinner')){ + $('spinner').setStyle('visibility', 'hidden'); + } + currentInstance.fireEvent('onContentLoaded', element); + } + }.bind(this), + onComplete: function(){}.bind(this) + }).get(); + break; + case 'iframe': // May be able to streamline this if the iframe already exists. + if ( currentInstance.options.contentURL == '' || contentContainer != contentEl) { + break; + } + currentInstance.iframeEl = new Element('iframe', { + 'id': currentInstance.options.id + '_iframe', + 'name': currentInstance.options.id + '_iframe', + 'class': 'mochaIframe', + 'src': options.url, + 'marginwidth': 0, + 'marginheight': 0, + 'frameBorder': 0, + 'scrolling': 'auto', + 'styles': { + 'height': contentWrapperEl.offsetHeight - contentWrapperEl.getStyle('border-top').toInt() - contentWrapperEl.getStyle('border-bottom').toInt(), + 'width': currentInstance.panelEl ? contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('border-left').toInt() - contentWrapperEl.getStyle('border-right').toInt() : '100%' + } + }).injectInside(contentEl); + + // Add onload event to iframe so we can hide the spinner and run onContentLoaded() + currentInstance.iframeEl.addEvent('load', function(e) { + if (recipient == 'window') { + currentInstance.hideSpinner(spinnerEl); + } + else if (recipient == 'panel' && contentContainer == contentEl && $('spinner')) { + $('spinner').setStyle('visibility', 'hidden'); + } + currentInstance.fireEvent('onContentLoaded', element); + }.bind(this)); + if (recipient == 'window') { + currentInstance.showSpinner(spinnerEl); + } + else if (recipient == 'panel' && contentContainer == contentEl && $('spinner')){ + $('spinner').setStyle('visibility', 'visible'); + } + break; + case 'html': + default: + // Need to test injecting elements as content. + var elementTypes = new Array('element', 'textnode', 'whitespace', 'collection'); + if (elementTypes.contains($type(options.content))){ + options.content.inject(contentContainer); + } else { + contentContainer.set('html', options.content); + } + currentInstance.fireEvent('onContentLoaded', element); + break; + } + + }, + /* + + Function: reloadIframe + Reload an iframe. Fixes an issue in Firefox when trying to use location.reload on an iframe that has been destroyed and recreated. + + Arguments: + iframe - This should be both the name and the id of the iframe. + + Syntax: + (start code) + MochaUI.reloadIframe(element); + (end) + + Example: + To reload an iframe from within another iframe: + (start code) + parent.MochaUI.reloadIframe('myIframeName'); + (end) + + */ + reloadIframe: function(iframe){ + if (Browser.Engine.gecko) { + $(iframe).src = $(iframe).src; + } + else { + top.frames[iframe].location.reload(true); + } + }, + collapseToggle: function(windowEl){ + var instances = MochaUI.Windows.instances; + var currentInstance = instances.get(windowEl.id); + var handles = currentInstance.windowEl.getElements('.handle'); + if (currentInstance.isMaximized == true) return; + if (currentInstance.isCollapsed == false) { + currentInstance.isCollapsed = true; + handles.setStyle('display', 'none'); + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'hidden'); + } + currentInstance.contentBorderEl.setStyles({ + visibility: 'hidden', + position: 'absolute', + top: -10000, + left: -10000 + }); + if(currentInstance.toolbarWrapperEl){ + currentInstance.toolbarWrapperEl.setStyles({ + visibility: 'hidden', + position: 'absolute', + top: -10000, + left: -10000 + }); + } + currentInstance.drawWindowCollapsed(windowEl); + } + else { + currentInstance.isCollapsed = false; + currentInstance.drawWindow(windowEl); + currentInstance.contentBorderEl.setStyles({ + visibility: 'visible', + position: null, + top: null, + left: null + }); + if(currentInstance.toolbarWrapperEl){ + currentInstance.toolbarWrapperEl.setStyles({ + visibility: 'visible', + position: null, + top: null, + left: null + }); + } + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + handles.setStyle('display', 'block'); + } + }, + /* + + Function: closeWindow + Closes a window. + + Syntax: + (start code) + MochaUI.closeWindow(); + (end) + + Arguments: + windowEl - the ID of the window to be closed + + Returns: + true - the window was closed + false - the window was not closed + + */ + closeWindow: function(windowEl){ + // Does window exist and is not already in process of closing ? + + var instances = MochaUI.Windows.instances; + var currentInstance = instances.get(windowEl.id); + if (windowEl != $(windowEl) || currentInstance.isClosing) return; + + currentInstance.isClosing = true; + currentInstance.fireEvent('onClose', windowEl); + if (currentInstance.check) currentInstance.check.destroy(); + + if ((currentInstance.options.type == 'modal' || currentInstance.options.type == 'modal2') && Browser.Engine.trident4){ + $('modalFix').setStyle('display', 'none'); + } + + if (MochaUI.options.useEffects == false){ + if (currentInstance.options.type == 'modal' || currentInstance.options.type == 'modal2'){ + $('modalOverlay').setStyle('opacity', 0); + } + MochaUI.closingJobs(windowEl); + return true; + } + else { + // Redraws IE windows without shadows since IE messes up canvas alpha when you change element opacity + if (Browser.Engine.trident) currentInstance.drawWindow(windowEl, false); + if (currentInstance.options.type == 'modal' || currentInstance.options.type == 'modal2'){ + MochaUI.Modal.modalOverlayCloseMorph.start({ + 'opacity': 0 + }); + } + var closeMorph = new Fx.Morph(windowEl, { + duration: 120, + onComplete: function(){ + MochaUI.closingJobs(windowEl); + return true; + }.bind(this) + }); + closeMorph.start({ + 'opacity': .4 + }); + } + + }, + closingJobs: function(windowEl){ + + var instances = MochaUI.Windows.instances; + var currentInstance = instances.get(windowEl.id); + windowEl.setStyle('visibility', 'hidden'); + windowEl.destroy(); + currentInstance.fireEvent('onCloseComplete'); + + if (currentInstance.options.type != 'notification'){ + var newFocus = this.getWindowWithHighestZindex(); + this.focusWindow(newFocus); + } + + instances.erase(currentInstance.options.id); + if (this.loadingWorkspace == true) { + this.windowUnload(); + } + + if (MochaUI.Dock && $(MochaUI.options.dock) && currentInstance.options.type == 'window') { + var currentButton = $(currentInstance.options.id + '_dockTab'); + if (currentButton != null) { + MochaUI.Dock.dockSortables.removeItems(currentButton).destroy(); + } + // Need to resize everything in case the dock becomes smaller when a tab is removed + MochaUI.Desktop.setDesktopSize(); + } + }, + /* + + Function: closeAll + Close all open windows. + + */ + closeAll: function() { + $$('div.mocha').each(function(windowEl){ + this.closeWindow(windowEl); + }.bind(this)); + }, + /* + + Function: toggleWindowVisibility + Toggle window visibility with Ctrl-Alt-Q. + + */ + toggleWindowVisibility: function(){ + MochaUI.Windows.instances.each(function(instance){ + if (instance.options.type == 'modal' || instance.options.type == 'modal2' || instance.isMinimized == true) return; + var id = $(instance.options.id); + if (id.getStyle('visibility') == 'visible'){ + if (instance.iframe){ + instance.iframeEl.setStyle('visibility', 'hidden'); + } + if (instance.toolbarEl){ + instance.toolbarWrapperEl.setStyle('visibility', 'hidden'); + } + instance.contentBorderEl.setStyle('visibility', 'hidden'); + + id.setStyle('visibility', 'hidden'); + MochaUI.Windows.windowsVisible = false; + } + else { + id.setStyle('visibility', 'visible'); + instance.contentBorderEl.setStyle('visibility', 'visible'); + if (instance.iframe){ + instance.iframeEl.setStyle('visibility', 'visible'); + } + if (instance.toolbarEl){ + instance.toolbarWrapperEl.setStyle('visibility', 'visible'); + } + MochaUI.Windows.windowsVisible = true; + } + }.bind(this)); + + }, + focusWindow: function(windowEl, fireEvent){ + + // This is used with blurAll + MochaUI.focusingWindow = 'true'; + var windowClicked = function(){ + MochaUI.focusingWindow = 'false'; + }; + windowClicked.delay(170, this); + + // Only focus when needed + if ($$('.mocha').length == 0) return; + if (windowEl != $(windowEl) || windowEl.hasClass('isFocused')) return; + + var instances = MochaUI.Windows.instances; + var currentInstance = instances.get(windowEl.id); + + if (currentInstance.options.type == 'notification') return; + + MochaUI.Windows.indexLevel += 2; + windowEl.setStyle('zIndex', MochaUI.Windows.indexLevel); + + // Used when dragging and resizing windows + $('windowUnderlay').setStyle('zIndex', MochaUI.Windows.indexLevel - 1).inject($(windowEl),'after'); + + // Fire onBlur for the window that lost focus. + instances.each(function(instance){ + if (instance.windowEl.hasClass('isFocused')){ + instance.fireEvent('onBlur', instance.windowEl); + } + instance.windowEl.removeClass('isFocused'); + }); + + if (MochaUI.Dock && $(MochaUI.options.dock) && currentInstance.options.type == 'window') { + MochaUI.Dock.makeActiveTab(); + } + currentInstance.windowEl.addClass('isFocused'); + + if (fireEvent != false){ + currentInstance.fireEvent('onFocus', windowEl); + } + + }, + getWindowWithHighestZindex: function(){ + this.highestZindex = 0; + $$('div.mocha').each(function(element){ + this.zIndex = element.getStyle('zIndex'); + if (this.zIndex >= this.highestZindex) { + this.highestZindex = this.zIndex; + } + }.bind(this)); + $$('div.mocha').each(function(element){ + if (element.getStyle('zIndex') == this.highestZindex) { + this.windowWithHighestZindex = element; + } + }.bind(this)); + return this.windowWithHighestZindex; + }, + blurAll: function(){ + if (MochaUI.focusingWindow == 'false') { + $$('.mocha').each(function(windowEl){ + var instances = MochaUI.Windows.instances; + var currentInstance = instances.get(windowEl.id); + if (currentInstance.options.type != 'modal' && currentInstance.options.type != 'modal2'){ + windowEl.removeClass('isFocused'); + } + }); + $$('div.dockTab').removeClass('activeDockTab'); + } + }, + roundedRect: function(ctx, x, y, width, height, radius, rgb, a){ + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + }, + triangle: function(ctx, x, y, width, height, rgb, a){ + ctx.beginPath(); + ctx.moveTo(x + width, y); + ctx.lineTo(x, y + height); + ctx.lineTo(x + width, y + height); + ctx.closePath(); + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.fill(); + }, + circle: function(ctx, x, y, diameter, rgb, a){ + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.arc(x, y, diameter, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.fill(); + }, + /* + + Function: centerWindow + Center a window in it's container. If windowEl is undefined it will center the window that has focus. + + */ + centerWindow: function(windowEl){ + + if(!windowEl){ + MochaUI.Windows.instances.each(function(instance){ + if (instance.windowEl.hasClass('isFocused')){ + windowEl = instance.windowEl; + } + }); + } + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + var options = currentInstance.options; + var dimensions = options.container.getCoordinates(); + var windowPosTop = (dimensions.height * .5) - ((options.height + currentInstance.headerFooterShadow) * .5); + if (windowPosTop < 0) { + windowPosTop = 0; + } + var windowPosLeft = (dimensions.width * .5) - (options.width * .5); + if (windowPosLeft < 0) { + windowPosLeft = 0; + } + if (MochaUI.options.useEffects == true){ + currentInstance.morph.start({ + 'top': windowPosTop, + 'left': windowPosLeft + }); + } + else { + windowEl.setStyles({ + 'top': windowPosTop, + 'left': windowPosLeft + }); + } + }, + notification: function(message){ + new MochaUI.Window({ + loadMethod: 'html', + closeAfter: 1500, + type: 'notification', + addClass: 'notification', + content: message, + width: 220, + height: 40, + y: 53, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + bodyBgColor: [255, 255, 255] + }); + }, + /* + + Function: dynamicResize + Use with a timer to resize a window as the window's content size changes, such as with an accordian. + + */ + dynamicResize: function(windowEl){ + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + var contentWrapperEl = currentInstance.contentWrapperEl; + var contentEl = currentInstance.contentEl; + + contentWrapperEl.setStyle('height', contentEl.offsetHeight); + contentWrapperEl.setStyle('width', contentEl.offsetWidth); + currentInstance.drawWindow(windowEl); + }, + /* + + Function: garbageCleanUp + Empties all windows of their children, and removes and garbages the windows. It is does not trigger onClose() or onCloseComplete(). This is useful to clear memory before the pageUnload. + + Syntax: + (start code) + MochaUI.garbageCleanUp(); + (end) + + */ + garbageCleanUp: function(){ + $$('div.mocha').each(function(el){ + el.destroy(); + }.bind(this)); + }, + /* + + The underlay is inserted directly under windows when they are being dragged or resized + so that the cursor is not captured by iframes or other plugins (such as Flash) + underneath the window. + + */ + underlayInitialize: function(){ + var windowUnderlay = new Element('div', { + 'id': 'windowUnderlay', + 'styles': { + 'height': parent.getCoordinates().height, + 'opacity': .01, + 'display': 'none' + } + }).inject(document.body); + }, + setUnderlaySize: function(){ + $('windowUnderlay').setStyle('height', parent.getCoordinates().height); + } +}); + +/* + +function: fixPNG + Bob Osola's PngFix for IE6. + +example: + (begin code) + foo + (end) + +note: + You must have the image height and width attributes specified in the markup. + +*/ + +function fixPNG(myImage){ + if (Browser.Engine.trident4 && document.body.filters){ + var imgID = (myImage.id) ? "id='" + myImage.id + "' " : ""; + var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : ""; + var imgTitle = (myImage.title) ? "title='" + myImage.title + "' " : "title='" + myImage.alt + "' "; + var imgStyle = "display:inline-block;" + myImage.style.cssText; + var strNewHTML = ""; + myImage.outerHTML = strNewHTML; + } +} + +// Toggle window visibility with Ctrl-Alt-Q +document.addEvent('keydown', function(event){ + if (event.key == 'q' && event.control && event.alt) { + MochaUI.toggleWindowVisibility(); + } +}); + +// Blur all windows if user clicks anywhere else on the page +document.addEvent('mousedown', function(event){ + MochaUI.blurAll.delay(50); +}); + +document.addEvent('domready', function(){ + MochaUI.underlayInitialize(); +}); + +window.addEvent('resize', function(){ + MochaUI.setUnderlaySize(); +}); +/* + +Script: Window.js + Build windows. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js + +*/ + +/* +Class: Window + Creates a single MochaUI window. + +Syntax: + (start code) + new MochaUI.Window(options); + (end) + +Arguments: + options + +Options: + id - The ID of the window. If not defined, it will be set to 'win' + windowIDCount. + title - The title of the window. + icon - Place an icon in the window's titlebar. This is either set to false or to the url of the icon. It is set up for icons that are 16 x 16px. + type - ('window', 'modal', 'modal2', or 'notification') Defaults to 'window'. + loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html'. + contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. + closeAfter - Either false or time in milliseconds. Closes the window after a certain period of time in milliseconds. This is particularly useful for notifications. + evalScripts - (boolean) An xhr loadMethod option. Defaults to true. + evalResponse - (boolean) An xhr loadMethod option. Defaults to false. + content - (string or element) An html loadMethod option. + toolbar - (boolean) Create window toolbar. Defaults to false. This can be used for tabs, media controls, and so forth. + toolbarPosition - ('top' or 'bottom') Defaults to top. + toolbarHeight - (number) + toolbarURL - (url) Defaults to 'pages/lipsum.html'. + toolbarContent - (string) + container - (element ID) Element the window is injected in. The container defaults to 'desktop'. If no desktop then to document.body. Use 'pageWrapper' if you don't want the windows to overlap the toolbars. + restrict - (boolean) Restrict window to container when dragging. + shape - ('box' or 'gauge') Shape of window. Defaults to 'box'. + collapsible - (boolean) Defaults to true. + minimizable - (boolean) Requires MochaUI.Desktop and MochaUI.Dock. Defaults to true if dependenices are met. + maximizable - (boolean) Requires MochaUI.Desktop. Defaults to true if dependenices are met. + closable - (boolean) Defaults to true. + draggable - (boolean) Defaults to false for modals; otherwise true. + draggableGrid - (false or number) Distance in pixels for snap-to-grid dragging. Defaults to false. + draggableLimit - (false or number) An object with x and y properties used to limit the movement of the Window. Defaults to false. + draggableSnap - (boolean) The distance to drag before the Window starts to respond to the drag. Defaults to false. + resizable - (boolean) Defaults to false for modals, notifications and gauges; otherwise true. + resizeLimit - (object) Minimum and maximum width and height of window when resized. + addClass - (string) Add a class to the window for more control over styling. + width - (number) Width of content area. + height - (number) Height of content area. + x - (number) If x and y are left undefined the window is centered on the page. + y - (number) + scrollbars - (boolean) + padding - (object) + shadowBlur - (number) Width of shadows. + shadowOffset - Should be positive and not be greater than the ShadowBlur. + controlsOffset - Change this if you want to reposition the window controls. + useCanvas - (boolean) Set this to false if you don't want a canvas body. + useCanvasControls - (boolean) Set this to false if you wish to use images for the buttons. + headerHeight - (number) Height of window titlebar. + footerHeight - (number) Height of window footer. + cornerRadius - (number) + contentBgColor - (hex) Body background color + headerStartColor - ([r,g,b,]) Titlebar gradient's top color + headerStopColor - ([r,g,b,]) Titlebar gradient's bottom color + bodyBgColor - ([r,g,b,]) Background color of the main canvas shape + minimizeBgColor - ([r,g,b,]) Minimize button background color + minimizeColor - ([r,g,b,]) Minimize button color + maximizeBgColor - ([r,g,b,]) Maximize button background color + maximizeColor - ([r,g,b,]) Maximize button color + closeBgColor - ([r,g,b,]) Close button background color + closeColor - ([r,g,b,]) Close button color + resizableColor - ([r,g,b,]) Resizable icon color + onBeforeBuild - (function) Fired just before the window is built. + onContentLoaded - (function) Fired when content is successfully loaded via XHR or Iframe. + onFocus - (function) Fired when the window is focused. + onBlur - (function) Fired when window loses focus. + onResize - (function) Fired when the window is resized. + onMinimize - (function) Fired when the window is minimized. + onMaximize - (function) Fired when the window is maximized. + onRestore - (function) Fired when a window is restored from minimized or maximized. + onClose - (function) Fired just before the window is closed. + onCloseComplete - (function) Fired after the window is closed. + +Returns: + Window object. + +Example: + Define a window. It is suggested you name the function the same as your window ID + "Window". + (start code) + var mywindowWindow = function(){ + new MochaUI.Window({ + id: 'mywindow', + title: 'My Window', + loadMethod: 'xhr', + contentURL: 'pages/lipsum.html', + width: 340, + height: 150 + }); + } + (end) + +Example: + Create window onDomReady. + (start code) + window.addEvent('domready', function(){ + mywindow(); + }); + (end) + +Example: + Add link events to build future windows. It is suggested you give your anchor the same ID as your window + "WindowLink" or + "WindowLinkCheck". Use the latter if it is a link in the menu toolbar. + + If you wish to add links in windows that open other windows remember to add events to those links when the windows are created. + + (start code) + // Javascript: + if ($('mywindowLink')){ + $('mywindowLink').addEvent('click', function(e) { + new Event(e).stop(); + mywindow(); + }); + } + + // HTML: + My Window + (end) + + + Loading Content with an XMLHttpRequest(xhr): + For content to load via xhr all the files must be online and in the same domain. If you need to load content from another domain or wish to have it work offline, load the content in an iframe instead of using the xhr option. + + Iframes: + If you use the iframe loadMethod your iframe will automatically be resized when the window it is in is resized. If you want this same functionality when using one of the other load options simply add class="mochaIframe" to those iframes and they will be resized for you as well. + +*/ + +// Having these options outside of the Class allows us to add, change, and remove +// individual options without rewriting all of them. + +MochaUI.Windows.windowOptions = { + id: null, + title: 'New Window', + icon: false, + type: 'window', + + loadMethod: 'html', + contentURL: 'pages/lipsum.html', + + closeAfter: false, + + // xhr options + evalScripts: true, + evalResponse: false, + + // html options + content: 'Window content', + + // Toolbar + toolbar: false, + toolbarPosition: 'top', + toolbarHeight: 29, + toolbarURL: 'pages/lipsum.html', + toolbarContent: '', + + // Toolbar + toolbar2: false, + toolbar2Position: 'bottom', + toolbar2Height: 29, + toolbar2URL: 'pages/lipsum.html', + toolbar2Content: '', + + // Container options + container: null, + restrict: true, + shape: 'box', + + // Window Controls + collapsible: true, + minimizable: true, + maximizable: true, + closable: true, + + // Draggable + draggable: null, + draggableGrid: false, + draggableLimit: false, + draggableSnap: false, + + // Resizable + resizable: null, + resizeLimit: {'x': [250, 2500], 'y': [125, 2000]}, + + // Style options: + addClass: '', + width: 300, + height: 125, + x: null, + y: null, + scrollbars: true, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + shadowOffset: {'x': 0, 'y': 1}, + controlsOffset: {'right': 6, 'top': 6}, + useCanvas: true, + useCanvasControls: true, + useSpinner: true, // Toggles whether or not the ajax spinners are displayed in window footers. + + // Color options: + headerHeight: 25, + footerHeight: 25, + cornerRadius: 8, + contentBgColor: '#fff', + headerStartColor: [250, 250, 250], + headerStopColor: [229, 229, 229], + bodyBgColor: [229, 229, 229], + minimizeBgColor: [255, 255, 255], + minimizeColor: [0, 0, 0], + maximizeBgColor: [255, 255, 255], + maximizeColor: [0, 0, 0], + closeBgColor: [255, 255, 255], + closeColor: [0, 0, 0], + resizableColor: [254, 254, 254], + + // Events + onBeforeBuild: $empty, + onContentLoaded: $empty, + onFocus: $empty, + onBlur: $empty, + onResize: $empty, + onMinimize: $empty, + onMaximize: $empty, + onRestore: $empty, + onClose: $empty, + onCloseComplete: $empty +}; + +MochaUI.Window = new Class({ + options: MochaUI.Windows.windowOptions, + initialize: function(options){ + this.setOptions(options); + + // Shorten object chain + var options = this.options; + + $extend(this, { + mochaControlsWidth: 0, + minimizebuttonX: 0, // Minimize button horizontal position + maximizebuttonX: 0, // Maximize button horizontal position + closebuttonX: 0, // Close button horizontal position + headerFooterShadow: options.headerHeight + options.footerHeight + (options.shadowBlur * 2), + oldTop: 0, + oldLeft: 0, + isMaximized: false, + isMinimized: false, + isCollapsed: false, + timestamp: $time() + }); + + // May be better to use if type != window + if (options.type != 'window'){ + options.container = document.body; + options.minimizable = false; + } + if (!options.container){ + options.container = MochaUI.Desktop.desktop ? MochaUI.Desktop.desktop : document.body; + } + + // Set this.options.resizable to default if it was not defined + if (options.resizable == null){ + if (options.type != 'window' || options.shape == 'gauge'){ + options.resizable = false; + } + else { + options.resizable = true; + } + } + + // Set this.options.draggable if it was not defined + if (options.draggable == null){ + if (options.type != 'window'){ + options.draggable = false; + } + else { + options.draggable = true; + } + } + + // Gauges are not maximizable or resizable + if (options.shape == 'gauge' || options.type == 'notification'){ + options.collapsible = false; + options.maximizable = false; + options.contentBgColor = 'transparent'; + options.scrollbars = false; + options.footerHeight = 0; + } + if (options.type == 'notification'){ + options.closable = false; + options.headerHeight = 0; + } + + // Minimizable, dock is required and window cannot be modal + if (MochaUI.Dock && $(MochaUI.options.dock)){ + if (MochaUI.Dock.dock && options.type != 'modal' && options.type != 'modal2'){ + options.minimizable = options.minimizable; + } + } + else { + options.minimizable = false; + } + + // Maximizable, desktop is required + options.maximizable = MochaUI.Desktop.desktop && options.maximizable && options.type != 'modal' && options.type != 'modal2'; + + if (this.options.type == 'modal2') { + this.options.shadowBlur = 0; + this.options.shadowOffset = {'x': 0, 'y': 0}; + this.options.useSpinner = false; + this.options.useCanvas = false; + this.options.footerHeight = 0; + this.options.headerHeight = 0; + } + + // If window has no ID, give it one. + if (options.id == null){ + options.id = 'win' + (++MochaUI.Windows.windowIDCount); + } + this.windowEl = $(options.id); + + this.newWindow(); + + // Return window object + return this; + }, + saveValues: function(){ + var coordinates = this.windowEl.getCoordinates(); + this.options.x = coordinates.left.toInt(); + this.options.y = coordinates.top.toInt(); + }, + /* + + Internal Function: newWindow + + Arguments: + properties + + */ + newWindow: function(properties){ // options is not doing anything + + // Shorten object chain + var instances = MochaUI.Windows.instances; + var instanceID = instances.get(this.options.id); + + // Here we check to see if there is already a class instance for this window + if (instanceID){ + var currentInstance = instanceID; + } + + // Check if window already exists and is not in progress of closing + if ( this.windowEl && !this.isClosing ){ + // Restore if minimized + if (currentInstance.isMinimized){ + MochaUI.Dock.restoreMinimized(this.windowEl); + } + // Expand and focus if collapsed + if (currentInstance.isCollapsed){ + MochaUI.collapseToggle(this.windowEl); + setTimeout(MochaUI.focusWindow.pass(this.windowEl, this),10); + } + // Else focus + else { + var coordinates = document.getCoordinates(); + if (this.windowEl.getStyle('left').toInt() > coordinates.width || this.windowEl.getStyle('top').toInt() > coordinates.height){ + MochaUI.centerWindow(this.windowEl); + } + setTimeout(MochaUI.focusWindow.pass(this.windowEl, this),10); + } + return; + } + else { + instances.set(this.options.id, this); + } + + this.isClosing = false; + this.fireEvent('onBeforeBuild'); + + // Create window div + MochaUI.Windows.indexLevel++; + this.windowEl = new Element('div', { + 'class': 'mocha', + 'id': this.options.id, + 'styles': { + 'width': this.options.width, + 'height': this.options.height, + 'display': 'block', + 'opacity': 0, + 'zIndex': MochaUI.Windows.indexLevel += 2 + } + }); + + this.windowEl.addClass(this.options.addClass); + + if (this.options.type == 'modal2') { + this.windowEl.addClass('modal2'); + } + + // Fix a mouseover issue with gauges in IE7 + if ( Browser.Engine.trident && this.options.shape == 'gauge') { + this.windowEl.setStyle('background', 'url(../images/spacer.gif)'); + } + + if ((this.options.type == 'modal' || this.options.type == 'modal2' ) && Browser.Platform.mac && Browser.Engine.gecko){ + if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { + var ffversion = new Number(RegExp.$1); + if (ffversion < 3) { + this.windowEl.setStyle('position', 'fixed'); + } + } + } + + if (this.options.loadMethod == 'iframe') { + this.options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; + } + + // Insert sub elements inside windowEl + this.insertWindowElements(); + + // Set title + this.titleEl.set('html',this.options.title); + + // Set scrollbars, always use 'hidden' for iframe windows + this.contentWrapperEl.setStyles({ + 'overflow': 'hidden', + 'background': this.options.contentBgColor + }); + + this.contentEl.setStyles({ + 'padding-top': this.options.padding.top, + 'padding-bottom': this.options.padding.bottom, + 'padding-left': this.options.padding.left, + 'padding-right': this.options.padding.right + }); + + + if (this.options.shape == 'gauge'){ + if (this.options.useCanvasControls){ + this.canvasControlsEl.setStyle('display', 'none'); + } + else { + this.controlsEl.setStyle('display', 'none'); + } + this.windowEl.addEvent('mouseover', function(){ + this.mouseover = true; + var showControls = function(){ + if (this.mouseover != false){ + if (this.options.useCanvasControls){ + this.canvasControlsEl.setStyle('display', 'block'); + } + else { + this.controlsEl.setStyle('display', 'block'); + } + this.canvasHeaderEl.setStyle('display', 'block'); + this.titleEl.setStyle('display', 'block'); + } + }; + showControls.delay(150, this); + + }.bind(this)); + this.windowEl.addEvent('mouseleave', function(){ + this.mouseover = false; + if (this.options.useCanvasControls){ + this.canvasControlsEl.setStyle('display', 'none'); + } + else { + this.controlsEl.setStyle('display', 'none'); + } + this.canvasHeaderEl.setStyle('display', 'none'); + this.titleEl.setStyle('display', 'none'); + }.bind(this)); + } + + // Inject window into DOM + this.windowEl.injectInside(this.options.container); + + if (this.options.type != 'notification'){ + this.setMochaControlsWidth(); + } + + // Add content to window. + MochaUI.updateContent({ + 'element': this.windowEl, + 'content': this.options.content, + 'url': this.options.contentURL + }); + + // Add content to window toolbar. + if (this.options.toolbar == true){ + MochaUI.updateContent({ + 'element': this.windowEl, + 'childElement': this.toolbarEl, + 'content': this.options.toolbarContent, + 'loadMethod': 'xhr', + 'url': this.options.toolbarURL + }); + } + + // Add content to window toolbar. + if (this.options.toolbar2 == true){ + MochaUI.updateContent({ + 'element': this.windowEl, + 'childElement': this.toolbar2El, + 'content': this.options.toolbar2Content, + 'loadMethod': 'xhr', + 'url': this.options.toolbar2URL + }); + } + + this.drawWindow(this.windowEl); + + // Attach events to the window + this.attachDraggable(this.windowEl); + this.attachResizable(this.windowEl); + this.setupEvents(this.windowEl); + + if (this.options.resizable){ + this.adjustHandles(); + } + + // Move window into position. If position not specified by user then center the window on the page. + if (this.options.container == document.body || this.options.container == MochaUI.Desktop.desktop){ + var dimensions = window.getSize(); + } + else { + var dimensions = $(this.options.container).getSize(); + } + + if (!this.options.y) { + var y = (dimensions.y * .5) - ((this.options.height + this.headerFooterShadow + this.windowEl.getStyle('border-top').toInt() + this.windowEl.getStyle('border-bottom').toInt()) * .5); + } + else { + var y = this.options.y - this.options.shadowBlur; + } + + if (!this.options.x) { + var x = (dimensions.x * .5) - (this.options.width * .5); + } + else { + var x = this.options.x - this.options.shadowBlur; + } + + this.windowEl.setStyles({ + 'top': y, + 'left': x + }); + + // Create opacityMorph + if (MochaUI.options.useEffects == true){ + // IE cannot handle both element opacity and VML alpha at the same time. + if (Browser.Engine.trident){ + this.drawWindow(this.windowEl, false); + } + this.opacityMorph = new Fx.Morph(this.windowEl, { + 'duration': 350, + onComplete: function(){ + if (Browser.Engine.trident){ + this.drawWindow(this.windowEl); + } + }.bind(this) + }); + } + + if (this.options.type == 'modal' || this.options.type == 'modal2') { + MochaUI.currentModal = this.windowEl; + if (Browser.Engine.trident4){ + $('modalFix').setStyle('display', 'block'); + } + $('modalOverlay').setStyle('display', 'block'); + if (MochaUI.options.useEffects == false){ + $('modalOverlay').setStyle('opacity', .6); + this.windowEl.setStyles({ + 'zIndex': 11000, + 'opacity': 1 + }); + } + else { + MochaUI.Modal.modalOverlayCloseMorph.cancel(); + MochaUI.Modal.modalOverlayOpenMorph.start({ + 'opacity': .6 + }); + this.windowEl.setStyles({ + 'zIndex': 11000 + }); + this.opacityMorph.start({ + 'opacity': 1 + }); + } + + $$('.dockTab').removeClass('activeDockTab'); + $$('.mocha').removeClass('isFocused'); + this.windowEl.addClass('isFocused'); + + } + else if (MochaUI.options.useEffects == false){ + this.windowEl.setStyle('opacity', 1); + setTimeout(MochaUI.focusWindow.pass(this.windowEl, this), 10); + } + else { + this.opacityMorph.start({ + 'opacity': 1 + }); + setTimeout(MochaUI.focusWindow.pass(this.windowEl, this), 10); + } + + // This is a generic morph that can be reused later by functions like centerWindow() + this.morph = new Fx.Morph(this.windowEl, { + 'duration': 200 + }); + + // Add check mark to menu if link exists in menu + // Need to make sure the check mark is not added to links not in menu + + if ($(this.windowEl.id + 'LinkCheck')){ + this.check = new Element('div', { + 'class': 'check', + 'id': this.options.id + '_check' + }).inject(this.windowEl.id + 'LinkCheck'); + } + + if (this.options.closeAfter != false){ + MochaUI.closeWindow.delay(this.options.closeAfter, this, this.windowEl); + } + + if (MochaUI.Dock && $(MochaUI.options.dock) && this.options.type == 'window' ){ + MochaUI.Dock.createDockTab(this.windowEl); + } + + }, + setupEvents: function(windowEl) { + + // Set events + // Note: if a button does not exist, its due to properties passed to newWindow() stating otherwice + if (this.closeButtonEl){ + this.closeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + MochaUI.closeWindow(windowEl); + }.bind(this)); + } + + if (this.options.type == 'window'){ + windowEl.addEvent('mousedown', function() { + MochaUI.focusWindow(windowEl); + }.bind(this)); + } + + if (this.minimizeButtonEl) { + this.minimizeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + MochaUI.Dock.minimizeWindow(windowEl); + }.bind(this)); + } + + if (this.maximizeButtonEl) { + this.maximizeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + if (this.isMaximized) { + MochaUI.Desktop.restoreWindow(windowEl); + } else { + MochaUI.Desktop.maximizeWindow(windowEl); + } + }.bind(this)); + } + + if (this.options.collapsible == true){ + // Keep titlebar text from being selected on double click in Safari. + this.titleEl.addEvent('selectstart', function(e) { + e = new Event(e).stop(); + }.bind(this)); + // Keep titlebar text from being selected on double click in Opera. + this.titleBarEl.addEvent('mousedown', function(e) { + if (Browser.Engine.trident) { + this.titleEl.setCapture(); + } + }.bind(this)); + this.titleBarEl.addEvent('mouseup', function(e) { + if (Browser.Engine.trident) { + this.titleEl.releaseCapture(); + } + }.bind(this)); + this.titleBarEl.addEvent('dblclick', function(e) { + e = new Event(e).stop(); + MochaUI.collapseToggle(this.windowEl); + }.bind(this)); + } + + }, + /* + + Internal Function: attachDraggable() + Make window draggable. + + Arguments: + windowEl + + */ + attachDraggable: function(windowEl){ + if (!this.options.draggable) return; + this.windowDrag = new Drag.Move(windowEl, { + handle: this.titleBarEl, + container: this.options.restrict == true ? $(this.options.container) : false, + grid: this.options.draggableGrid, + limit: this.options.draggableLimit, + snap: this.options.draggableSnap, + onStart: function() { + if (this.options.type != 'modal' && this.options.type != 'modal2'){ + MochaUI.focusWindow(windowEl); + $('windowUnderlay').setStyle('display','block'); + } + if ( this.iframeEl ) + this.iframeEl.setStyle('visibility', 'hidden'); + }.bind(this), + onComplete: function() { + if (this.options.type != 'modal' && this.options.type != 'modal2') { + $('windowUnderlay').setStyle('display', 'none'); + } + if ( this.iframeEl ){ + this.iframeEl.setStyle('visibility', 'visible'); + } + // Store new position in options. + this.saveValues(); + }.bind(this) + }); + }, + /* + + Internal Function: attachResizable + Make window resizable. + + Arguments: + windowEl + + */ + attachResizable: function(windowEl){ + if (!this.options.resizable) return; + this.resizable1 = this.windowEl.makeResizable({ + handle: [this.n, this.ne, this.nw], + limit: { + y: [ + function(){ + return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[1]; + }.bind(this), + function(){ + return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[0]; + }.bind(this) + ] + }, + modifiers: {x: false, y: 'top'}, + onStart: function(){ + this.resizeOnStart(); + this.coords = this.contentWrapperEl.getCoordinates(); + this.y2 = this.coords.top.toInt() + this.contentWrapperEl.offsetHeight; + }.bind(this), + onDrag: function(){ + this.coords = this.contentWrapperEl.getCoordinates(); + this.contentWrapperEl.setStyle('height', this.y2 - this.coords.top.toInt()); + this.drawWindow(windowEl); + this.adjustHandles(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable2 = this.contentWrapperEl.makeResizable({ + handle: [this.e, this.ne], + limit: { + x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ] + }, + modifiers: {x: 'width', y: false}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.drawWindow(windowEl); + this.adjustHandles(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable3 = this.contentWrapperEl.makeResizable({ + container: this.options.restrict == true ? $(this.options.container) : false, + handle: this.se, + limit: { + x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ], + y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] + }, + modifiers: {x: 'width', y: 'height'}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.drawWindow(windowEl); + this.adjustHandles(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable4 = this.contentWrapperEl.makeResizable({ + handle: [this.s, this.sw], + limit: { + y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] + }, + modifiers: {x: false, y: 'height'}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.drawWindow(windowEl); + this.adjustHandles(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable5 = this.windowEl.makeResizable({ + handle: [this.w, this.sw, this.nw], + limit: { + x: [ + function(){ + return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[1]; + }.bind(this), + function(){ + return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[0]; + }.bind(this) + ] + }, + modifiers: {x: 'left', y: false}, + onStart: function(){ + this.resizeOnStart(); + this.coords = this.contentWrapperEl.getCoordinates(); + this.x2 = this.coords.left.toInt() + this.contentWrapperEl.offsetWidth; + }.bind(this), + onDrag: function(){ + this.coords = this.contentWrapperEl.getCoordinates(); + this.contentWrapperEl.setStyle('width', this.x2 - this.coords.left.toInt()); + this.drawWindow(windowEl); + this.adjustHandles(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + }, + resizeOnStart: function(){ + $('windowUnderlay').setStyle('display','block'); + if (this.iframeEl){ + this.iframeEl.setStyle('visibility', 'hidden'); + } + }, + resizeOnComplete: function(){ + $('windowUnderlay').setStyle('display','none'); + if (this.iframeEl){ + this.iframeEl.setStyle('visibility', 'visible'); + } + this.fireEvent('onResize', this.windowEl); + }, + adjustHandles: function(){ + + var shadowBlur = this.options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = this.options.shadowOffset; + var top = shadowBlur - shadowOffset.y - 1; + var right = shadowBlur + shadowOffset.x - 1; + var bottom = shadowBlur + shadowOffset.y - 1; + var left = shadowBlur - shadowOffset.x - 1; + + var coordinates = this.windowEl.getCoordinates(); + var width = coordinates.width - shadowBlur2x + 2; + var height = coordinates.height - shadowBlur2x + 2; + + this.n.setStyles({ + 'top': top, + 'left': left + 10, + 'width': width - 20 + }); + this.e.setStyles({ + 'top': top + 10, + 'right': right, + 'height': height - 30 + }); + this.s.setStyles({ + 'bottom': bottom, + 'left': left + 10, + 'width': width - 30 + }); + this.w.setStyles({ + 'top': top + 10, + 'left': left, + 'height': height - 20 + }); + this.ne.setStyles({ + 'top': top, + 'right': right + }); + this.se.setStyles({ + 'bottom': bottom, + 'right': right + }); + this.sw.setStyles({ + 'bottom': bottom, + 'left': left + }); + this.nw.setStyles({ + 'top': top, + 'left': left + }); + }, + detachResizable: function(){ + this.resizable1.detach(); + this.resizable2.detach(); + this.resizable3.detach(); + this.resizable4.detach(); + this.resizable5.detach(); + this.windowEl.getElements('.handle').setStyle('display', 'none'); + }, + reattachResizable: function(){ + this.resizable1.attach(); + this.resizable2.attach(); + this.resizable3.attach(); + this.resizable4.attach(); + this.resizable5.attach(); + this.windowEl.getElements('.handle').setStyle('display', 'block'); + }, + /* + + Internal Function: insertWindowElements + + Arguments: + windowEl + + */ + insertWindowElements: function(){ + + var options = this.options; + var height = options.height; + var width = options.width; + var id = options.id; + + var cache = {}; + + if (Browser.Engine.trident4){ + cache.zIndexFixEl = new Element('iframe', { + 'id': id + '_zIndexFix', + 'class': 'zIndexFix', + 'scrolling': 'no', + 'marginWidth': 0, + 'marginHeight': 0, + 'src': '' + }).inject(this.windowEl); + } + + cache.overlayEl = new Element('div', { + 'id': id + '_overlay', + 'class': 'mochaOverlay' + }).inject(this.windowEl); + + cache.titleBarEl = new Element('div', { + 'id': id + '_titleBar', + 'class': 'mochaTitlebar', + 'styles': { + 'cursor': options.draggable ? 'move' : 'default' + } + }).inject(cache.overlayEl, 'top'); + + cache.titleEl = new Element('h3', { + 'id': id + '_title', + 'class': 'mochaTitle' + }).inject(cache.titleBarEl); + + if (options.icon != false){ + cache.titleBarEl.setStyles({ + 'padding-left': 15, + 'background': 'url(' + options.icon + ') 5px 5px no-repeat' + }); + } + + cache.contentBorderEl = new Element('div', { + 'id': id + '_contentBorder', + 'class': 'mochaContentBorder' + }).inject(cache.overlayEl); + + if (options.toolbar){ + cache.toolbarWrapperEl = new Element('div', { + 'id': id + '_toolbarWrapper', + 'class': 'mochaToolbarWrapper' + }).inject(cache.contentBorderEl, options.toolbarPosition == 'bottom' ? 'after' : 'before'); + + if (options.toolbarPosition == 'bottom') { + cache.toolbarWrapperEl.addClass('bottom'); + } + cache.toolbarEl = new Element('div', { + 'id': id + '_toolbar', + 'class': 'mochaToolbar' + }).inject(cache.toolbarWrapperEl); + } + + if (options.toolbar2){ + cache.toolbar2WrapperEl = new Element('div', { + 'id': id + '_toolbar2Wrapper', + 'class': 'mochaToolbarWrapper' + }).inject(cache.contentBorderEl, options.toolbar2Position == 'bottom' ? 'after' : 'before'); + + if (options.toolbar2Position == 'bottom') { + cache.toolbar2WrapperEl.addClass('bottom'); + } + cache.toolbar2El = new Element('div', { + 'id': id + '_toolbar2', + 'class': 'mochaToolbar' + }).inject(cache.toolbar2WrapperEl); + } + + cache.contentWrapperEl = new Element('div', { + 'id': id + '_contentWrapper', + 'class': 'mochaContentWrapper', + 'styles': { + 'width': width + 'px', + 'height': height + 'px' + } + }).inject(cache.contentBorderEl); + + if (this.options.shape == 'gauge'){ + cache.contentBorderEl.setStyle('borderWidth', 0); + } + + cache.contentEl = new Element('div', { + 'id': id + '_content', + 'class': 'mochaContent' + }).inject(cache.contentWrapperEl); + + if (this.options.useCanvas == true) { + cache.canvasEl = new Element('canvas', { + 'id': id + '_canvas', + 'class': 'mochaCanvas', + 'width': 1, + 'height': 1 + }).inject(this.windowEl); + + if (Browser.Engine.trident && MochaUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasEl); + cache.canvasEl = this.windowEl.getElement('.mochaCanvas'); + } + } + + cache.controlsEl = new Element('div', { + 'id': id + '_controls', + 'class': 'mochaControls' + }).inject(cache.overlayEl, 'after'); + + if (options.useCanvasControls == true){ + cache.canvasControlsEl = new Element('canvas', { + 'id': id + '_canvasControls', + 'class': 'mochaCanvasControls', + 'width': 14, + 'height': 14 + }).inject(this.windowEl); + + if (Browser.Engine.trident && MochaUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasControlsEl); + cache.canvasControlsEl = this.windowEl.getElement('.mochaCanvasControls'); + } + } + + if (options.closable){ + cache.closeButtonEl = new Element('div', { + 'id': id + '_closeButton', + 'class': 'mochaCloseButton', + 'title': 'Close' + }).inject(cache.controlsEl); + if (options.useCanvasControls == true){ + cache.closeButtonEl.setStyle('background', 'none'); + } + } + + if (options.maximizable){ + cache.maximizeButtonEl = new Element('div', { + 'id': id + '_maximizeButton', + 'class': 'mochaMaximizeButton', + 'title': 'Maximize' + }).inject(cache.controlsEl); + if (options.useCanvasControls == true){ + cache.maximizeButtonEl.setStyle('background', 'none'); + } + } + + if (options.minimizable){ + cache.minimizeButtonEl = new Element('div', { + 'id': id + '_minimizeButton', + 'class': 'mochaMinimizeButton', + 'title': 'Minimize' + }).inject(cache.controlsEl); + if (options.useCanvasControls == true){ + cache.minimizeButtonEl.setStyle('background', 'none'); + } + } + + if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ + cache.spinnerEl = new Element('div', { + 'id': id + '_spinner', + 'class': 'mochaSpinner', + 'width': 16, + 'height': 16 + }).inject(this.windowEl, 'bottom'); + } + + if (this.options.shape == 'gauge'){ + cache.canvasHeaderEl = new Element('canvas', { + 'id': id + '_canvasHeader', + 'class': 'mochaCanvasHeader', + 'width': this.options.width, + 'height': 26 + }).inject(this.windowEl, 'bottom'); + + if (Browser.Engine.trident && MochaUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasHeaderEl); + cache.canvasHeaderEl = this.windowEl.getElement('.mochaCanvasHeader'); + } + } + + if ( Browser.Engine.trident ){ + cache.overlayEl.setStyle('zIndex', 2); + } + + // For Mac Firefox 2 to help reduce scrollbar bugs in that browser + if (Browser.Platform.mac && Browser.Engine.gecko){ + if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ + var ffversion = new Number(RegExp.$1); + if (ffversion < 3){ + cache.overlayEl.setStyle('overflow', 'auto'); + } + } + } + + if (options.resizable){ + cache.n = new Element('div', { + 'id': id + '_resizeHandle_n', + 'class': 'handle', + 'styles': { + 'top': 0, + 'left': 10, + 'cursor': 'n-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.ne = new Element('div', { + 'id': id + '_resizeHandle_ne', + 'class': 'handle corner', + 'styles': { + 'top': 0, + 'right': 0, + 'cursor': 'ne-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.e = new Element('div', { + 'id': id + '_resizeHandle_e', + 'class': 'handle', + 'styles': { + 'top': 10, + 'right': 0, + 'cursor': 'e-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.se = new Element('div', { + 'id': id + '_resizeHandle_se', + 'class': 'handle cornerSE', + 'styles': { + 'bottom': 0, + 'right': 0, + 'cursor': 'se-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.s = new Element('div', { + 'id': id + '_resizeHandle_s', + 'class': 'handle', + 'styles': { + 'bottom': 0, + 'left': 10, + 'cursor': 's-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.sw = new Element('div', { + 'id': id + '_resizeHandle_sw', + 'class': 'handle corner', + 'styles': { + 'bottom': 0, + 'left': 0, + 'cursor': 'sw-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.w = new Element('div', { + 'id': id + '_resizeHandle_w', + 'class': 'handle', + 'styles': { + 'top': 10, + 'left': 0, + 'cursor': 'w-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.nw = new Element('div', { + 'id': id + '_resizeHandle_nw', + 'class': 'handle corner', + 'styles': { + 'top': 0, + 'left': 0, + 'cursor': 'nw-resize' + } + }).inject(cache.overlayEl, 'after'); + } + $extend(this, cache); + + }, + /* + + Internal function: drawWindow + This is where we create the canvas GUI + + Arguments: + windowEl: the $(window) + shadows: (boolean) false will draw a window without shadows + + */ + drawWindow: function(windowEl, shadows) { + + if (this.isCollapsed){ + this.drawWindowCollapsed(windowEl, shadows); + return; + } + + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = this.options.shadowOffset; + + this.overlayEl.setStyles({ + 'width': this.contentWrapperEl.offsetWidth + }); + + // Resize iframe when window is resized + if (this.iframeEl) { + this.iframeEl.setStyles({ + 'height': this.contentWrapperEl.offsetHeight + }); + } + + var borderHeight = this.contentBorderEl.getStyle('border-top').toInt() + this.contentBorderEl.getStyle('border-bottom').toInt(); + var toolbarHeight = this.toolbarWrapperEl ? this.toolbarWrapperEl.getStyle('height').toInt() + this.toolbarWrapperEl.getStyle('border-top').toInt() : 0; + var toolbar2Height = this.toolbar2WrapperEl ? this.toolbar2WrapperEl.getStyle('height').toInt() + this.toolbar2WrapperEl.getStyle('border-top').toInt() : 0; + + this.headerFooterShadow = options.headerHeight + options.footerHeight + shadowBlur2x; + var height = this.contentWrapperEl.getStyle('height').toInt() + this.headerFooterShadow + toolbarHeight + toolbar2Height + borderHeight; + var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; + this.windowEl.setStyles({ + 'height': height, + 'width': width + }); + + this.overlayEl.setStyles({ + 'height': height, + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + + // Opera requires the canvas height and width be set this way when resizing: + if (this.options.useCanvas == true) { + this.canvasEl.height = height; + this.canvasEl.width = width; + } + + // Part of the fix for IE6 select z-index bug + if (Browser.Engine.trident4){ + this.zIndexFixEl.setStyles({ + 'width': width, + 'height': height + }) + } + + this.titleBarEl.setStyles({ + 'width': width - shadowBlur2x, + 'height': options.headerHeight + }); + + // Make sure loading icon is placed correctly. + if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ + this.spinnerEl.setStyles({ + 'left': shadowBlur - shadowOffset.x + 3, + 'bottom': shadowBlur + shadowOffset.y + 4 + }); + } + + if (this.options.useCanvas != false) { + + // Draw Window + var ctx = this.canvasEl.getContext('2d'); + ctx.clearRect(0, 0, width, height); + + switch (options.shape) { + case 'box': + this.drawBox(ctx, width, height, shadowBlur, shadowOffset, shadows); + break; + case 'gauge': + this.drawGauge(ctx, width, height, shadowBlur, shadowOffset, shadows); + break; + } + + + if (options.resizable){ + MochaUI.triangle( + ctx, + width - (shadowBlur + shadowOffset.x + 17), + height - (shadowBlur + shadowOffset.y + 18), + 11, + 11, + options.resizableColor, + 1.0 + ); + } + + // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 + if (Browser.Engine.trident){ + MochaUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); + } + } + + if (options.type != 'notification' && options.useCanvasControls == true){ + this.drawControls(width, height, shadows); + } + + }, + drawWindowCollapsed: function(windowEl, shadows) { + + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = options.shadowOffset; + + var headerShadow = options.headerHeight + shadowBlur2x + 2; + var height = headerShadow; + var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; + this.windowEl.setStyle('height', height); + + this.overlayEl.setStyles({ + 'height': height, + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + + // Opera height and width must be set like this, when resizing: + this.canvasEl.height = height; + this.canvasEl.width = width; + + // Part of the fix for IE6 select z-index bug + if (Browser.Engine.trident4){ + this.zIndexFixEl.setStyles({ + 'width': width, + 'height': height + }); + } + + // Set width + this.windowEl.setStyle('width', width); + this.overlayEl.setStyle('width', width); + this.titleBarEl.setStyles({ + 'width': width - shadowBlur2x, + 'height': options.headerHeight + }); + + // Draw Window + if (this.options.useCanvas != false) { + var ctx = this.canvasEl.getContext('2d'); + ctx.clearRect(0, 0, width, height); + + this.drawBoxCollapsed(ctx, width, height, shadowBlur, shadowOffset, shadows); + if (options.useCanvasControls == true) { + this.drawControls(width, height, shadows); + } + + // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 + if (Browser.Engine.trident){ + MochaUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); + } + } + + }, + drawControls : function(width, height, shadows){ + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowOffset = options.shadowOffset; + var controlsOffset = options.controlsOffset; + + // Make sure controls are placed correctly. + this.controlsEl.setStyles({ + 'right': shadowBlur + shadowOffset.x + controlsOffset.right, + 'top': shadowBlur - shadowOffset.y + controlsOffset.top + }); + + this.canvasControlsEl.setStyles({ + 'right': shadowBlur + shadowOffset.x + controlsOffset.right, + 'top': shadowBlur - shadowOffset.y + controlsOffset.top + }); + + // Calculate X position for controlbuttons + //var mochaControlsWidth = 52; + this.closebuttonX = options.closable ? this.mochaControlsWidth - 7 : this.mochaControlsWidth + 12; + this.maximizebuttonX = this.closebuttonX - (options.maximizable ? 19 : 0); + this.minimizebuttonX = this.maximizebuttonX - (options.minimizable ? 19 : 0); + + var ctx2 = this.canvasControlsEl.getContext('2d'); + ctx2.clearRect(0, 0, 100, 100); + + if (this.options.closable){ + this.closebutton( + ctx2, + this.closebuttonX, + 7, + options.closeBgColor, + 1.0, + options.closeColor, + 1.0 + ); + } + if (this.options.maximizable){ + this.maximizebutton( + ctx2, + this.maximizebuttonX, + 7, + options.maximizeBgColor, + 1.0, + options.maximizeColor, + 1.0 + ); + } + if (this.options.minimizable){ + this.minimizebutton( + ctx2, + this.minimizebuttonX, + 7, + options.minimizeBgColor, + 1.0, + options.minimizeColor, + 1.0 + ); + } + + }, + drawBox: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + + var shadowBlur2x = shadowBlur * 2; + var cornerRadius = this.options.cornerRadius; + + // This is the drop shadow. It is created onion style. + if ( shadows != false ) { + for (var x = 0; x <= shadowBlur; x++){ + MochaUI.roundedRect( + ctx, + shadowOffset.x + x, + shadowOffset.y + x, + width - (x * 2) - shadowOffset.x, + height - (x * 2) - shadowOffset.y, + cornerRadius + (shadowBlur - x), + [0, 0, 0], + x == shadowBlur ? .29 : .065 + (x * .01) + ); + } + } + // Window body. + this.bodyRoundedRect( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + height - shadowBlur2x, // height + cornerRadius, // corner radius + this.options.bodyBgColor // Footer color + ); + + if (this.options.type != 'notification'){ + // Window header. + this.topRoundedRect( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + this.options.headerHeight, // height + cornerRadius, // corner radius + this.options.headerStartColor, // Header gradient's top color + this.options.headerStopColor // Header gradient's bottom color + ); + } + }, + drawBoxCollapsed: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + + var options = this.options; + var shadowBlur2x = shadowBlur * 2; + var cornerRadius = options.cornerRadius; + + // This is the drop shadow. It is created onion style. + if ( shadows != false ){ + for (var x = 0; x <= shadowBlur; x++){ + MochaUI.roundedRect( + ctx, + shadowOffset.x + x, + shadowOffset.y + x, + width - (x * 2) - shadowOffset.x, + height - (x * 2) - shadowOffset.y, + cornerRadius + (shadowBlur - x), + [0, 0, 0], + x == shadowBlur ? .3 : .06 + (x * .01) + ); + } + } + + // Window header + this.topRoundedRect2( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + options.headerHeight + 2, // height + cornerRadius, // corner radius + options.headerStartColor, // Header gradient's top color + options.headerStopColor // Header gradient's bottom color + ); + + }, + drawGauge: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + var options = this.options; + var radius = (width * .5) - (shadowBlur) + 16; + if (shadows != false) { + for (var x = 0; x <= shadowBlur; x++){ + MochaUI.circle( + ctx, + width * .5 + shadowOffset.x, + (height + options.headerHeight) * .5 + shadowOffset.x, + (width *.5) - (x * 2) - shadowOffset.x, + [0, 0, 0], + x == shadowBlur ? .75 : .075 + (x * .04) + ); + } + } + MochaUI.circle( + ctx, + width * .5 - shadowOffset.x, + (height + options.headerHeight) * .5 - shadowOffset.y, + (width *.5) - shadowBlur, + options.bodyBgColor, + 1 + ); + + // Draw gauge header + this.canvasHeaderEl.setStyles({ + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + var ctx = this.canvasHeaderEl.getContext('2d'); + ctx.clearRect(0, 0, width, 100); + ctx.beginPath(); + ctx.lineWidth = 24; + ctx.lineCap = 'round'; + ctx.moveTo(13, 13); + ctx.lineTo(width - (shadowBlur*2) - 13, 13); + ctx.strokeStyle = 'rgba(0, 0, 0, .65)'; + ctx.stroke(); + }, + bodyRoundedRect: function(ctx, x, y, width, height, radius, rgb){ + ctx.fillStyle = 'rgba(' + rgb.join(',') + ', 100)'; + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + + }, + topRoundedRect: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ + var lingrad = ctx.createLinearGradient(0, 0, 0, height); + lingrad.addColorStop(0, 'rgba(' + headerStartColor.join(',') + ', 1)'); + lingrad.addColorStop(1, 'rgba(' + headerStopColor.join(',') + ', 1)'); + ctx.fillStyle = lingrad; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x, y + height); + ctx.lineTo(x + width, y + height); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + /* + ctx.beginPath(); + ctx.strokeStyle = '#000'; + ctx.lineWidth = 1; + ctx.moveTo(x, y + height + .5); + ctx.lineTo(x + width, y + height + .5); + ctx.stroke(); + */ + + }, + topRoundedRect2: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ + var lingrad = ctx.createLinearGradient(0, this.options.shadowBlur - 1, 0, height + this.options.shadowBlur + 3); + lingrad.addColorStop(0, 'rgba(' + headerStartColor.join(',') + ', 1)'); + lingrad.addColorStop(1, 'rgba(' + headerStopColor.join(',') + ', 1)'); + ctx.fillStyle = lingrad; + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + }, + maximizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.arc(x, y, 7, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // X sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.beginPath(); + ctx.moveTo(x, y - 4); + ctx.lineTo(x, y + 4); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(x - 4, y); + ctx.lineTo(x + 4, y); + ctx.stroke(); + }, + closebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.arc(x, y, 7, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // Plus sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.beginPath(); + ctx.moveTo(x - 3, y - 3); + ctx.lineTo(x + 3, y + 3); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(x + 3, y - 3); + ctx.lineTo(x - 3, y + 3); + ctx.stroke(); + }, + minimizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.moveTo(x,y); + ctx.arc(x,y,7,0,Math.PI*2,true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // Minus sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.beginPath(); + ctx.moveTo(x - 4, y); + ctx.lineTo(x + 4, y); + ctx.stroke(); + }, + /* + + Function: hideSpinner + Hides the spinner. + + */ + hideSpinner: function(spinner) { + if ($(spinner)) $(spinner).setStyle('visibility', 'hidden'); + }, + /* + + Function: showSpinner + Shows the spinner. + + */ + showSpinner: function(spinner){ + if (!this.options.useSpinner || this.options.shape == 'gauge' || this.options.type == 'notification') return; + $(spinner).setStyles({ + 'visibility': 'visible' + }); + }, + setMochaControlsWidth: function(){ + this.mochaControlsWidth = 0; + var options = this.options; + if (options.minimizable){ + this.mochaControlsWidth += (this.minimizeButtonEl.getStyle('margin-left').toInt() + this.minimizeButtonEl.getStyle('width').toInt()); + } + if (options.maximizable){ + this.mochaControlsWidth += (this.maximizeButtonEl.getStyle('margin-left').toInt() + this.maximizeButtonEl.getStyle('width').toInt()); + } + if (options.closable){ + this.mochaControlsWidth += (this.closeButtonEl.getStyle('margin-left').toInt() + this.closeButtonEl.getStyle('width').toInt()); + } + this.controlsEl.setStyle('width', this.mochaControlsWidth); + if (options.useCanvasControls == true){ + this.canvasControlsEl.setProperty('width', this.mochaControlsWidth); + } + } +}); +MochaUI.Window.implement(new Options, new Events); +/* + +Script: Modal.js + Create modal dialog windows. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +See Also: + + +*/ + +MochaUI.Modal = new Class({ + + Extends: MochaUI.Window, + + Implements: [Events, Options], + + initialize: function(options){ + + this.modalInitialize(); + + window.addEvent('resize', function(){ + this.setModalSize(); + }.bind(this)); + + }, + modalInitialize: function(){ + var modalOverlay = new Element('div', { + 'id': 'modalOverlay', + 'styles': { + 'height': document.getCoordinates().height, + 'opacity': .6 + } + }).inject(document.body); + + modalOverlay.addEvent('click', function(e){ + MochaUI.closeWindow(MochaUI.currentModal); + }); + + if (Browser.Engine.trident4){ + var modalFix = new Element('iframe', { + 'id': 'modalFix', + 'scrolling': 'no', + 'marginWidth': 0, + 'marginHeight': 0, + 'src': '', + 'styles': { + 'height': document.getCoordinates().height + } + }).inject(document.body); + } + + this.modalOverlayOpenMorph = new Fx.Morph($('modalOverlay'), { + 'duration': 150 + }); + this.modalOverlayCloseMorph = new Fx.Morph($('modalOverlay'), { + 'duration': 150, + onComplete: function(){ + $('modalOverlay').setStyle('display', 'none'); + if (Browser.Engine.trident4){ + $('modalFix').setStyle('display', 'none'); + } + }.bind(this) + }); + }, + setModalSize: function(){ + $('modalOverlay').setStyle('height', document.getCoordinates().height); + if (Browser.Engine.trident4){ + $('modalFix').setStyle('height', document.getCoordinates().height); + } + } +}); +MochaUI.Modal.implement(new Options, new Events); +/* + +Script: Windows-from-html.js + Create windows from html markup in page. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Example: + HTML markup. + (start code) +
    +

    My Window

    +

    My Window Content

    +
    + (end) + +See Also: + + +*/ + +MochaUI.extend({ + NewWindowsFromHTML: function(){ + $$('div.mocha').each(function(el) { + // Get the window title and destroy that element, so it does not end up in window content + if ( Browser.Engine.presto || Browser.Engine.trident5 ){ + el.setStyle('display','block'); // Required by Opera, and probably IE7 + } + var title = el.getElement('h3.mochaTitle'); + var elDimensions = el.getStyles('height', 'width'); + var properties = { + id: el.getProperty('id'), + height: elDimensions.height.toInt(), + width: elDimensions.width.toInt(), + x: el.getStyle('left').toInt(), + y: el.getStyle('top').toInt() + }; + // If there is a title element, set title and destroy the element so it does not end up in window content + if ( title ) { + properties.title = title.innerHTML; + title.destroy(); + } + + // Get content and destroy the element + properties.content = el.innerHTML; + el.destroy(); + + // Create window + new MochaUI.Window(properties, true); + }.bind(this)); + } +}); +/* + +Script: Windows-from-json.js + Create one or more windows from JSON data. You can define all the same properties as you can for new MochaUI.Window(). Undefined properties are set to their defaults. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Syntax: + (start code) + MochaUI.newWindowsFromJSON(properties); + (end) + +Example: + (start code) + MochaUI.jsonWindows = function(){ + var url = 'data/json-windows-data.js'; + var request = new Request.JSON({ + url: url, + method: 'get', + onComplete: function(properties) { + MochaUI.newWindowsFromJSON(properties.windows); + } + }).send(); + } + (end) + +Note: + Windows created from JSON are not compatible with the current cookie based version + of Save and Load Workspace. + +See Also: + + +*/ + +MochaUI.extend({ + newWindowsFromJSON: function(properties){ + properties.each(function(properties) { + new MochaUI.Window(properties); + }.bind(this)); + } +}); +/* + +Script: Arrange-cascade.js + Cascade windows. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Syntax: + (start code) + MochaUI.arrangeCascade(); + (end) + +*/ + +MochaUI.options.extend({ + viewportTopOffset: 30, // Use a negative number if neccessary to place first window where you want it + viewportLeftOffset: 20, + windowTopOffset: 50, // Initial vertical spacing of each window + windowLeftOffset: 40 // Initial horizontal spacing of each window +}); + +MochaUI.extend({ + arrangeCascade: function(){ + // See how much space we have to work with + var coordinates = document.getCoordinates(); + + var openWindows = 0; + MochaUI.Windows.instances.each(function(instance){ + if (!instance.isMinimized) openWindows ++; + }); + + if ((this.options.windowTopOffset * (openWindows + 1)) >= (coordinates.height - this.options.viewportTopOffset)) { + var topOffset = (coordinates.height - this.options.viewportTopOffset) / (openWindows + 1); + } + else { + var topOffset = this.options.windowTopOffset; + } + + if ((this.options.windowLeftOffset * (openWindows + 1)) >= (coordinates.width - this.options.viewportLeftOffset - 20)) { + var leftOffset = (coordinates.width - this.options.viewportLeftOffset - 20) / (openWindows + 1); + } + else { + var leftOffset = this.options.windowLeftOffset; + } + + var x = this.options.viewportLeftOffset; + var y = this.options.viewportTopOffset; + $$('div.mocha').each(function(windowEl){ + var currentWindowClass = MochaUI.Windows.instances.get(windowEl.id); + if (!currentWindowClass.isMinimized && !currentWindowClass.isMaximized){ + id = windowEl.id; + MochaUI.focusWindow(windowEl); + x += leftOffset; + y += topOffset; + + if (MochaUI.options.useEffects == false){ + windowEl.setStyles({ + 'top': y, + 'left': x + }); + } + else { + var cascadeMorph = new Fx.Morph(windowEl, { + 'duration': 550 + }); + cascadeMorph.start({ + 'top': y, + 'left': x + }); + } + } + }.bind(this)); + } +}); +/* + +Script: Arrange-tile.js + Cascade windows. + +Authors: + Harry Roberts and Greg Houston + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Syntax: + (start code) + MochaUI.arrangeTile(); + (end) + +*/ + +MochaUI.extend({ + arrangeTile: function(){ + var x = 10; + var y = 10; + + var instances = MochaUI.Windows.instances; + + var windowsNum = 0; + + instances.each(function(instance){ + if (!instance.isMinimized && !instance.isMaximized){ + windowsNum++; + } + }); + + var cols = 3; + var rows = Math.ceil(windowsNum / cols); + + var coordinates = document.getCoordinates(); + + var col_width = ((coordinates.width - this.options.viewportLeftOffset) / cols); + var col_height = ((coordinates.height - this.options.viewportTopOffset) / rows); + + var row = 0; + var col = 0; + + instances.each(function(instance){ + if (!instance.isMinimized && !instance.isMaximized){ + + var content = instance.contentWrapperEl; + var content_coords = content.getCoordinates(); + var window_coords = instance.windowEl.getCoordinates(); + + // Calculate the amount of padding around the content window + var padding_top = content_coords.top - window_coords.top; + var padding_bottom = window_coords.height - content_coords.height - padding_top; + var padding_left = content_coords.left - window_coords.left; + var padding_right = window_coords.width - content_coords.width - padding_left; + + /* + + // This resizes the windows + if (instance.options.shape != 'gauge' && instance.options.resizable == true){ + var width = (col_width - 3 - padding_left - padding_right); + var height = (col_height - 3 - padding_top - padding_bottom); + + if (width > instance.options.resizeLimit.x[0] && width < instance.options.resizeLimit.x[1]){ + content.setStyle('width', width); + } + if (height > instance.options.resizeLimit.y[0] && height < instance.options.resizeLimit.y[1]){ + content.setStyle('height', height); + } + + }*/ + + var left = (x + (col * col_width)); + var top = (y + (row * col_height)); + + instance.windowEl.setStyles({ + 'left': left, + 'top': top + }); + + instance.drawWindow(instance.windowEl); + + MochaUI.focusWindow(instance.windowEl); + + if (++col === cols) { + row++; + col = 0; + } + } + }.bind(this)); + } +});/* + +Script: Tabs.js + Functionality for window tabs. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js (for tabbed windows) or Layout.js (for tabbed panels) + +*/ + +MochaUI.extend({ + /* + + Function: initializeTabs + Add click event to each list item that fires the selected function. + + */ + initializeTabs: function(el){ + $(el).getElements('li').each(function(listitem){ + listitem.addEvent('click', function(e){ + MochaUI.selected(this, el); + }); + }); + }, + /* + + Function: selected + Add "selected" class to current list item and remove it from sibling list items. + + Syntax: + (start code) + selected(el, parent); + (end) + +Arguments: + el - the list item + parent - the ul + + */ + selected: function(el, parent){ + $(parent).getChildren().each(function(listitem){ + listitem.removeClass('selected'); + }); + el.addClass('selected'); + } +}); + +/* + +Script: Layout.js + Create web application layouts. Enables window maximize. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +*/ + +MochaUI.Desktop = new Class({ + + Extends: MochaUI.Window, + + Implements: [Events, Options], + + options: { + // Naming options: + // If you change the IDs of the Mocha Desktop containers in your HTML, you need to change them here as well. + desktop: 'desktop', + desktopHeader: 'desktopHeader', + desktopFooter: 'desktopFooter', + desktopNavBar: 'desktopNavbar', + pageWrapper: 'pageWrapper', + page: 'page', + desktopFooter: 'desktopFooterWrapper' + }, + initialize: function(options){ + this.setOptions(options); + this.desktop = $(this.options.desktop); + this.desktopHeader = $(this.options.desktopHeader); + this.desktopNavBar = $(this.options.desktopNavBar); + this.pageWrapper = $(this.options.pageWrapper); + this.page = $(this.options.page); + this.desktopFooter = $(this.options.desktopFooter); + + // This is run on dock initialize so no need to do it twice. + if (!MochaUI.Dock.dockWrapper){ + this.setDesktopSize(); + } + this.menuInitialize(); + + // Resize desktop, page wrapper, modal overlay, and maximized windows when browser window is resized + window.addEvent('resize', function(e){ + this.onBrowserResize(); + }.bind(this)); + }, + menuInitialize: function(){ + // Fix for dropdown menus in IE6 + if (Browser.Engine.trident4 && this.desktopNavBar){ + this.desktopNavBar.getElements('li').each(function(element) { + element.addEvent('mouseenter', function(){ + this.addClass('ieHover'); + }); + element.addEvent('mouseleave', function(){ + this.removeClass('ieHover'); + }); + }); + }; + }, + onBrowserResize: function(){ + this.setDesktopSize(); + // Resize maximized windows to fit new browser window size + setTimeout( function(){ + MochaUI.Windows.instances.each(function(instance){ + if (instance.isMaximized){ + + // Hide iframe while resize for better performance + if ( instance.iframeEl ){ + instance.iframeEl.setStyle('visibility', 'hidden'); + } + + var coordinates = document.getCoordinates(); + var borderHeight = instance.contentBorderEl.getStyle('border-top').toInt() + instance.contentBorderEl.getStyle('border-bottom').toInt(); + var toolbarHeight = instance.toolbarWrapperEl ? instance.toolbarWrapperEl.getStyle('height').toInt() + instance.toolbarWrapperEl.getStyle('border-top').toInt() : 0; + instance.contentWrapperEl.setStyles({ + 'height': coordinates.height - instance.options.headerHeight - instance.options.footerHeight - borderHeight - toolbarHeight, + 'width': coordinates.width + }); + + instance.drawWindow($(instance.options.id)); + if ( instance.iframeEl ){ + instance.iframeEl.setStyles({ + 'height': instance.contentWrapperEl.getStyle('height') + }); + instance.iframeEl.setStyle('visibility', 'visible'); + } + + } + }.bind(this)); + }.bind(this), 100); + }, + setDesktopSize: function(){ + var windowDimensions = window.getCoordinates(); + + // var dock = $(MochaUI.options.dock); + var dockWrapper = $(MochaUI.options.dockWrapper); + + // Setting the desktop height may only be needed by IE7 + if (this.desktop){ + this.desktop.setStyle('height', windowDimensions.height); + } + + // Set pageWrapper height so the dock doesn't cover the pageWrapper scrollbars. + if (this.pageWrapper) { + + var dockOffset = MochaUI.dockVisible ? dockWrapper.offsetHeight : 0; + var pageWrapperHeight = windowDimensions.height; + pageWrapperHeight -= this.pageWrapper.getStyle('border-top').toInt(); + pageWrapperHeight -= this.pageWrapper.getStyle('border-bottom').toInt(); + if (this.desktopHeader){ pageWrapperHeight -= this.desktopHeader.offsetHeight; } + if (this.desktopFooter){ pageWrapperHeight -= this.desktopFooter.offsetHeight; } + pageWrapperHeight -= dockOffset; + + if (pageWrapperHeight < 0){ + pageWrapperHeight = 0; + } + this.pageWrapper.setStyle('height', pageWrapperHeight); + } + + if (MochaUI.Columns.instances.getKeys().length > 0){ // Conditional is a fix for a bug in IE6 in the no toolbars demo. + MochaUI.Desktop.resizePanels(); + } + }, + resizePanels: function(){ + if (Browser.Engine.trident4){ + $$('.pad').setStyle('display', 'none'); + $$('.rHeight').setStyle('height', 1); + } + MochaUI.panelHeight(); + MochaUI.rWidth(); + if (Browser.Engine.trident4) $$('.pad').setStyle('display', 'block'); + }, + /* + + Function: maximizeWindow + Maximize a window. + + Syntax: + (start code) + MochaUI.Desktop.maximizeWindow(windowEl); + (end) + + */ + maximizeWindow: function(windowEl){ + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + var options = currentInstance.options; + var windowDrag = currentInstance.windowDrag; + + // If window no longer exists or is maximized, stop + if (windowEl != $(windowEl) || currentInstance.isMaximized ) return; + + if (currentInstance.isCollapsed){ + MochaUI.collapseToggle(windowEl); + } + + currentInstance.isMaximized = true; + + // If window is restricted to a container, it should not be draggable when maximized. + if (currentInstance.options.restrict){ + windowDrag.detach(); + if (options.resizable) { + currentInstance.detachResizable(); + } + currentInstance.titleBarEl.setStyle('cursor', 'default'); + } + + // If the window has a container that is not the desktop + // temporarily move the window to the desktop while it is minimized. + if (options.container != this.desktop){ + this.desktop.grab(windowEl); + if (this.options.restrict){ + windowDrag.container = this.desktop; + } + } + + // Save original position + currentInstance.oldTop = windowEl.getStyle('top'); + currentInstance.oldLeft = windowEl.getStyle('left'); + + var contentWrapperEl = currentInstance.contentWrapperEl; + + // Save original dimensions + contentWrapperEl.oldWidth = contentWrapperEl.getStyle('width'); + contentWrapperEl.oldHeight = contentWrapperEl.getStyle('height'); + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'hidden'); + } + + var windowDimensions = document.getCoordinates(); + var options = currentInstance.options; + var shadowBlur = options.shadowBlur; + var shadowOffset = options.shadowOffset; + var newHeight = windowDimensions.height - options.headerHeight - options.footerHeight; + newHeight -= currentInstance.contentBorderEl.getStyle('border-top').toInt(); + newHeight -= currentInstance.contentBorderEl.getStyle('border-bottom').toInt(); + newHeight -= ( currentInstance.toolbarWrapperEl ? currentInstance.toolbarWrapperEl.getStyle('height').toInt() + currentInstance.toolbarWrapperEl.getStyle('border-top').toInt() : 0); + + if (MochaUI.options.useEffects == false){ + windowEl.setStyles({ + 'top': shadowOffset.y - shadowBlur, + 'left': shadowOffset.x - shadowBlur + }); + currentInstance.contentWrapperEl.setStyles({ + 'height': newHeight, + 'width': windowDimensions.width + }); + currentInstance.drawWindow(windowEl); + // Show iframe + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + currentInstance.fireEvent('onMaximize', windowEl); + } + else { + + // Todo: Initialize the variables for these morphs once in an initialize function and reuse them + + var maximizeMorph = new Fx.Elements([contentWrapperEl, windowEl], { + duration: 70, + onStart: function(windowEl){ + currentInstance.maximizeAnimation = currentInstance.drawWindow.periodical(20, currentInstance, windowEl); + }.bind(this), + onComplete: function(windowEl){ + $clear(currentInstance.maximizeAnimation); + currentInstance.drawWindow(windowEl); + // Show iframe + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + currentInstance.fireEvent('onMaximize', windowEl); + }.bind(this) + }); + maximizeMorph.start({ + '0': { 'height': newHeight, + 'width': windowDimensions.width + }, + '1': { 'top': shadowOffset.y - shadowBlur, + 'left': shadowOffset.x - shadowBlur + } + }); + } + currentInstance.maximizeButtonEl.setProperty('title', 'Restore'); + MochaUI.focusWindow(windowEl); + + }, + /* + + Function: restoreWindow + Restore a maximized window. + + Syntax: + (start code) + MochaUI.Desktop.restoreWindow(windowEl); + (end) + + */ + restoreWindow: function(windowEl){ + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + + // Window exists and is maximized ? + if (windowEl != $(windowEl) || !currentInstance.isMaximized) return; + + var options = currentInstance.options; + currentInstance.isMaximized = false; + + if (options.restrict){ + currentInstance.windowDrag.attach(); + if (options.resizable){ + currentInstance.reattachResizable(); + } + currentInstance.titleBarEl.setStyle('cursor', 'move'); + } + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'hidden'); + } + + var contentWrapperEl = currentInstance.contentWrapperEl; + + if (MochaUI.options.useEffects == false){ + contentWrapperEl.setStyles({ + 'width': contentWrapperEl.oldWidth, + 'height': contentWrapperEl.oldHeight + }); + currentInstance.drawWindow(windowEl); + windowEl.setStyles({ + 'top': currentInstance.oldTop, + 'left': currentInstance.oldLeft + }); + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + if (options.container != this.desktop){ + $(options.container).grab(windowEl); + if (options.restrict){ + currentInstance.windowDrag.container = $(options.container); + } + } + currentInstance.fireEvent('onRestore', windowEl); + } + else { + var restoreMorph = new Fx.Elements([contentWrapperEl, windowEl], { + 'duration': 150, + 'onStart': function(windowEl){ + currentInstance.maximizeAnimation = currentInstance.drawWindow.periodical(20, currentInstance, windowEl); + }.bind(this), + 'onComplete': function(el){ + $clear(currentInstance.maximizeAnimation); + currentInstance.drawWindow(windowEl); + if (currentInstance.iframeEl){ + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + if (options.container != this.desktop){ + $(options.container).grab(windowEl); + if (options.restrict){ + currentInstance.windowDrag.container = $(options.container); + } + } + currentInstance.fireEvent('onRestore', windowEl); + }.bind(this) + }); + restoreMorph.start({ + '0': { 'height': contentWrapperEl.oldHeight, + 'width': contentWrapperEl.oldWidth + }, + '1': { 'top': currentInstance.oldTop, + 'left': currentInstance.oldLeft + } + }); + } + currentInstance.maximizeButtonEl.setProperty('title', 'Maximize'); + } +}); +MochaUI.Desktop.implement(new Options, new Events); + +/* + +Class: Column + Create a column. Columns should be created from left to right. + +Syntax: +(start code) + MochaUI.Panel(); +(end) + +Arguments: + options + +Options: + id - The ID of the column. This must be set when creating the column. + placement - Can be 'right', 'main', or 'left'. There must be at least one column with the 'main' option. + width - 'main' column is fluid and should not be given a width. + resizeLimit - resizelimit of a 'right' or 'left' column. + onResize - (function) Fired when the column is resized. + onCollapse - (function) Fired when the column is collapsed. + onExpand - (function) Fired when the column is expanded. + +*/ +MochaUI.Column = new Class({ + + Extends: MochaUI.Desktop, + + Implements: [Events, Options], + + options: { + id: null, + placement: null, + width: null, + resizeLimit: [], + + // Events + onResize: $empty, + onCollapse: $empty, + onExpand: $empty + + }, + initialize: function(options){ + this.setOptions(options); + + $extend(this, { + timestamp: $time(), + isCollapsed: false, + oldWidth: 0 + }); + + // Shorten object chain + var options = this.options; + var instances = MochaUI.Columns.instances; + var instanceID = instances.get(options.id); + + // Check to see if there is already a class instance for this Column + if (instanceID){ + var currentInstance = instanceID; + } + + // Check if column already exists + if ( this.columnEl ){ + return; + } + else { + instances.set(options.id, this); + } + + this.columnEl = new Element('div', { + 'id': this.options.id, + 'class': 'column expanded', + 'styles': { + 'width': options.placement == 'main' ? null : options.width + } + }).inject($(MochaUI.Desktop.pageWrapper)); + + var parent = this.columnEl.getParent(); + var columnHeight = parent.getStyle('height').toInt(); + this.columnEl.setStyle('height', columnHeight); + + if (options.placement == 'main'){ + this.columnEl.addClass('rWidth'); + } + + this.spacerEl = new Element('div', { + 'id': this.options.id + '_spacer', + 'class': 'horizontalHandle' + }).inject(this.columnEl); + + switch (this.options.placement) { + case 'left': + this.handleEl = new Element('div', { + 'id': this.options.id + '_handle', + 'class': 'columnHandle' + }).inject(this.columnEl, 'after'); + + this.handleIconEl = new Element('div', { + 'id': options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + + addResizeRight(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); + break; + case 'right': + this.handleEl = new Element('div', { + 'id': this.options.id + '_handle', + 'class': 'columnHandle' + }).inject(this.columnEl, 'before'); + + this.handleIconEl = new Element('div', { + 'id': options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + addResizeLeft(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); + break; + } + + if (this.handleEl != null){ + this.handleEl.addEvent('dblclick', function(){ + this.columnToggle(); + }.bind(this)); + } + + MochaUI.rWidth(); + + }, + columnToggle: function(){ + var column= this.columnEl; + + // Collapse + if (this.isCollapsed == false){ + this.oldWidth = column.getStyle('width').toInt(); + + this.resize.detach(); + this.handleEl.removeEvents('dblclick'); + this.handleEl.addEvent('click', function(){ + this.columnToggle(); + }.bind(this)); + this.handleEl.setStyle('cursor', 'pointer').addClass('detached'); + + column.setStyle('width', 0); + this.isCollapsed = true; + column.addClass('collapsed'); + column.removeClass('expanded'); + + MochaUI.rWidth(); + this.fireEvent('onCollapse'); + } + // Expand + else { + column.setStyle('width', this.oldWidth); + this.isCollapsed = false; + column.addClass('expanded'); + column.removeClass('collapsed'); + + this.handleEl.removeEvents('click'); + this.handleEl.addEvent('dblclick', function(){ + this.columnToggle(); + }.bind(this)); + this.resize.attach(); + this.handleEl.setStyle('cursor', 'e-resize').addClass('attached'); + + MochaUI.rWidth(); + this.fireEvent('onExpand'); + } + } +}); +MochaUI.Column.implement(new Options, new Events); + +/* + +Class: Panel + Create a panel. Panels go one on top of another in columns. Create your columns first and then add your panels. Panels should be created from top to bottom, left to right. + +Syntax: +(start code) + MochaUI.Panel(); +(end) + +Arguments: + options + +Options: + id - The ID of the panel. This must be set when creating the panel. + column - Where to inject the panel. This must be set when creating the panel. + loadMethod - ('html', 'xhr', or 'iframe') + contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. + evalScripts - (boolean) An xhr loadMethod option. Defaults to true. + evalResponse - (boolean) An xhr loadMethod option. Defaults to false. + content - (string or element) An html loadMethod option. + tabsURL - (url) + footer - (boolean) + footerURL - (url) + height - (number) Height of content area. + addClass - (string) Add a class to the panel. + scrollbars - (boolean) + padding - (object) + panelBackground - CSS background property for the panel. + onBeforeBuild - (function) Fired before the panel is created. + onContentLoaded - (function) Fired after the panel's conten is loaded. + onResize - (function) Fired when the panel is resized. + onCollapse - (function) Fired when the panel is collapsed. + onExpand - (function) Fired when the panel is expanded. + +*/ +MochaUI.Panel = new Class({ + + Extends: MochaUI.Desktop, + + Implements: [Events, Options], + + options: { + id: null, + title: 'New Panel', + column: null, + loadMethod: 'html', + contentURL: 'pages/lipsum.html', + + // xhr options + evalScripts: true, + evalResponse: false, + + // html options + content: 'Panel content', + + // Tabs + tabsURL: null, + + footer: false, + footerURL: 'pages/lipsum.html', + + // Style options: + height: 125, + addClass: '', + scrollbars: true, + padding: { top: 8, right: 8, bottom: 8, left: 8 }, + + // Color options: + panelBackground: '#f8f8f8', + + // Events + onBeforeBuild: $empty, + onContentLoaded: $empty, + onResize: $empty, + onCollapse: $empty, + onExpand: $empty + + }, + initialize: function(options){ + this.setOptions(options); + + $extend(this, { + timestamp: $time(), + isCollapsed: false, + oldHeight: 0, + partner: null + }); + + // Shorten object chain + var instances = MochaUI.Panels.instances; + var instanceID = instances.get(this.options.id); + + // Check to see if there is already a class instance for this panel + if (instanceID){ + var currentInstance = instanceID; + } + + // Check if panel already exists + if ( this.panelEl ){ + return; + } + else { + instances.set(this.options.id, this); + } + + this.fireEvent('onBeforeBuild'); + + if (this.options.loadMethod == 'iframe') { + // Iframes have their own scrollbars and padding. + this.options.scrollbars = false; + this.options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; + } + + this.showHandle = true; + if ($(this.options.column).getChildren().length == 0){ + this.showHandle = false; + } + + this.panelEl = new Element('div', { + 'id': this.options.id, + 'class': 'panel expanded', + 'styles': { + 'height': this.options.height, + 'background': this.options.panelBackground + } + }).inject($(this.options.column)); + + this.panelEl.addClass(this.options.addClass); + + this.contentEl = new Element('div', { + 'id': this.options.id + '_pad', + 'class': 'pad' + }).inject(this.panelEl); + + if (this.options.footer){ + this.footerWrapperEl = new Element('div', { + 'id': this.options.id + '_panelFooterWrapper', + 'class': 'panel-footerWrapper' + }).inject(this.panelEl); + + this.footerEl = new Element('div', { + 'id': this.options.id + '_panelFooter', + 'class': 'panel-footer' + }).inject(this.footerWrapperEl); + + + MochaUI.updateContent({ + 'element': this.panelEl, + 'childElement': this.footerEl, + 'loadMethod': 'xhr', + 'url': this.options.footerURL + }); + + } + + // This is in order to use the same variable as the windows do in updateContent. + // May rethink this. + this.contentWrapperEl = this.panelEl; + + // Set scrollbars, always use 'hidden' for iframe windows + this.contentWrapperEl.setStyles({ + 'overflow': this.options.scrollbars && !this.iframeEl ? 'auto' : 'hidden' + }); + + this.contentEl.setStyles({ + 'padding-top': this.options.padding.top, + 'padding-bottom': this.options.padding.bottom, + 'padding-left': this.options.padding.left, + 'padding-right': this.options.padding.right + }); + + this.panelHeaderEl = new Element('div', { + 'id': this.options.id + '_header', + 'class': 'panel-header' + }).inject(this.panelEl, 'before'); + + this.panelHeaderToolboxEl = new Element('div', { + 'id': this.options.id + '_headerToolbox', + 'class': 'panel-header-toolbox' + }).inject(this.panelHeaderEl); + + this.collapseToggleEl = new Element('div', { + 'id': this.options.id + '_minmize', + 'class': 'panel-collapse icon16', + 'styles': { + 'width': 16, + 'height': 16 + }, + 'title': 'Collapse Panel' + }).inject(this.panelHeaderToolboxEl); + + this.collapseToggleEl.addEvent('click', function(event){ + var panel = this.panelEl; + + // Get siblings and make sure they are not all collapsed. + var instances = MochaUI.Panels.instances; + var expandedSiblings = []; + panel.getAllPrevious('.panel').each(function(sibling){ + var currentInstance = instances.get(sibling.id); + if (currentInstance.isCollapsed == false){ + expandedSiblings.push(sibling); + } + }); + panel.getAllNext('.panel').each(function(sibling){ + var currentInstance = instances.get(sibling.id); + if (currentInstance.isCollapsed == false){ + expandedSiblings.push(sibling); + } + }); + + if (this.isCollapsed == false) { + var currentColumn = MochaUI.Columns.instances.get($(this.options.column).id); + + if (expandedSiblings.length == 0 && currentColumn.options.placement != 'main'){ + var currentColumn = MochaUI.Columns.instances.get($(this.options.column).id); + currentColumn.columnToggle(); + return; + } + else if (expandedSiblings.length == 0 && currentColumn.options.placement == 'main'){ + return; + } + this.oldHeight = panel.getStyle('height').toInt(); + if (this.oldHeight < 10) this.oldHeight = 20; + panel.setStyle('height', 0); + this.isCollapsed = true; + panel.addClass('collapsed'); + panel.removeClass('expanded'); + MochaUI.panelHeight(this.options.column, panel, 'collapsing'); + this.collapseToggleEl.removeClass('panel-collapsed'); + this.collapseToggleEl.addClass('panel-expand'); + this.collapseToggleEl.setProperty('title','Expand Panel'); + this.fireEvent('onCollapse'); + } + else { + panel.setStyle('height', this.oldHeight); + this.isCollapsed = false; + panel.addClass('expanded'); + panel.removeClass('collapsed'); + MochaUI.panelHeight(this.options.column, panel, 'expanding'); + this.collapseToggleEl.removeClass('panel-expand'); + this.collapseToggleEl.addClass('panel-collapsed'); + this.collapseToggleEl.setProperty('title','Collapse Panel'); + this.fireEvent('onExpand'); + } + } + .bind(this)); + + this.panelHeaderContentEl = new Element('div', { + 'id': this.options.id + '_headerContent', + 'class': 'panel-headerContent' + }).inject(this.panelHeaderEl); + + this.titleEl = new Element('h2', { + 'id': this.options.id + '_title' + }).inject(this.panelHeaderContentEl); + + if (this.options.tabsURL == null){ + this.titleEl.set('html', this.options.title); + } + else { + this.panelHeaderContentEl.addClass('tabs'); + MochaUI.updateContent({ + 'element': this.panelEl, + 'childElement': this.panelHeaderContentEl, + 'loadMethod': 'xhr', + 'url': this.options.tabsURL + }); + } + + this.handleEl = new Element('div', { + 'id': this.options.id + '_handle', + 'class': 'horizontalHandle', + 'styles': { + 'display': this.showHandle == true ? 'block' : 'none' + } + }).inject(this.panelEl, 'after'); + + this.handleIconEl = new Element('div', { + 'id': this.options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + + addResizeBottom(this.options.id); + + // Add content to panel. + MochaUI.updateContent({ + 'element': this.panelEl, + 'content': this.options.content, + 'url': this.options.contentURL + }); + + MochaUI.panelHeight(this.options.column, this.panelEl, 'new'); + + } +}); +MochaUI.Panel.implement(new Options, new Events); + + +MochaUI.extend({ + // Panel Height + panelHeight: function(column, changing, action){ + if (column != null) { + MochaUI.panelHeight2($(column), changing, action); + } + else { + $$('.column').each(function(column){ + MochaUI.panelHeight2(column); + }.bind(this)); + } + }, + /* + + actions can be new, collapsing or expanding. + + */ + panelHeight2: function(column, changing, action){ + + var instances = MochaUI.Panels.instances; + + var parent = column.getParent(); + var columnHeight = parent.getStyle('height').toInt(); + if (Browser.Engine.trident4){ + columnHeight -= 1; + } + column.setStyle('height', columnHeight); + + var panels = column.getChildren('.panel'); // All the panels in the column. + var panelsExpanded = column.getChildren('.expanded'); // All the expanded panels in the column. + var panelsToResize = []; // All the panels in the column whose height will be effected. + var tallestPanel; // The panel with the greatest height + var tallestPanelHeight = 0; + + this.panelsHeight = 0; // Height of all the panels in the column + this.height = 0; // Height of all the elements in the column + + // Set panel resize partners + panels.each(function(panel){ + currentInstance = instances.get(panel.id); + if (panel.hasClass('expanded') && panel.getNext('.expanded')){ + currentInstance.partner = panel.getNext('.expanded'); + currentInstance.resize.attach(); + currentInstance.handleEl.setStyles({ + 'display': 'block', + 'cursor': 'n-resize' + }).removeClass('detached'); + } + else { + currentInstance.resize.detach(); + currentInstance.handleEl.setStyle('cursor', null).addClass('detached'); + } + if (panel.getNext('.panel') == null){ + currentInstance.handleEl.setStyle('display', 'none'); + } + }.bind(this)); + + // Get the total height of all the column's children + column.getChildren().each(function(el){ + + if (el.hasClass('panel')){ + var currentInstance = instances.get(el.id); + + // Are any next siblings Expanded? + areAnyNextSiblingsExpanded = function(el){ + var test; + el.getAllNext('.panel').each(function(sibling){ + var siblingInstance = instances.get(sibling.id); + if (siblingInstance.isCollapsed == false){ + test = true; + } + }.bind(this)); + return test; + }.bind(this); + + // If a next sibling is expanding, are any of the nexts siblings of the expanding sibling Expanded? + areAnyExpandingNextSiblingsExpanded = function(){ + var test; + changing.getAllNext('.panel').each(function(sibling){ + var siblingInstance = instances.get(sibling.id); + if (siblingInstance.isCollapsed == false){ + test = true; + } + }.bind(this)); + return test; + }.bind(this); + + // Resize panels that are not collapsed or "new" + if (action == 'new' ) { + if (currentInstance.isCollapsed != true && el != changing) { + panelsToResize.push(el); + } + + // Height of panels that can be resized + if (currentInstance.isCollapsed != true && el != changing) { + this.panelsHeight += el.offsetHeight.toInt(); + } + } + // Resize panels that are not collapsed. If a panel is collapsing + // resize any expanded panels below. If there are no expanded panels + // below it, resize the expanded panels above it. + else if (action == null || action == 'collapsing' ){ + if (currentInstance.isCollapsed != true && (el.getAllNext('.panel').contains(changing) != true || areAnyNextSiblingsExpanded(el) != true)){ + panelsToResize.push(el); + } + + // Height of panels that can be resized + if (currentInstance.isCollapsed != true && (el.getAllNext('.panel').contains(changing) != true || areAnyNextSiblingsExpanded(el) != true)){ + this.panelsHeight += el.offsetHeight.toInt(); + } + } + // Resize panels that are not collapsed and are not expanding. + // Resize any expanded panels below the expanding panel. If there are no expanded panels + // below it, resize the first expanded panel above it. + else if (action == 'expanding'){ + + if (currentInstance.isCollapsed != true && (el.getAllNext('.panel').contains(changing) != true || (areAnyExpandingNextSiblingsExpanded() != true && el.getNext('.expanded') == changing)) && el != changing){ + panelsToResize.push(el); + } + // Height of panels that can be resized + if (currentInstance.isCollapsed != true && (el.getAllNext('.panel').contains(changing) != true || (areAnyExpandingNextSiblingsExpanded() != true && el.getNext('.expanded') == changing)) && el != changing){ + this.panelsHeight += el.offsetHeight.toInt(); + } + } + + if (el.style.height){ + this.height += el.getStyle('height').toInt(); + } + } + else { + this.height += el.offsetHeight.toInt(); + } + }.bind(this)); + + // Get the remaining height + var remainingHeight = column.offsetHeight.toInt() - this.height; + + this.height = 0; + + // Get height of all the column's children + column.getChildren().each(function(el){ + this.height += el.offsetHeight.toInt(); + }.bind(this)); + + var remainingHeight = column.offsetHeight.toInt() - this.height; + + panelsToResize.each(function(panel){ + var ratio = this.panelsHeight / panel.offsetHeight.toInt(); + var newPanelHeight = panel.getStyle('height').toInt() + (remainingHeight / ratio); + if (newPanelHeight < 1){ + newPanelHeight = 0; + } + panel.setStyle('height', newPanelHeight); + }.bind(this)); + + // Make sure the remaining height is 0. If not add/subtract the + // remaining height to the tallest panel. This makes up for browser resizing, + // off ratios, and users trying to give panels too much height. + + // Get height of all the column's children + this.height = 0; + column.getChildren().each(function(el){ + this.height += el.offsetHeight.toInt(); + if (el.hasClass('panel') && el.getStyle('height').toInt() > tallestPanelHeight){ + tallestPanel = el; + tallestPanelHeight = el.getStyle('height').toInt(); + } + }.bind(this)); + + var remainingHeight = column.offsetHeight.toInt() - this.height; + + if ((remainingHeight > 0 || remainingHeight < 0) && tallestPanelHeight > 0){ + tallestPanel.setStyle('height', tallestPanel.getStyle('height').toInt() + remainingHeight ); + if (tallestPanel.getStyle('height') < 1){ + tallestPanel.setStyle('height', 0 ); + } + } + + $$('.columnHandle').each(function(handle){ + var handleHeight = parent.getStyle('height').toInt() - handle.getStyle('border-top').toInt() - handle.getStyle('border-bottom').toInt(); + if (Browser.Engine.trident4){ + handleHeight -= 1; + } + handle.setStyle('height', handleHeight); + }); + + panelsExpanded.each(function(panel){ + MochaUI.resizeChildren(panel); + }.bind(this)); + }, + // May rename this resizeIframeEl() + resizeChildren: function(panel){ + var instances = MochaUI.Panels.instances; + var currentInstance = instances.get(panel.id); + var contentWrapperEl = currentInstance.contentWrapperEl; + + if (currentInstance.iframeEl){ + currentInstance.iframeEl.setStyles({ + 'height': contentWrapperEl.getStyle('height'), + 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('border-left').toInt() - contentWrapperEl.getStyle('border-right').toInt() + }); + } + }, + // Remaining Width + rWidth: function(){ + $$('.rWidth').each(function(column){ + var currentWidth = column.offsetWidth.toInt(); + currentWidth -= column.getStyle('border-left').toInt(); + currentWidth -= column.getStyle('border-right').toInt(); + + var parent = column.getParent(); + this.width = 0; + + // Get the total width of all the parent element's children + parent.getChildren().each(function(el){ + if (el.hasClass('mocha') != true){ + this.width += el.offsetWidth.toInt(); + } + }.bind(this)); + + // Add the remaining width to the current element + var remainingWidth = parent.offsetWidth.toInt() - this.width; + var newWidth = currentWidth + remainingWidth; + if (newWidth < 1) newWidth = 0; + column.setStyle('width', newWidth); + column.getChildren('.panel').each(function(panel){ + panel.setStyle('width', newWidth - panel.getStyle('border-left').toInt() - panel.getStyle('border-right').toInt()); + MochaUI.resizeChildren(panel); + }.bind(this)); + }); + } + +}); + +function addResizeRight(element, min, max){ + if (!$(element)) return; + element = $(element); + + var instances = MochaUI.Columns.instances; + var currentInstance = instances.get(element.id); + + var handle = element.getNext('.columnHandle'); + handle.setStyle('cursor', 'e-resize'); + if (!min) min = 50; + if (!max) max = 250; + if (Browser.Engine.trident){ + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + currentInstance.resize = element.makeResizable({ + handle: handle, + modifiers: {x: 'width', y: false}, + limit: { x: [min, max] }, + onStart: function(){ + element.getElements('iframe').setStyle('visibility','hidden'); + element.getNext('.column').getElements('iframe').setStyle('visibility','hidden'); + }.bind(this), + onDrag: function(){ + MochaUI.rWidth(); + if (Browser.Engine.trident4){ + element.getChildren().each(function(el){ + var width = $(element).getStyle('width').toInt(); + width -= el.getStyle('border-right').toInt(); + width -= el.getStyle('border-left').toInt(); + width -= el.getStyle('padding-right').toInt(); + width -= el.getStyle('padding-left').toInt(); + el.setStyle('width', width); + }.bind(this)); + } + }.bind(this), + onComplete: function(){ + MochaUI.rWidth(); + element.getElements('iframe').setStyle('visibility','visible'); + element.getNext('.column').getElements('iframe').setStyle('visibility','visible'); + currentInstance.fireEvent('onResize'); + }.bind(this) + }); +} + +function addResizeLeft(element, min, max){ + if (!$(element)) return; + element = $(element); + + var instances = MochaUI.Columns.instances; + var currentInstance = instances.get(element.id); + + var handle = element.getPrevious('.columnHandle'); + handle.setStyle('cursor', 'e-resize'); + var partner = element.getPrevious('.column'); + if (!min) min = 50; + if (!max) max = 250; + if (Browser.Engine.trident){ + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + currentInstance.resize = element.makeResizable({ + handle: handle, + modifiers: {x: 'width' , y: false}, + invert: true, + limit: { x: [min, max] }, + onStart: function(){ + $(element).getElements('iframe').setStyle('visibility','hidden'); + partner.getElements('iframe').setStyle('visibility','hidden'); + }.bind(this), + onDrag: function(){ + MochaUI.rWidth(); + }.bind(this), + onComplete: function(){ + MochaUI.rWidth(); + $(element).getElements('iframe').setStyle('visibility','visible'); + partner.getElements('iframe').setStyle('visibility','visible'); + currentInstance.fireEvent('onResize'); + }.bind(this) + }); +} + +function addResizeBottom(element){ + if (!$(element)) return; + var element = $(element); + + var instances = MochaUI.Panels.instances; + var currentInstance = instances.get(element.id); + var handle = currentInstance.handleEl; + handle.setStyle('cursor', 'n-resize'); + partner = currentInstance.partner; + min = 0; + max = function(){ + return element.getStyle('height').toInt() + partner.getStyle('height').toInt(); + }.bind(this); + + if (Browser.Engine.trident){ + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + currentInstance.resize = element.makeResizable({ + handle: handle, + modifiers: {x: false, y: 'height'}, + limit: { y: [min, max] }, + invert: false, + onBeforeStart: function(){ + partner = currentInstance.partner; + this.originalHeight = element.getStyle('height').toInt(); + this.partnerOriginalHeight = partner.getStyle('height').toInt(); + }.bind(this), + onStart: function(){ + if (currentInstance.iframeEl) { + currentInstance.iframeEl.setStyle('visibility', 'hidden'); + } + partner.getElements('iframe').setStyle('visibility','hidden'); + }.bind(this), + onDrag: function(){ + partnerHeight = partnerOriginalHeight + (this.originalHeight - element.getStyle('height').toInt()); + partner.setStyle('height', partnerHeight); + MochaUI.resizeChildren(element, element.getStyle('height').toInt()); + MochaUI.resizeChildren(partner, partnerHeight); + }.bind(this), + onComplete: function(){ + partnerHeight = partnerOriginalHeight + (this.originalHeight - element.getStyle('height').toInt()); + partner.setStyle('height', partnerHeight); + MochaUI.resizeChildren(element, element.getStyle('height').toInt()); + MochaUI.resizeChildren(partner, partnerHeight); + if (currentInstance.iframeEl) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + partner.getElements('iframe').setStyle('visibility','visible'); + currentInstance.fireEvent('onResize'); + }.bind(this) + }); +} +/* + +Script: Dock.js + Implements the dock/taskbar. Enables window minimize. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js, Layout.js + +Todo: + - Make it so the dock requires no initial html markup. + +*/ + +MochaUI.options.extend({ + // Naming options: + // If you change the IDs of the Mocha Desktop containers in your HTML, you need to change them here as well. + dockWrapper: 'dockWrapper', + dock: 'dock' +}); + +// Used by Desktop.js before MochaUI.Dock is initialized. +window.addEvent('domready', function(){ + if ($('dockWrapper')) { + MochaUI.dockVisible = true; + } +}); + +MochaUI.extend({ + /* + + Function: minimizeAll + Minimize all windows that are minimizable. + + */ + minimizeAll: function() { + $$('div.mocha').each(function(windowEl){ + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + if (!currentInstance.isMinimized && currentInstance.options.minimizable == true){ + MochaUI.Dock.minimizeWindow(windowEl); + } + }.bind(this)); + } +}); + +MochaUI.Dock = new Class({ + Extends: MochaUI.Window, + + Implements: [Events, Options], + + options: { + useControls: true, // Toggles autohide and dock placement controls. + dockPosition: 'top', // Position the dock starts in, top or bottom. + // Style options + dockTabColor: [255, 255, 255], + trueButtonColor: [70, 245, 70], // Color for autohide on + enabledButtonColor: [125, 208, 250], + disabledButtonColor: [170, 170, 170] + }, + initialize: function(options){ + // Stops if MochaUI.Desktop is not implemented + if (!MochaUI.Desktop) return; + this.setOptions(options); + + this.dockWrapper = $(MochaUI.options.dockWrapper); + this.dock = $(MochaUI.options.dock); + this.autoHideEvent = null; + this.dockAutoHide = false; // True when dock autohide is set to on, false if set to off + + if (!this.dockWrapper) return; + + if (!this.options.useControls){ + if($('dockPlacement')){ + $('dockPlacement').setStyle('cursor', 'default'); + } + if($('dockAutoHide')){ + $('dockAutoHide').setStyle('cursor', 'default'); + } + } + + this.dockWrapper.setStyles({ + 'display': 'block', + 'position': 'absolute', + 'top': null, + 'bottom': MochaUI.Desktop.desktopFooter ? MochaUI.Desktop.desktopFooter.offsetHeight : 0, + 'left': 0 + }); + + if (this.options.useControls){ + this.initializeDockControls(); + } + + // Add check mark to menu if link exists in menu + if ($('dockLinkCheck')){ + this.sidebarCheck = new Element('div', { + 'class': 'check', + 'id': 'dock_check' + }).inject($('dockLinkCheck')); + } + + this.dockSortables = new Sortables('#dockSort', { + opacity: Browser.Engine.trident ? 1 : .5, + constrain: true, + clone: false, + revert: false + }); + + MochaUI.Desktop.setDesktopSize(); + }, + initializeDockControls: function(){ + + if (this.options.useControls){ + // Insert canvas + var canvas = new Element('canvas', { + 'id': 'dockCanvas', + 'width': '15', + 'height': '18' + }).inject(this.dock); + + // Dynamically initialize canvas using excanvas. This is only required by IE + if (Browser.Engine.trident && MochaUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(canvas); + } + } + + var dockPlacement = $('dockPlacement'); + var dockAutoHide = $('dockAutoHide'); + + // Position top or bottom selector + dockPlacement.setProperty('title','Position Dock Top'); + + // Attach event + dockPlacement.addEvent('click', function(){ + this.moveDock(); + }.bind(this)); + + // Auto Hide toggle switch + dockAutoHide.setProperty('title','Turn Auto Hide On'); + + // Attach event Auto Hide + dockAutoHide.addEvent('click', function(event){ + if ( this.dockWrapper.getProperty('dockPosition') == 'top' ) + return false; + + var ctx = $('dockCanvas').getContext('2d'); + this.dockAutoHide = !this.dockAutoHide; // Toggle + if (this.dockAutoHide){ + $('dockAutoHide').setProperty('title', 'Turn Auto Hide Off'); + //ctx.clearRect(0, 11, 100, 100); + MochaUI.circle(ctx, 5 , 14, 3, this.options.trueButtonColor, 1.0); + + // Define event + this.autoHideEvent = function(event) { + if (!this.dockAutoHide) + return; + if (!MochaUI.Desktop.desktopFooter) { + var dockHotspotHeight = this.dockWrapper.offsetHeight; + if (dockHotspotHeight < 25) dockHotspotHeight = 25; + } + else if (MochaUI.Desktop.desktopFooter) { + var dockHotspotHeight = this.dockWrapper.offsetHeight + MochaUI.Desktop.desktopFooter.offsetHeight; + if (dockHotspotHeight < 25) dockHotspotHeight = 25; + } + if (!MochaUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ + if (!MochaUI.dockVisible){ + this.dockWrapper.setStyle('display', 'block'); + MochaUI.dockVisible = true; + MochaUI.Desktop.setDesktopSize(); + } + } + else if (MochaUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ + if (!MochaUI.dockVisible){ + this.dockWrapper.setStyle('display', 'block'); + MochaUI.dockVisible = true; + MochaUI.Desktop.setDesktopSize(); + } + } + else if (MochaUI.dockVisible){ + this.dockWrapper.setStyle('display', 'none'); + MochaUI.dockVisible = false; + MochaUI.Desktop.setDesktopSize(); + + } + }.bind(this); + + // Add event + document.addEvent('mousemove', this.autoHideEvent); + + } else { + $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); + //ctx.clearRect(0, 11, 100, 100); + MochaUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + // Remove event + document.removeEvent('mousemove', this.autoHideEvent); + } + + }.bind(this)); + + // Draw dock controls + var ctx = $('dockCanvas').getContext('2d'); + ctx.clearRect(0, 0, 100, 100); + MochaUI.circle(ctx, 5 , 4, 3, this.options.enabledButtonColor, 1.0); + MochaUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + + if (this.options.dockPosition == 'top'){ + this.moveDock(); + } + + }, + moveDock: function(){ + var ctx = $('dockCanvas').getContext('2d'); + // Move dock to top position + if (this.dockWrapper.getStyle('position') != 'relative'){ + this.dockWrapper.setStyles({ + 'position': 'relative', + 'bottom': null + }); + this.dockWrapper.addClass('top'); + MochaUI.Desktop.setDesktopSize(); + this.dockWrapper.setProperty('dockPosition','top'); + ctx.clearRect(0, 0, 100, 100); + MochaUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); + MochaUI.circle(ctx, 5, 14, 3, this.options.disabledButtonColor, 1.0); + $('dockPlacement').setProperty('title', 'Position Dock Bottom'); + $('dockAutoHide').setProperty('title', 'Auto Hide Disabled in Top Dock Position'); + this.dockAutoHide = false; + } + // Move dock to bottom position + else { + this.dockWrapper.setStyles({ + 'position': 'absolute', + 'bottom': MochaUI.Desktop.desktopFooter ? MochaUI.Desktop.desktopFooter.offsetHeight : 0 + }); + this.dockWrapper.removeClass('top'); + MochaUI.Desktop.setDesktopSize(); + this.dockWrapper.setProperty('dockPosition', 'bottom'); + ctx.clearRect(0, 0, 100, 100); + MochaUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); + MochaUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + $('dockPlacement').setProperty('title', 'Position Dock Top'); + $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); + } + }, + createDockTab: function(windowEl){ + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + + var dockTab = new Element('div', { + 'id': currentInstance.options.id + '_dockTab', + 'class': 'dockTab', + 'title': titleText + }).inject($('dockClear'), 'before'); + + dockTab.addEvent('mousedown', function(e){ + new Event(e).stop(); + this.timeDown = $time(); + }); + + dockTab.addEvent('mouseup', function(e){ + this.timeUp = $time(); + if ((this.timeUp - this.timeDown) < 275){ + // If the visibility of the windows on the page are toggled off, toggle visibility on. + if (MochaUI.Windows.windowsVisible == false) { + MochaUI.toggleWindowVisibility(); + if (currentInstance.isMinimized == true) { + MochaUI.Dock.restoreMinimized.delay(25, MochaUI.Dock, windowEl); + } + else { + MochaUI.focusWindow(windowEl); + } + return; + } + // If window is minimized, restore window. + if (currentInstance.isMinimized == true) { + MochaUI.Dock.restoreMinimized.delay(25, MochaUI.Dock, windowEl); + } + else{ + // If window is not minimized and is focused, minimize window. + if (currentInstance.windowEl.hasClass('isFocused') && currentInstance.options.minimizable == true){ + MochaUI.Dock.minimizeWindow(windowEl) + } + // If window is not minimized and is not focused, focus window. + else{ + MochaUI.focusWindow(windowEl); + } + // if the window is not minimized and is outside the viewport, center it in the viewport. + var coordinates = document.getCoordinates(); + if (windowEl.getStyle('left').toInt() > coordinates.width || windowEl.getStyle('top').toInt() > coordinates.height){ + MochaUI.centerWindow(windowEl); + } + } + } + }); + + this.dockSortables.addItems(dockTab); + + var titleText = currentInstance.titleEl.innerHTML; + + var dockTabText = new Element('div', { + 'id': currentInstance.options.id + '_dockTabText', + 'class': 'dockText' + }).set('html', titleText.substring(0,20) + (titleText.length > 20 ? '...' : '')).inject($(dockTab)); + + // If I implement this again, will need to also adjust the titleText truncate and the tab's + // left padding. + if (currentInstance.options.icon != false){ + // dockTabText.setStyle('background', 'url(' + currentInstance.options.icon + ') 4px 4px no-repeat'); + } + + // Need to resize everything in case the dock wraps when a new tab is added + MochaUI.Desktop.setDesktopSize(); + + }, + makeActiveTab: function(){ + + // getWindowWith HighestZindex is used in case the currently focused window + // is closed. + var windowEl = MochaUI.getWindowWithHighestZindex(); + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + + $$('div.dockTab').removeClass('activeDockTab'); + if (currentInstance.isMinimized != true) { + + currentInstance.windowEl.addClass('isFocused'); + + var currentButton = $(currentInstance.options.id + '_dockTab'); + if (currentButton != null) { + currentButton.addClass('activeDockTab'); + } + } + else { + currentInstance.windowEl.removeClass('isFocused'); + } + }, + minimizeWindow: function(windowEl){ + if (windowEl != $(windowEl)) return; + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + currentInstance.isMinimized = true; + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'hidden'); + } + + // Hide window and add to dock + currentInstance.contentBorderEl.setStyle('visibility', 'hidden'); + if(currentInstance.toolbarWrapperEl){ + currentInstance.toolbarWrapperEl.setStyle('visibility', 'hidden'); + } + windowEl.setStyle('visibility', 'hidden'); + + // Fixes a scrollbar issue in Mac FF2 + if (Browser.Platform.mac && Browser.Engine.gecko){ + if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { + var ffversion = new Number(RegExp.$1); + if (ffversion < 3) { + currentInstance.contentWrapperEl.setStyle('overflow', 'hidden'); + } + } + } + + MochaUI.Desktop.setDesktopSize(); + + // Have to use timeout because window gets focused when you click on the minimize button + setTimeout(function(){ + windowEl.setStyle('zIndex', 1); + windowEl.removeClass('isFocused'); + this.makeActiveTab(); + }.bind(this),100); + + currentInstance.fireEvent('onMinimize', windowEl); + }, + restoreMinimized: function(windowEl) { + + var currentInstance = MochaUI.Windows.instances.get(windowEl.id); + + if (currentInstance.isMinimized == false) return; + + if (MochaUI.Windows.windowsVisible == false){ + MochaUI.toggleWindowVisibility(); + } + + MochaUI.Desktop.setDesktopSize(); + + // Part of Mac FF2 scrollbar fix + if (currentInstance.options.scrollbars == true && !currentInstance.iframeEl){ + currentInstance.contentWrapperEl.setStyle('overflow', 'auto'); + } + + if (currentInstance.isCollapsed) { + MochaUI.collapseToggle(windowEl); + } + + windowEl.setStyle('visibility', 'visible'); + currentInstance.contentBorderEl.setStyle('visibility', 'visible'); + if(currentInstance.toolbarWrapperEl){ + currentInstance.toolbarWrapperEl.setStyle('visibility', 'visible'); + } + + // Show iframe + if ( currentInstance.iframeEl ) { + currentInstance.iframeEl.setStyle('visibility', 'visible'); + } + + currentInstance.isMinimized = false; + MochaUI.focusWindow(windowEl); + currentInstance.fireEvent('onRestore', windowEl); + + } +}); +MochaUI.Dock.implement(new Options, new Events); +/* + +Script: Workspaces.js + Save and load workspaces. The Workspaces emulate Adobe Illustrator functionality remembering what windows are open and where they are positioned. There will be two versions, a limited version that saves state to a cookie, and a fully functional version that saves state to a database. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +To do: + - Move to Window + +*/ + +MochaUI.extend({ + /* + + Function: saveWorkspace + Save the current workspace. + + Syntax: + (start code) + MochaUI.saveWorkspace(); + (end) + + Notes: + This is experimental. This version saves the ID of each open window to a cookie, and reloads those windows using the functions in mocha-init.js. This requires that each window have a function in mocha-init.js used to open them. Functions must be named the windowID + "Window". So if your window is called mywindow, it needs a function called mywindowWindow in mocha-init.js. + + */ + saveWorkspace: function(){ + this.cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); + this.cookie.empty(); + MochaUI.Windows.instances.each(function(instance) { + instance.saveValues(); + this.cookie.set(instance.options.id, { + 'id': instance.options.id, + 'top': instance.options.y, + 'left': instance.options.x + }); + }.bind(this)); + this.cookie.save(); + + new MochaUI.Window({ + loadMethod: 'html', + type: 'notification', + addClass: 'notification', + content: 'Workspace saved.', + closeAfter: '1400', + width: 200, + height: 40, + y: 53, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + bodyBgColor: [255, 255, 255] + }); + + }, + windowUnload: function(){ + if ($$('div.mocha').length == 0 && this.myChain){ + this.myChain.callChain(); + } + }, + loadWorkspace2: function(workspaceWindows){ + workspaceWindows.each(function(instance){ + windowFunction = eval('MochaUI.' + instance.id + 'Window'); + if (windowFunction){ + eval('MochaUI.' + instance.id + 'Window();'); + $(instance.id).setStyles({ + top: instance.top, + left: instance.left + }); + } + }.bind(this)); + this.loadingWorkspace = false; + }, + /* + + Function: loadWorkspace + Load the saved workspace. + + Syntax: + (start code) + MochaUI.loadWorkspace(); + (end) + + */ + loadWorkspace: function(){ + cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); + workspaceWindows = cookie.load(); + + if(!cookie.getKeys().length){ + new MochaUI.Window({ + loadMethod: 'html', + type: 'notification', + addClass: 'notification', + content: 'You have no saved workspace.', + closeAfter: '1400', + width: 220, + height: 40, + y: 25, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + bodyBgColor: [255, 255, 255] + }); + return; + } + + if ($$('div.mocha').length != 0){ + this.loadingWorkspace = true; + this.myChain = new Chain(); + this.myChain.chain( + function(){ + $$('div.mocha').each(function(el) { + this.closeWindow(el); + }.bind(this)); + }.bind(this), + function(){ + this.loadWorkspace2(workspaceWindows); + }.bind(this) + ); + this.myChain.callChain(); + } + else { + this.loadWorkspace2(workspaceWindows); + } + + } +}); diff --git a/src/webui/scripts/mootabs1.2.js b/src/webui/scripts/mootabs1.2.js new file mode 100644 index 000000000..a294db895 --- /dev/null +++ b/src/webui/scripts/mootabs1.2.js @@ -0,0 +1,223 @@ +/* + * MIT License + * Copyright (c) 2008 Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * Original code from http://www.silverscripting.com/mootabs/ + * Ported to Mootools 1.2 by Christophe Dumez + */ + +var mootabs = new Class({ + + Implements: [Options], + + options: { + width: '300px', + height: '200px', + changeTransition: Fx.Transitions.Bounce.easeOut, + duration: 1000, + mouseOverClass: 'over', + activateOnLoad: 'first', + useAjax: false, + ajaxUrl: '', + ajaxOptions: {method:'get', evalScripts: true}, + ajaxLoadingText: 'Loading...' + }, + + initialize: function(element, options) { + + if(options) this.setOptions(options); + + this.el = $(element); + this.elid = element; + + this.el.setStyles({ + height: this.options.height, + width: this.options.width + }); + + this.titles = $$('#' + this.elid + ' ul li'); + this.panelHeight = this.el.getSize().y - (this.titles[0].getSize().y + 4); + this.panels = $$('#' + this.elid + ' .mootabs_panel'); + + + this.panels.setStyle('height', this.panelHeight); + + this.titles.each(function(item) { + item.addEvent('click', function(){ + if(item != this.activeTitle) + { + item.removeClass(this.options.mouseOverClass); + this.activate(item); + } + + }.bind(this)); + + item.addEvent('mouseover', function() { + if(item != this.activeTitle) + { + item.addClass(this.options.mouseOverClass); + } + }.bind(this)); + + item.addEvent('mouseout', function() { + if(item != this.activeTitle) + { + item.removeClass(this.options.mouseOverClass); + } + }.bind(this)); + }.bind(this)); + + + if(this.options.activateOnLoad != 'none') + { + if(this.options.activateOnLoad == 'first') + { + this.activate(this.titles[0], true); + } + else + { + this.activate(this.options.activateOnLoad, true); + } + } + }, + + activate: function(tab, skipAnim){ + if(! $defined(skipAnim)) + { + skipAnim = false; + } + if($type(tab) == 'string') + { + myTab = $$('#' + this.elid + ' ul li').filter('[title=' + tab + ']')[0]; + tab = myTab; + } + + if($type(tab) == 'element') + { + var newTab = tab.getProperty('title'); + + this.panels.removeClass('active'); + + this.activePanel = this.panels.filter('#' + newTab)[0]; + + this.activePanel.addClass('active'); + + if(this.options.changeTransition != 'none' && skipAnim==false) + { + this.panels.filter('#' + newTab).setStyle('height', 0); + var changeEffect = new Fx.Elements(this.panels.filter('#' + newTab), {duration: this.options.duration, transition: this.options.changeTransition}); + changeEffect.start({ + '0': { + 'height': [0, this.panelHeight] + } + }); + } + + this.titles.removeClass('active'); + + tab.addClass('active'); + + this.activeTitle = tab; + + if(this.options.useAjax) + { + this._getContent(); + } + } + }, + + _getContent: function(){ + this.activePanel.setHTML(this.options.ajaxLoadingText); + var newOptions = { + url: this.options.ajaxUrl + '?tab=' + this.activeTitle.getProperty('title'), + update: this.activePanel.getProperty('id') + }; + this.options.ajaxOptions = $merge(this.options.ajaxOptions, newOptions); + var tabRequest = new Request.HTML(this.options.ajaxOptions); + tabRequest.send(); + }, + + addTab: function(title, label, content){ + //the new title + var newTitle = new Element('li', { + 'title': title + }); + newTitle.appendText(label); + this.titles.include(newTitle); + $$('#' + this.elid + ' ul').adopt(newTitle); + newTitle.addEvent('click', function() { + this.activate(newTitle); + }.bind(this)); + + newTitle.addEvent('mouseover', function() { + if(newTitle != this.activeTitle) + { + newTitle.addClass(this.options.mouseOverClass); + } + }.bind(this)); + newTitle.addEvent('mouseout', function() { + if(newTitle != this.activeTitle) + { + newTitle.removeClass(this.options.mouseOverClass); + } + }.bind(this)); + //the new panel + var newPanel = new Element('div', { + 'style': {'height': this.options.panelHeight}, + 'id': title, + 'class': 'mootabs_panel' + }); + if(!this.options.useAjax) + { + newPanel.setHTML(content); + } + this.panels.include(newPanel); + this.el.adopt(newPanel); + }, + + removeTab: function(title){ + if(this.activeTitle.title == title) + { + this.activate(this.titles[0]); + } + $$('#' + this.elid + ' ul li').filter('[title=' + title + ']')[0].remove(); + + $$('#' + this.elid + ' .mootabs_panel').filter('#' + title)[0].remove(); + }, + + next: function(){ + var nextTab = this.activeTitle.getNext(); + if(!nextTab) { + nextTab = this.titles[0]; + } + this.activate(nextTab); + }, + + previous: function(){ + var previousTab = this.activeTitle.getPrevious(); + if(!previousTab) { + previousTab = this.titles[this.titles.length - 1]; + } + this.activate(previousTab); + } +}); \ No newline at end of file diff --git a/src/webui/scripts/mootools-1.2-core-yc.js b/src/webui/scripts/mootools-1.2-core-yc.js new file mode 100644 index 000000000..752b98ce0 --- /dev/null +++ b/src/webui/scripts/mootools-1.2-core-yc.js @@ -0,0 +1,349 @@ +//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, , MIT Style License. + +var MooTools={version:"1.2.1",build:"0d4845aab3d9a4fdee2f0d4a6dd59210e4b697cf"};var Native=function(K){K=K||{};var A=K.name;var I=K.legacy;var B=K.protect; +var C=K.implement;var H=K.generics;var F=K.initialize;var G=K.afterImplement||function(){};var D=F||I;H=H!==false;D.constructor=Native;D.$family={name:"native"}; +if(I&&F){D.prototype=I.prototype;}D.prototype.constructor=D;if(A){var E=A.toLowerCase();D.prototype.$family={name:E};Native.typize(D,E);}var J=function(N,L,O,M){if(!B||M||!N.prototype[L]){N.prototype[L]=O; +}if(H){Native.genericize(N,L,B);}G.call(N,L,O);return N;};D.alias=function(N,L,O){if(typeof N=="string"){if((N=this.prototype[N])){return J(this,L,N,O); +}}for(var M in N){this.alias(M,N[M],L);}return this;};D.implement=function(M,L,O){if(typeof M=="string"){return J(this,M,L,O);}for(var N in M){J(this,N,M[N],L); +}return this;};if(C){D.implement(C);}return D;};Native.genericize=function(B,C,A){if((!A||!B[C])&&typeof B.prototype[C]=="function"){B[C]=function(){var D=Array.prototype.slice.call(arguments); +return B.prototype[C].apply(D.shift(),D);};}};Native.implement=function(D,C){for(var B=0,A=D.length;B-1:this.indexOf(A)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim(); +},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(A){return("-"+A.charAt(0).toLowerCase()); +});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1"); +},toInt:function(A){return parseInt(this,A||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); +return(A)?A.slice(1).hexToRgb(B):null;},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):null;},stripScripts:function(B){var A=""; +var C=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){A+=arguments[1]+"\n";return"";});if(B===true){$exec(A);}else{if($type(B)=="function"){B(A,C); +}}return C;},substitute:function(A,B){return this.replace(B||(/\\?\{([^{}]+)\}/g),function(D,C){if(D.charAt(0)=="\\"){return D.slice(1);}return(A[C]!=undefined)?A[C]:""; +});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(B){for(var A in this){if(this.hasOwnProperty(A)&&this[A]===B){return A;}}return null; +},hasValue:function(A){return(Hash.keyOf(this,A)!==null);},extend:function(A){Hash.each(A,function(C,B){Hash.set(this,B,C);},this);return this;},combine:function(A){Hash.each(A,function(C,B){Hash.include(this,B,C); +},this);return this;},erase:function(A){if(this.hasOwnProperty(A)){delete this[A];}return this;},get:function(A){return(this.hasOwnProperty(A))?this[A]:null; +},set:function(A,B){if(!this[A]||this.hasOwnProperty(A)){this[A]=B;}return this;},empty:function(){Hash.each(this,function(B,A){delete this[A];},this); +return this;},include:function(B,C){var A=this[B];if(A==undefined){this[B]=C;}return this;},map:function(B,C){var A=new Hash;Hash.each(this,function(E,D){A.set(D,B.call(C,E,D,this)); +},this);return A;},filter:function(B,C){var A=new Hash;Hash.each(this,function(E,D){if(B.call(C,E,D,this)){A.set(D,E);}},this);return A;},every:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&!B.call(C,this[A],A)){return false; +}}return true;},some:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&B.call(C,this[A],A)){return true;}}return false;},getKeys:function(){var A=[]; +Hash.each(this,function(C,B){A.push(B);});return A;},getValues:function(){var A=[];Hash.each(this,function(B){A.push(B);});return A;},toQueryString:function(A){var B=[]; +Hash.each(this,function(F,E){if(A){E=A+"["+E+"]";}var D;switch($type(F)){case"object":D=Hash.toQueryString(F,E);break;case"array":var C={};F.each(function(H,G){C[G]=H; +});D=Hash.toQueryString(C,E);break;default:D=E+"="+encodeURIComponent(F);}if(F!=undefined){B.push(D);}});return B.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"}); +var Event=new Native({name:"Event",initialize:function(A,F){F=F||window;var K=F.document;A=A||F.event;if(A.$extended){return A;}this.$extended=true;var J=A.type; +var G=A.target||A.srcElement;while(G&&G.nodeType==3){G=G.parentNode;}if(J.test(/key/)){var B=A.which||A.keyCode;var M=Event.Keys.keyOf(B);if(J=="keydown"){var D=B-111; +if(D>0&&D<13){M="f"+D;}}M=M||String.fromCharCode(B).toLowerCase();}else{if(J.match(/(click|mouse|menu)/i)){K=(!K.compatMode||K.compatMode=="CSS1Compat")?K.html:K.body; +var I={x:A.pageX||A.clientX+K.scrollLeft,y:A.pageY||A.clientY+K.scrollTop};var C={x:(A.pageX)?A.pageX-F.pageXOffset:A.clientX,y:(A.pageY)?A.pageY-F.pageYOffset:A.clientY}; +if(J.match(/DOMMouseScroll|mousewheel/)){var H=(A.wheelDelta)?A.wheelDelta/120:-(A.detail||0)/3;}var E=(A.which==3)||(A.button==2);var L=null;if(J.match(/over|out/)){switch(J){case"mouseover":L=A.relatedTarget||A.fromElement; +break;case"mouseout":L=A.relatedTarget||A.toElement;}if(!(function(){while(L&&L.nodeType==3){L=L.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){L=false; +}}}}return $extend(this,{event:A,type:J,page:I,client:C,rightClick:E,wheel:H,relatedTarget:L,target:G,code:B,key:M,shift:A.shiftKey,control:A.ctrlKey,alt:A.altKey,meta:A.metaKey}); +}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault(); +},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); +}else{this.event.returnValue=false;}return this;}});var Class=new Native({name:"Class",initialize:function(B){B=B||{};var A=function(){for(var E in this){if($type(this[E])!="function"){this[E]=$unlink(this[E]); +}}this.constructor=A;if(Class.prototyping){return this;}var D=(this.initialize)?this.initialize.apply(this,arguments):this;if(this.options&&this.options.initialize){this.options.initialize.call(this); +}return D;};for(var C in Class.Mutators){if(!B[C]){continue;}B=Class.Mutators[C](B,B[C]);delete B[C];}$extend(A,this);A.constructor=Class;A.prototype=B; +return A;}});Class.Mutators={Extends:function(C,A){Class.prototyping=A.prototype;var B=new A;delete B.parent;B=Class.inherit(B,C);delete Class.prototyping; +return B;},Implements:function(A,B){$splat(B).each(function(C){Class.prototying=C;$extend(A,($type(C)=="class")?new C:C);delete Class.prototyping;});return A; +}};Class.extend({inherit:function(B,E){var A=arguments.callee.caller;for(var D in E){var C=E[D];var G=B[D];var F=$type(C);if(G&&F=="function"){if(C!=G){if(A){C.__parent=G; +B[D]=C;}else{Class.override(B,D,C);}}}else{if(F=="object"){B[D]=$merge(G,C);}else{B[D]=C;}}}if(A){B.parent=function(){return arguments.callee.caller.__parent.apply(this,arguments); +};}return B;},override:function(B,A,E){var D=Class.prototyping;if(D&&B[A]!=D[A]){D=null;}var C=function(){var F=this.parent;this.parent=D?D[A]:B[A];var G=E.apply(this,arguments); +this.parent=F;return G;};B[A]=C;}});Class.implement({implement:function(){var A=this.prototype;$each(arguments,function(B){Class.inherit(A,B);});return this; +}});var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false; +},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(C,B,A){C=Events.removeOn(C);if(B!=$empty){this.$events[C]=this.$events[C]||[]; +this.$events[C].include(B);if(A){B.internal=true;}}return this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);}return this;},fireEvent:function(C,B,A){C=Events.removeOn(C); +if(!this.$events||!this.$events[C]){return this;}this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();},this);return this;},removeEvent:function(B,A){B=Events.removeOn(B); +if(!this.$events[B]){return this;}if(!A.internal){this.$events[B].erase(A);}return this;},removeEvents:function(C){if($type(C)=="object"){for(var D in C){this.removeEvent(D,C[D]); +}return this;}if(C){C=Events.removeOn(C);}for(var D in this.$events){if(C&&C!=D){continue;}var B=this.$events[D];for(var A=B.length;A--;A){this.removeEvent(D,B[A]); +}}return this;}});Events.removeOn=function(A){return A.replace(/^on([A-Z])/,function(B,C){return C.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments)); +if(!this.addEvent){return this;}for(var A in this.options){if($type(this.options[A])!="function"||!(/^on[A-Z]/).test(A)){continue;}this.addEvent(A,this.options[A]); +delete this.options[A];}return this;}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(A,B){var C=Element.Constructors.get(A); +if(C){return C(B);}if(typeof A=="string"){return document.newElement(A,B);}return $(A).set(B);},afterImplement:function(A,B){Element.Prototype[A]=B;if(Array[A]){return ; +}Elements.implement(A,function(){var C=[],G=true;for(var E=0,D=this.length;E";}return $.element(this.createElement(A)).set(B);},newTextNode:function(A){return this.createTextNode(A); +},getDocument:function(){return this;},getWindow:function(){return this.window;}});Window.implement({$:function(B,C){if(B&&B.$family&&B.uid){return B;}var A=$type(B); +return($[A])?$[A](B,C,this.document):null;},$$:function(A){if(arguments.length==1&&typeof A=="string"){return this.document.getElements(A);}var F=[];var C=Array.flatten(arguments); +for(var D=0,B=C.length;D1);A.each(function(E){var F=this.getElementsByTagName(E.trim());(B)?C.extend(F):C=F;},this);return new Elements(C,{ddup:B,cash:!D}); +}});(function(){var H={},F={};var I={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"}; +var C=function(L){return(F[L]||(F[L]={}));};var G=function(N,L){if(!N){return ;}var M=N.uid;if(Browser.Engine.trident){if(N.clearAttributes){var P=L&&N.cloneNode(false); +N.clearAttributes();if(P){N.mergeAttributes(P);}}else{if(N.removeEvents){N.removeEvents();}}if((/object/i).test(N.tagName)){for(var O in N){if(typeof N[O]=="function"){N[O]=$empty; +}}Element.dispose(N);}}if(!M){return ;}H[M]=F[M]=null;};var D=function(){Hash.each(H,G);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(G); +}if(window.CollectGarbage){CollectGarbage();}H=F=null;};var J=function(N,L,S,M,P,R){var O=N[S||L];var Q=[];while(O){if(O.nodeType==1&&(!M||Element.match(O,M))){if(!P){return $(O,R); +}Q.push(O);}O=O[L];}return(P)?new Elements(Q,{ddup:false,cash:!R}):null;};var E={html:"innerHTML","class":"className","for":"htmlFor",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"}; +var B=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var K=["value","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"]; +Hash.extend(E,B.associate(B));Hash.extend(E,K.associate(K.map(String.toLowerCase)));var A={before:function(M,L){if(L.parentNode){L.parentNode.insertBefore(M,L); +}},after:function(M,L){if(!L.parentNode){return ;}var N=L.nextSibling;(N)?L.parentNode.insertBefore(M,N):L.parentNode.appendChild(M);},bottom:function(M,L){L.appendChild(M); +},top:function(M,L){var N=L.firstChild;(N)?L.insertBefore(M,N):L.appendChild(M);}};A.inside=A.bottom;Hash.each(A,function(L,M){M=M.capitalize();Element.implement("inject"+M,function(N){L(this,$(N,true)); +return this;});Element.implement("grab"+M,function(N){L($(N,true),this);return this;});});Element.implement({set:function(O,M){switch($type(O)){case"object":for(var N in O){this.set(N,O[N]); +}break;case"string":var L=Element.Properties.get(O);(L&&L.set)?L.set.apply(this,Array.slice(arguments,1)):this.setProperty(O,M);}return this;},get:function(M){var L=Element.Properties.get(M); +return(L&&L.get)?L.get.apply(this,Array.slice(arguments,1)):this.getProperty(M);},erase:function(M){var L=Element.Properties.get(M);(L&&L.erase)?L.erase.apply(this):this.removeProperty(M); +return this;},setProperty:function(M,N){var L=E[M];if(N==undefined){return this.removeProperty(M);}if(L&&B[M]){N=!!N;}(L)?this[L]=N:this.setAttribute(M,""+N); +return this;},setProperties:function(L){for(var M in L){this.setProperty(M,L[M]);}return this;},getProperty:function(M){var L=E[M];var N=(L)?this[L]:this.getAttribute(M,2); +return(B[M])?!!N:(L)?N:N||null;},getProperties:function(){var L=$A(arguments);return L.map(this.getProperty,this).associate(L);},removeProperty:function(M){var L=E[M]; +(L)?this[L]=(L&&B[M])?false:"":this.removeAttribute(M);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this; +},hasClass:function(L){return this.className.contains(L," ");},addClass:function(L){if(!this.hasClass(L)){this.className=(this.className+" "+L).clean(); +}return this;},removeClass:function(L){this.className=this.className.replace(new RegExp("(^|\\s)"+L+"(?:\\s|$)"),"$1");return this;},toggleClass:function(L){return this.hasClass(L)?this.removeClass(L):this.addClass(L); +},adopt:function(){Array.flatten(arguments).each(function(L){L=$(L,true);if(L){this.appendChild(L);}},this);return this;},appendText:function(M,L){return this.grab(this.getDocument().newTextNode(M),L); +},grab:function(M,L){A[L||"bottom"]($(M,true),this);return this;},inject:function(M,L){A[L||"bottom"](this,$(M,true));return this;},replaces:function(L){L=$(L,true); +L.parentNode.replaceChild(this,L);return this;},wraps:function(M,L){M=$(M,true);return this.replaces(M).grab(M,L);},getPrevious:function(L,M){return J(this,"previousSibling",null,L,false,M); +},getAllPrevious:function(L,M){return J(this,"previousSibling",null,L,true,M);},getNext:function(L,M){return J(this,"nextSibling",null,L,false,M);},getAllNext:function(L,M){return J(this,"nextSibling",null,L,true,M); +},getFirst:function(L,M){return J(this,"nextSibling","firstChild",L,false,M);},getLast:function(L,M){return J(this,"previousSibling","lastChild",L,false,M); +},getParent:function(L,M){return J(this,"parentNode",null,L,false,M);},getParents:function(L,M){return J(this,"parentNode",null,L,true,M);},getChildren:function(L,M){return J(this,"nextSibling","firstChild",L,true,M); +},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(O,N){var M=this.ownerDocument.getElementById(O); +if(!M){return null;}for(var L=M.parentNode;L!=this;L=L.parentNode){if(!L){return null;}}return $.element(M,N);},getSelected:function(){return new Elements($A(this.options).filter(function(L){return L.selected; +}));},getComputedStyle:function(M){if(this.currentStyle){return this.currentStyle[M.camelCase()];}var L=this.getDocument().defaultView.getComputedStyle(this,null); +return(L)?L.getPropertyValue([M.hyphenate()]):null;},toQueryString:function(){var L=[];this.getElements("input, select, textarea",true).each(function(M){if(!M.name||M.disabled){return ; +}var N=(M.tagName.toLowerCase()=="select")?Element.getSelected(M).map(function(O){return O.value;}):((M.type=="radio"||M.type=="checkbox")&&!M.checked)?null:M.value; +$splat(N).each(function(O){if(typeof O!="undefined"){L.push(M.name+"="+encodeURIComponent(O));}});});return L.join("&");},clone:function(O,L){O=O!==false; +var R=this.cloneNode(O);var N=function(V,U){if(!L){V.removeAttribute("id");}if(Browser.Engine.trident){V.clearAttributes();V.mergeAttributes(U);V.removeAttribute("uid"); +if(V.options){var W=V.options,S=U.options;for(var T=W.length;T--;){W[T].selected=S[T].selected;}}}var X=I[U.tagName.toLowerCase()];if(X&&U[X]){V[X]=U[X]; +}};if(O){var P=R.getElementsByTagName("*"),Q=this.getElementsByTagName("*");for(var M=P.length;M--;){N(P[M],Q[M]);}}N(R,this);return $(R);},destroy:function(){Element.empty(this); +Element.dispose(this);G(this,true);return null;},empty:function(){$A(this.childNodes).each(function(L){Element.destroy(L);});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this; +},hasChild:function(L){L=$(L,true);if(!L){return false;}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(L.tagName)).contains(L); +}return(this.contains)?(this!=L&&this.contains(L)):!!(this.compareDocumentPosition(L)&16);},match:function(L){return(!L||(L==this)||(Element.get(this,"tag")==L)); +}});Native.implement([Element,Window,Document],{addListener:function(O,N){if(O=="unload"){var L=N,M=this;N=function(){M.removeListener("unload",N);L(); +};}else{H[this.uid]=this;}if(this.addEventListener){this.addEventListener(O,N,false);}else{this.attachEvent("on"+O,N);}return this;},removeListener:function(M,L){if(this.removeEventListener){this.removeEventListener(M,L,false); +}else{this.detachEvent("on"+M,L);}return this;},retrieve:function(M,L){var O=C(this.uid),N=O[M];if(L!=undefined&&N==undefined){N=O[M]=L;}return $pick(N); +},store:function(M,L){var N=C(this.uid);N[M]=L;return this;},eliminate:function(L){var M=C(this.uid);delete M[L];return this;}});window.addListener("unload",D); +})();Element.Properties=new Hash;Element.Properties.style={set:function(A){this.style.cssText=A;},get:function(){return this.style.cssText;},erase:function(){this.style.cssText=""; +}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();}};Element.Properties.html=(function(){var C=document.createElement("div"); +var A={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; +A.thead=A.tfoot=A.tbody;var B={set:function(){var E=Array.flatten(arguments).join("");var F=Browser.Engine.trident&&A[this.get("tag")];if(F){var G=C;G.innerHTML=F[1]+E+F[2]; +for(var D=F[0];D--;){G=G.firstChild;}this.empty().adopt(G.childNodes);}else{this.innerHTML=E;}}};B.erase=B.set;return B;})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText; +}var A=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var B=A.innerText;A.destroy();return B;}};}Element.Properties.events={set:function(A){this.addEvents(A); +}};Native.implement([Element,Window,Document],{addEvent:function(E,G){var H=this.retrieve("events",{});H[E]=H[E]||{keys:[],values:[]};if(H[E].keys.contains(G)){return this; +}H[E].keys.push(G);var F=E,A=Element.Events.get(E),C=G,I=this;if(A){if(A.onAdd){A.onAdd.call(this,G);}if(A.condition){C=function(J){if(A.condition.call(this,J)){return G.call(this,J); +}return true;};}F=A.base||F;}var D=function(){return G.call(I);};var B=Element.NativeEvents[F];if(B){if(B==2){D=function(J){J=new Event(J,I.getWindow()); +if(C.call(I,J)===false){J.stop();}};}this.addListener(F,D);}H[E].values.push(D);return this;},removeEvent:function(C,B){var A=this.retrieve("events");if(!A||!A[C]){return this; +}var F=A[C].keys.indexOf(B);if(F==-1){return this;}A[C].keys.splice(F,1);var E=A[C].values.splice(F,1)[0];var D=Element.Events.get(C);if(D){if(D.onRemove){D.onRemove.call(this,B); +}C=D.base||C;}return(Element.NativeEvents[C])?this.removeListener(C,E):this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);}return this; +},removeEvents:function(A){if($type(A)=="object"){for(var C in A){this.removeEvent(C,A[C]);}return this;}var B=this.retrieve("events");if(!B){return this; +}if(!A){for(var C in B){this.removeEvents(C);}this.eliminate("events");}else{if(B[A]){while(B[A].keys[0]){this.removeEvent(A,B[A].keys[0]);}B[A]=null;}}return this; +},fireEvent:function(D,B,A){var C=this.retrieve("events");if(!C||!C[D]){return this;}C[D].keys.each(function(E){E.create({bind:this,delay:A,"arguments":B})(); +},this);return this;},cloneEvents:function(D,A){D=$(D);var C=D.retrieve("events");if(!C){return this;}if(!A){for(var B in C){this.cloneEvents(D,B);}}else{if(C[A]){C[A].keys.each(function(E){this.addEvent(A,E); +},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}; +(function(){var A=function(B){var C=B.relatedTarget;if(C==undefined){return true;}if(C===false){return false;}return($type(this)!="document"&&C!=this&&C.prefix!="xul"&&!this.hasChild(C)); +};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:A},mouseleave:{base:"mouseout",condition:A},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}}); +})();Element.Properties.styles={set:function(A){this.setStyles(A);}};Element.Properties.opacity={set:function(A,B){if(!B){if(A==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden"; +}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(A==1)?"":"alpha(opacity="+A*100+")"; +}this.style.opacity=A;this.store("opacity",A);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(A){return this.set("opacity",A,true); +},getOpacity:function(){return this.get("opacity");},setStyle:function(B,A){switch(B){case"opacity":return this.set("opacity",parseFloat(A));case"float":B=(Browser.Engine.trident)?"styleFloat":"cssFloat"; +}B=B.camelCase();if($type(A)!="string"){var C=(Element.Styles.get(B)||"@").split(" ");A=$splat(A).map(function(E,D){if(!C[D]){return"";}return($type(E)=="number")?C[D].replace("@",Math.round(E)):E; +}).join(" ");}else{if(A==String(Number(A))){A=Math.round(A);}}this.style[B]=A;return this;},getStyle:function(G){switch(G){case"opacity":return this.get("opacity"); +case"float":G=(Browser.Engine.trident)?"styleFloat":"cssFloat";}G=G.camelCase();var A=this.style[G];if(!$chk(A)){A=[];for(var F in Element.ShortStyles){if(G!=F){continue; +}for(var E in Element.ShortStyles[F]){A.push(this.getStyle(E));}return A.join(" ");}A=this.getComputedStyle(G);}if(A){A=String(A);var C=A.match(/rgba?\([\d\s,]+\)/); +if(C){A=A.replace(C[0],C[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(A)))){if(G.test(/^(height|width)$/)){var B=(G=="width")?["left","right"]:["top","bottom"],D=0; +B.each(function(H){D+=this.getStyle("border-"+H+"-width").toInt()+this.getStyle("padding-"+H).toInt();},this);return this["offset"+G.capitalize()]-D+"px"; +}if((Browser.Engine.presto)&&String(A).test("px")){return A;}if(G.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return A;},setStyles:function(B){for(var A in B){this.setStyle(A,B[A]); +}return this;},getStyles:function(){var A={};Array.each(arguments,function(B){A[B]=this.getStyle(B);},this);return A;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}); +Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(G){var F=Element.ShortStyles; +var B=Element.Styles;["margin","padding"].each(function(H){var I=H+G;F[H][I]=B[I]="@px";});var E="border"+G;F.border[E]=B[E]="@px @ rgb(@, @, @)";var D=E+"Width",A=E+"Style",C=E+"Color"; +F[E]={};F.borderWidth[D]=F[E][D]=B[D]="@px";F.borderStyle[A]=F[E][A]=B[A]="@";F.borderColor[C]=F[E][C]=B[C]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(H,I){if(B(this)){this.getWindow().scrollTo(H,I); +}else{this.scrollLeft=H;this.scrollTop=I;}return this;},getSize:function(){if(B(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; +},getScrollSize:function(){if(B(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(B(this)){return this.getWindow().getScroll(); +}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var I=this,H={x:0,y:0};while(I&&!B(I)){H.x+=I.scrollLeft;H.y+=I.scrollTop;I=I.parentNode; +}return H;},getOffsetParent:function(){var H=this;if(B(H)){return null;}if(!Browser.Engine.trident){return H.offsetParent;}while((H=H.parentNode)&&!B(H)){if(D(H,"position")!="static"){return H; +}}return null;},getOffsets:function(){if(Browser.Engine.trident){var L=this.getBoundingClientRect(),J=this.getDocument().documentElement;return{x:L.left+J.scrollLeft-J.clientLeft,y:L.top+J.scrollTop-J.clientTop}; +}var I=this,H={x:0,y:0};if(B(this)){return H;}while(I&&!B(I)){H.x+=I.offsetLeft;H.y+=I.offsetTop;if(Browser.Engine.gecko){if(!F(I)){H.x+=C(I);H.y+=G(I); +}var K=I.parentNode;if(K&&D(K,"overflow")!="visible"){H.x+=C(K);H.y+=G(K);}}else{if(I!=this&&Browser.Engine.webkit){H.x+=C(I);H.y+=G(I);}}I=I.offsetParent; +}if(Browser.Engine.gecko&&!F(this)){H.x-=C(this);H.y-=G(this);}return H;},getPosition:function(K){if(B(this)){return{x:0,y:0};}var L=this.getOffsets(),I=this.getScrolls(); +var H={x:L.x-I.x,y:L.y-I.y};var J=(K&&(K=$(K)))?K.getPosition():{x:0,y:0};return{x:H.x-J.x,y:H.y-J.y};},getCoordinates:function(J){if(B(this)){return this.getWindow().getCoordinates(); +}var H=this.getPosition(J),I=this.getSize();var K={left:H.x,top:H.y,width:I.x,height:I.y};K.right=K.left+K.width;K.bottom=K.top+K.height;return K;},computePosition:function(H){return{left:H.x-E(this,"margin-left"),top:H.y-E(this,"margin-top")}; +},position:function(H){return this.setStyles(this.computePosition(H));}});Native.implement([Document,Window],{getSize:function(){var I=this.getWindow(); +if(Browser.Engine.presto||Browser.Engine.webkit){return{x:I.innerWidth,y:I.innerHeight};}var H=A(this);return{x:H.clientWidth,y:H.clientHeight};},getScroll:function(){var I=this.getWindow(); +var H=A(this);return{x:I.pageXOffset||H.scrollLeft,y:I.pageYOffset||H.scrollTop};},getScrollSize:function(){var I=A(this);var H=this.getSize();return{x:Math.max(I.scrollWidth,H.x),y:Math.max(I.scrollHeight,H.y)}; +},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var H=this.getSize();return{top:0,left:0,bottom:H.y,right:H.x,height:H.y,width:H.x}; +}});var D=Element.getComputedStyle;function E(H,I){return D(H,I).toInt()||0;}function F(H){return D(H,"-moz-box-sizing")=="border-box";}function G(H){return E(H,"border-top-width"); +}function C(H){return E(H,"border-left-width");}function B(H){return(/^(?:body|html)$/i).test(H.tagName);}function A(H){var I=H.getDocument();return(!I.compatMode||I.compatMode=="CSS1Compat")?I.html:I.body; +}})();Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y; +},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x; +},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;}});Native.implement([Document,Element],{getElements:function(H,G){H=H.split(","); +var C,E={};for(var D=0,B=H.length;D1),cash:!G});}});Element.implement({match:function(B){if(!B||(B==this)){return true;}var D=Selectors.Utils.parseTagAndID(B); +var A=D[0],E=D[1];if(!Selectors.Filters.byID(this,E)||!Selectors.Filters.byTag(this,A)){return false;}var C=Selectors.Utils.parseSelector(B);return(C)?Selectors.Utils.filter(this,C,{}):true; +}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)}; +Selectors.Utils={chk:function(B,C){if(!C){return true;}var A=$uid(B);if(!C[A]){return C[A]=true;}return false;},parseNthArgument:function(F){if(Selectors.Cache.nth[F]){return Selectors.Cache.nth[F]; +}var C=F.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!C){return false;}var E=parseInt(C[1]);var B=(E||E===0)?E:1;var D=C[2]||false;var A=parseInt(C[3])||0; +if(B!=0){A--;while(A<1){A+=B;}while(A>=B){A-=B;}}else{B=A;D="index";}switch(D){case"n":C={a:B,b:A,special:"n"};break;case"odd":C={a:2,b:0,special:"n"}; +break;case"even":C={a:2,b:1,special:"n"};break;case"first":C={a:0,special:"index"};break;case"last":C={special:"last-child"};break;case"only":C={special:"only-child"}; +break;default:C={a:(B-1),special:"index"};}return Selectors.Cache.nth[F]=C;},parseSelector:function(E){if(Selectors.Cache.parsed[E]){return Selectors.Cache.parsed[E]; +}var D,H={classes:[],pseudos:[],attributes:[]};while((D=Selectors.RegExps.combined.exec(E))){var I=D[1],G=D[2],F=D[3],B=D[5],C=D[6],J=D[7];if(I){H.classes.push(I); +}else{if(C){var A=Selectors.Pseudo.get(C);if(A){H.pseudos.push({parser:A,argument:J});}else{H.attributes.push({name:C,operator:"=",value:J});}}else{if(G){H.attributes.push({name:G,operator:F,value:B}); +}}}}if(!H.classes.length){delete H.classes;}if(!H.attributes.length){delete H.attributes;}if(!H.pseudos.length){delete H.pseudos;}if(!H.classes&&!H.attributes&&!H.pseudos){H=null; +}return Selectors.Cache.parsed[E]=H;},parseTagAndID:function(B){var A=B.match(Selectors.RegExps.tag);var C=B.match(Selectors.RegExps.id);return[(A)?A[1]:"*",(C)?C[1]:false]; +},filter:function(F,C,E){var D;if(C.classes){for(D=C.classes.length;D--;D){var G=C.classes[D];if(!Selectors.Filters.byClass(F,G)){return false;}}}if(C.attributes){for(D=C.attributes.length; +D--;D){var B=C.attributes[D];if(!Selectors.Filters.byAttribute(F,B.name,B.operator,B.value)){return false;}}}if(C.pseudos){for(D=C.pseudos.length;D--;D){var A=C.pseudos[D]; +if(!Selectors.Filters.byPseudo(F,A.parser,A.argument,E)){return false;}}}return true;},getByTagAndID:function(B,A,D){if(D){var C=(B.getElementById)?B.getElementById(D,true):Element.getElementById(B,D,true); +return(C&&Selectors.Filters.byTag(C,A))?[C]:[];}else{return B.getElementsByTagName(A);}},search:function(I,H,N){var B=[];var C=H.trim().replace(Selectors.RegExps.splitter,function(Y,X,W){B.push(X); +return":)"+W;}).split(":)");var J,E,U;for(var T=0,P=C.length;T":function(H,G,I,A,F){var C=Selectors.Utils.getByTagAndID(G,I,A);for(var E=0,D=C.length;EA){return false;}}return(C==A);},even:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n+1",A); +},odd:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n",A);}});Element.Events.domready={onAdd:function(A){if(Browser.loaded){A.call(this); +}}};(function(){var B=function(){if(Browser.loaded){return ;}Browser.loaded=true;window.fireEvent("domready");document.fireEvent("domready");};if(Browser.Engine.trident){var A=document.createElement("div"); +(function(){($try(function(){A.doScroll("left");return $(A).inject(document.body).set("html","temp").dispose();}))?B():arguments.callee.delay(50);})(); +}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?B():arguments.callee.delay(50); +})();}else{window.addEvent("load",B);document.addEvent("DOMContentLoaded",B);}}})();var JSON=new Hash({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(A){return JSON.$specialChars[A]||"\\u00"+Math.floor(A.charCodeAt()/16).toString(16)+(A.charCodeAt()%16).toString(16); +},encode:function(B){switch($type(B)){case"string":return'"'+B.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(B.map(JSON.encode).filter($defined))+"]"; +case"object":case"hash":var A=[];Hash.each(B,function(E,D){var C=JSON.encode(E);if(C){A.push(JSON.encode(D)+":"+C);}});return"{"+A+"}";case"number":case"boolean":return String(B); +case false:return"null";}return null;},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null; +}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(B,A){this.key=B; +this.setOptions(A);},write:function(B){B=encodeURIComponent(B);if(this.options.domain){B+="; domain="+this.options.domain;}if(this.options.path){B+="; path="+this.options.path; +}if(this.options.duration){var A=new Date();A.setTime(A.getTime()+this.options.duration*24*60*60*1000);B+="; expires="+A.toGMTString();}if(this.options.secure){B+="; secure"; +}this.options.document.cookie=this.key+"="+B;return this;},read:function(){var A=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +return(A)?decodeURIComponent(A[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(B,C,A){return new Cookie(B,A).write(C); +};Cookie.read=function(A){return new Cookie(A).read();};Cookie.dispose=function(B,A){return new Cookie(B,A).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object; +},initialize:function(L,M){this.instance="Swiff_"+$time();this.setOptions(M);M=this.options;var B=this.id=M.id||this.instance;var A=$(M.container);Swiff.CallBacks[this.instance]={}; +var E=M.params,G=M.vars,F=M.callBacks;var H=$extend({height:M.height,width:M.width},M.properties);var K=this;for(var D in F){Swiff.CallBacks[this.instance][D]=(function(N){return function(){return N.apply(K.object,arguments); +};})(F[D]);G[D]="Swiff.CallBacks."+this.instance+"."+D;}E.flashVars=Hash.toQueryString(G);if(Browser.Engine.trident){H.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; +E.movie=L;}else{H.type="application/x-shockwave-flash";H.data=L;}var J=''; +}}J+="";this.object=((A)?A.empty():new Element("div")).set("html",J).firstChild;},replaces:function(A){A=$(A,true);A.parentNode.replaceChild(this.toElement(),A); +return this;},inject:function(A){$(A,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments)); +}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); +return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(A){this.subject=this.subject||this; +this.setOptions(A);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var B=this.options.wait;if(B===false){this.options.link="cancel"; +}},getTransition:function(){return function(A){return -(Math.cos(Math.PI*A)-1)/2;};},step:function(){var A=$time();if(A=(7-4*B)/11){C=A*A-Math.pow((11-6*B-11*D)/4,2); +break;}}return C;},Elastic:function(B,A){return Math.pow(2,10*--B)*Math.cos(20*B*Math.PI*(A[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(B,A){Fx.Transitions[B]=new Fx.Transition(function(C){return Math.pow(C,[A+2]); +});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false},initialize:function(A){this.xhr=new Browser.Request(); +this.setOptions(A);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return ; +}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML}; +this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300)); +},processScripts:function(A){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(A);}return A.stripScripts(this.options.evalScripts); +},success:function(B,A){this.onSuccess(this.processScripts(B),A);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(A,B){this.headers.set(A,B); +return this;},getHeader:function(A){return $try(function(){return this.xhr.getResponseHeader(A);}.bind(this));},check:function(A){if(!this.running){return true; +}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));return false;}return false; +},send:function(I){if(!this.check(arguments.callee,I)){return this;}this.running=true;var G=$type(I);if(G=="string"||G=="element"){I={data:I};}var D=this.options; +I=$extend({data:D.data,url:D.url,method:D.method},I);var E=I.data,B=I.url,A=I.method;switch($type(E)){case"element":E=$(E).toQueryString();break;case"object":case"hash":E=Hash.toQueryString(E); +}if(this.options.format){var H="format="+this.options.format;E=(E)?H+"&"+E:H;}if(this.options.emulation&&["put","delete"].contains(A)){var F="_method="+A; +E=(E)?F+"&"+E:F;A="post";}if(this.options.urlEncoded&&A=="post"){var C=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+C); +}if(E&&A=="get"){B=B+(B.contains("?")?"&":"?")+E;E=null;}this.xhr.open(A.toUpperCase(),B,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this); +this.headers.each(function(K,J){try{this.xhr.setRequestHeader(J,K);}catch(L){this.fireEvent("exception",[J,K]);}},this);this.fireEvent("request");this.xhr.send(E); +if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty; +this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var A={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(B){A[B]=function(){var C=Array.link(arguments,{url:String.type,data:$defined}); +return this.send($extend(C,{method:B.toLowerCase()}));};});Request.implement(A);})();Element.Properties.send={set:function(A){var B=this.retrieve("send"); +if(B){B.cancel();}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},A)); +},get:function(A){if(A||!this.retrieve("send")){if(A||!this.retrieve("send:options")){this.set("send",A);}this.store("send",new Request(this.retrieve("send:options"))); +}return this.retrieve("send");}};Element.implement({send:function(A){var B=this.get("send");B.send({data:this,url:A||B.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,evalScripts:true,filter:false},processHTML:function(C){var B=C.match(/]*>([\s\S]*?)<\/body>/i); +C=(B)?B[1]:C;var A=new Element("div");return $try(function(){var D=""+C+"",G;if(Browser.Engine.trident){G=new ActiveXObject("Microsoft.XMLDOM"); +G.async=false;G.loadXML(D);}else{G=new DOMParser().parseFromString(D,"text/xml");}D=G.getElementsByTagName("root")[0];for(var F=0,E=D.childNodes.length; +F. Copyright (c) 2006-2008 Valerio Proietti, , MIT Style License. + +Fx.Slide=new Class({Extends:Fx,options:{mode:"vertical"},initialize:function(B,A){this.addEvent("complete",function(){this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0); +if(this.open&&Browser.Engine.webkit419){this.element.dispose().inject(this.wrapper);}},true);this.element=this.subject=$(B);this.parent(A);var C=this.element.retrieve("wrapper"); +this.wrapper=C||new Element("div",{styles:$extend(this.element.getStyles("margin","position"),{overflow:"hidden"})}).wraps(this.element);this.element.store("wrapper",this.wrapper).setStyle("margin",0); +this.now=[];this.open=true;},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight;},horizontal:function(){this.margin="margin-left"; +this.layout="width";this.offset=this.element.offsetWidth;},set:function(A){this.element.setStyle(this.margin,A[0]);this.wrapper.setStyle(this.layout,A[1]); +return this;},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B[F]=Fx.compute(E[F],D[F],C);});return B;},start:function(B,E){if(!this.check(arguments.callee,B,E)){return this; +}this[E||this.options.mode]();var D=this.element.getStyle(this.margin).toInt();var C=this.wrapper.getStyle(this.layout).toInt();var A=[[D,C],[0,this.offset]]; +var G=[[D,C],[-this.offset,0]];var F;switch(B){case"in":F=A;break;case"out":F=G;break;case"toggle":F=(this.wrapper["offset"+this.layout.capitalize()]==0)?A:G; +}return this.parent(F[0],F[1]);},slideIn:function(A){return this.start("in",A);},slideOut:function(A){return this.start("out",A);},hide:function(A){this[A||this.options.mode](); +this.open=false;return this.set([-this.offset,0]);},show:function(A){this[A||this.options.mode]();this.open=true;return this.set([0,this.offset]);},toggle:function(A){return this.start("toggle",A); +}});Element.Properties.slide={set:function(B){var A=this.retrieve("slide");if(A){A.cancel();}return this.eliminate("slide").store("slide:options",$extend({link:"cancel"},B)); +},get:function(A){if(A||!this.retrieve("slide")){if(A||!this.retrieve("slide:options")){this.set("slide",A);}this.store("slide",new Fx.Slide(this,this.retrieve("slide:options"))); +}return this.retrieve("slide");}};Element.implement({slide:function(D,E){D=D||"toggle";var B=this.get("slide"),A;switch(D){case"hide":B.hide(E);break;case"show":B.show(E); +break;case"toggle":var C=this.retrieve("slide:flag",B.open);B[(C)?"slideOut":"slideIn"](E);this.store("slide:flag",!C);A=true;break;default:B.start(D,E); +}if(!A){this.eliminate("slide:flag");}return this;}});Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(B,A){this.element=this.subject=$(B); +this.parent(A);var D=this.cancel.bind(this,false);if($type(this.element)!="element"){this.element=$(this.element.getDocument().body);}var C=this.element; +if(this.options.wheelStops){this.addEvent("start",function(){C.addEvent("mousewheel",D);},true);this.addEvent("complete",function(){C.removeEvent("mousewheel",D); +},true);}},set:function(){var A=Array.flatten(arguments);this.element.scrollTo(A[0],A[1]);},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B.push(Fx.compute(E[F],D[F],C)); +});return B;},start:function(C,H){if(!this.check(arguments.callee,C,H)){return this;}var E=this.element.getSize(),F=this.element.getScrollSize();var B=this.element.getScroll(),D={x:C,y:H}; +for(var G in D){var A=F[G]-E[G];if($chk(D[G])){D[G]=($type(D[G])=="number")?D[G].limit(0,A):A;}else{D[G]=B[G];}D[G]+=this.options.offset[G];}return this.parent([B.x,B.y],[D.x,D.y]); +},toTop:function(){return this.start(false,0);},toLeft:function(){return this.start(0,false);},toRight:function(){return this.start("right",false);},toBottom:function(){return this.start(false,"bottom"); +},toElement:function(B){var A=$(B).getPosition(this.element);return this.start(A.x,A.y);}});Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(B,A){this.elements=this.subject=$$(B); +this.parent(A);},compute:function(G,H,I){var C={};for(var D in G){var A=G[D],E=H[D],F=C[D]={};for(var B in A){F[B]=this.parent(A[B],E[B],I);}}return C; +},set:function(B){for(var C in B){var A=B[C];for(var D in A){this.render(this.elements[C],D,A[D],this.options.unit);}}return this;},start:function(C){if(!this.check(arguments.callee,C)){return this; +}var H={},I={};for(var D in C){var F=C[D],A=H[D]={},G=I[D]={};for(var B in F){var E=this.prepare(this.elements[D],B,F[B]);A[B]=E.from;G[B]=E.to;}}return this.parent(H,I); +}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,modifiers:{x:"left",y:"top"}},initialize:function(){var B=Array.link(arguments,{options:Object.type,element:$defined}); +this.element=$(B.element);this.document=this.element.getDocument();this.setOptions(B.options||{});var A=$type(this.options.handle);this.handles=(A=="array"||A=="collection")?$$(this.options.handle):$(this.options.handle)||this.element; +this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)}; +this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); +return this;},start:function(C){if(this.options.preventDefault){C.preventDefault();}this.fireEvent("beforeStart",this.element);this.mouse.start=C.page; +var A=this.options.limit;this.limit={x:[],y:[]};for(var D in this.options.modifiers){if(!this.options.modifiers[D]){continue;}if(this.options.style){this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt(); +}else{this.value.now[D]=this.element[this.options.modifiers[D]];}if(this.options.invert){this.value.now[D]*=-1;}this.mouse.pos[D]=C.page[D]-this.value.now[D]; +if(A&&A[D]){for(var B=2;B--;B){if($chk(A[D][B])){this.limit[D][B]=$lambda(A[D][B])();}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; +}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});this.document.addEvent(this.selection,this.bound.eventStop);},check:function(A){if(this.options.preventDefault){A.preventDefault(); +}var B=Math.round(Math.sqrt(Math.pow(A.page.x-this.mouse.start.x,2)+Math.pow(A.page.y-this.mouse.start.y,2)));if(B>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); +this.fireEvent("start",this.element).fireEvent("snap",this.element);}},drag:function(A){if(this.options.preventDefault){A.preventDefault();}this.mouse.now=A.page; +for(var B in this.options.modifiers){if(!this.options.modifiers[B]){continue;}this.value.now[B]=this.mouse.now[B]-this.mouse.pos[B];if(this.options.invert){this.value.now[B]*=-1; +}if(this.options.limit&&this.limit[B]){if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){this.value.now[B]=this.limit[B][1];}else{if($chk(this.limit[B][0])&&(this.value.now[B]B.left&&A.xB.top);},checkDroppables:function(){var A=this.droppables.filter(this.checkAgainst,this).getLast(); +if(this.overed!=A){if(this.overed){this.fireEvent("leave",[this.element,this.overed]);}if(A){this.overed=A;this.fireEvent("enter",[this.element,A]);}else{this.overed=null; +}}},drag:function(A){this.parent(A);if(this.droppables.length){this.checkDroppables();}},stop:function(A){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed]); +this.overed=null;return this.parent(A);}});Element.implement({makeDraggable:function(A){return new Drag.Move(this,A);}});Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(B,A){this.parent(B,A); +this.load();},save:function(){var A=JSON.encode(this.hash);if(!A||A.length>4096){return false;}if(A=="{}"){this.dispose();}else{this.write(A);}return true; +},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this;}});Hash.Cookie.implement((function(){var A={};Hash.each(Hash.prototype,function(C,B){A[B]=function(){var D=C.apply(this.hash,arguments); +if(this.options.autoSave){this.save();}return D;};});return A;})());var Color=new Native({initialize:function(B,C){if(arguments.length>=3){C="rgb";B=Array.slice(arguments,0,3); +}else{if(typeof B=="string"){if(B.match(/rgb/)){B=B.rgbToHex().hexToRgb(true);}else{if(B.match(/hsb/)){B=B.hsbToRgb();}else{B=B.hexToRgb(true);}}}}C=C||"rgb"; +switch(C){case"hsb":var A=B;B=B.hsbToRgb();B.hsb=A;break;case"hex":B=B.hexToRgb(true);break;}B.rgb=B.slice(0,3);B.hsb=B.hsb||B.rgbToHsb();B.hex=B.rgbToHex(); +return $extend(B,this);}});Color.implement({mix:function(){var A=Array.slice(arguments);var C=($type(A.getLast())=="number")?A.pop():50;var B=this.slice(); +A.each(function(D){D=new Color(D);for(var E=0;E<3;E++){B[E]=Math.round((B[E]/100*(100-C))+(D[E]/100*C));}});return new Color(B,"rgb");},invert:function(){return new Color(this.map(function(A){return 255-A; +}));},setHue:function(A){return new Color([A,this.hsb[1],this.hsb[2]],"hsb");},setSaturation:function(A){return new Color([this.hsb[0],A,this.hsb[2]],"hsb"); +},setBrightness:function(A){return new Color([this.hsb[0],this.hsb[1],A],"hsb");}});function $RGB(C,B,A){return new Color([C,B,A],"rgb");}function $HSB(C,B,A){return new Color([C,B,A],"hsb"); +}function $HEX(A){return new Color(A,"hex");}Array.implement({rgbToHsb:function(){var B=this[0],C=this[1],J=this[2];var G,F,H;var I=Math.max(B,C,J),E=Math.min(B,C,J); +var K=I-E;H=I/255;F=(I!=0)?K/I:0;if(F==0){G=0;}else{var D=(I-B)/K;var A=(I-C)/K;var L=(I-J)/K;if(B==I){G=L-A;}else{if(C==I){G=2+D-L;}else{G=4+A-D;}}G/=6; +if(G<0){G++;}}return[Math.round(G*360),Math.round(F*100),Math.round(H*100)];},hsbToRgb:function(){var C=Math.round(this[2]/100*255);if(this[1]==0){return[C,C,C]; +}else{var A=this[0]%360;var E=A%60;var F=Math.round((this[2]*(100-this[1]))/10000*255);var D=Math.round((this[2]*(6000-this[1]*E))/600000*255);var B=Math.round((this[2]*(6000-this[1]*(60-E)))/600000*255); +switch(Math.floor(A/60)){case 0:return[C,B,F];case 1:return[D,C,F];case 2:return[F,C,B];case 3:return[F,D,C];case 4:return[B,F,C];case 5:return[C,F,D]; +}}return false;}});String.implement({rgbToHsb:function(){var A=this.match(/\d{1,3}/g);return(A)?hsb.rgbToHsb():null;},hsbToRgb:function(){var A=this.match(/\d{1,3}/g); +return(A)?A.hsbToRgb():null;}});var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={};},addEvent:function(B,A){this.checker[B]=this.checker[B]||{}; +this.events[B]=this.events[B]||[];if(this.events[B].contains(A)){return false;}else{this.events[B].push(A);}this.instances.each(function(C,D){C.addEvent(B,this.check.bind(this,[B,C,D])); +},this);return this;},check:function(C,A,B){this.checker[C][B]=true;var D=this.instances.every(function(F,E){return this.checker[C][E]||false;},this);if(!D){return ; +}this.checker[C]={};this.events[C].each(function(E){E.call(this,this.instances,A);},this);}});var Asset=new Hash({javascript:function(F,D){D=$extend({onload:$empty,document:document,check:$lambda(true)},D); +var B=new Element("script",{src:F,type:"text/javascript"});var E=D.onload.bind(B),A=D.check,G=D.document;delete D.onload;delete D.check;delete D.document; +B.addEvents({load:E,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){E();}}}).setProperties(D);if(Browser.Engine.webkit419){var C=(function(){if(!$try(A)){return ; +}$clear(C);E();}).periodical(50);}return B.inject(G.head);},css:function(B,A){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:B},A)).inject(document.head); +},image:function(C,B){B=$merge({onload:$empty,onabort:$empty,onerror:$empty},B);var D=new Image();var A=$(D)||new Element("img");["load","abort","error"].each(function(E){var F="on"+E; +var G=B[F];delete B[F];D[F]=function(){if(!D){return ;}if(!A.parentNode){A.width=D.width;A.height=D.height;}D=D.onload=D.onabort=D.onerror=null;G.delay(1,A,A); +A.fireEvent(E,A,1);};});D.src=A.src=C;if(D&&D.complete){D.onload.delay(1);}return A.setProperties(B);},images:function(D,C){C=$merge({onComplete:$empty,onProgress:$empty},C); +if(!D.push){D=[D];}var A=[];var B=0;D.each(function(F){var E=new Asset.image(F,{onload:function(){C.onProgress.call(this,B,D.indexOf(F));B++;if(B==D.length){C.onComplete(); +}}});A.push(E);});return new Elements(A);}});var Sortables=new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(A,B){this.setOptions(B); +this.elements=[];this.lists=[];this.idle=true;this.addLists($$($(A)||A));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,$merge({duration:250,link:"cancel"},this.options.revert)); +}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(A){this.elements.push(A); +var B=A.retrieve("sortables:start",this.start.bindWithEvent(this,A));(this.options.handle?A.getElement(this.options.handle)||A:A).addEvent("mousedown",B); +},this);return this;},addLists:function(){Array.flatten(arguments).each(function(A){this.lists.push(A);this.addItems(A.getChildren());},this);return this; +},removeItems:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.elements.erase(B);var C=B.retrieve("sortables:start");(this.options.handle?B.getElement(this.options.handle)||B:B).removeEvent("mousedown",C); +},this);return $$(A);},removeLists:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.lists.erase(B);this.removeItems(B.getChildren()); +},this);return $$(A);},getClone:function(B,A){if(!this.options.clone){return new Element("div").inject(document.body);}if($type(this.options.clone)=="function"){return this.options.clone.call(this,B,A,this.list); +}return A.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:A.getStyle("width")}).inject(this.list).position(A.getPosition(A.getOffsetParent())); +},getDroppables:function(){var A=this.list.getChildren();if(!this.options.constrain){A=this.lists.concat(A).erase(this.list);}return A.erase(this.clone).erase(this.element); +},insert:function(C,B){var A="inside";if(this.lists.contains(B)){this.list=B;this.drag.droppables=this.getDroppables();}else{A=this.element.getAllPrevious().contains(B)?"before":"after"; +}this.element.inject(B,A);this.fireEvent("sort",[this.element,this.clone]);},start:function(B,A){if(!this.idle){return ;}this.idle=false;this.element=A; +this.opacity=A.get("opacity");this.list=A.getParent();this.clone=this.getClone(B,A);this.drag=new Drag.Move(this.clone,{snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables(),onSnap:function(){B.stop(); +this.clone.setStyle("visibility","visible");this.element.set("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]);}.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)}); +this.clone.inject(this.element,"before");this.drag.start(B);},end:function(){this.drag.detach();this.element.set("opacity",this.opacity);if(this.effect){var A=this.element.getStyles("width","height"); +var B=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));this.effect.element=this.clone;this.effect.start({top:B.top,left:B.left,width:A.width,height:A.height,opacity:0.25}).chain(this.reset.bind(this)); +}else{this.reset();}},reset:function(){this.idle=true;this.clone.destroy();this.fireEvent("complete",this.element);},serialize:function(){var C=Array.link(arguments,{modifier:Function.type,index:$defined}); +var B=this.lists.map(function(D){return D.getChildren().map(C.modifier||function(E){return E.get("id");},this);},this);var A=C.index;if(this.lists.length==1){A=0; +}return $chk(A)&&A>=0&&AB[F]){G=D.page[F]-this.options.offsets[F]-E[F];}this.tip.setStyle(C[F],G); +}},fill:function(A,B){(typeof B=="string")?A.set("html",B):A.adopt(B);},show:function(){this.fireEvent("show",this.tip);},hide:function(){this.fireEvent("hide",this.tip); +}});var SmoothScroll=new Class({Extends:Fx.Scroll,initialize:function(B,C){C=C||document;var E=C.getDocument(),D=C.getWindow();this.parent(E,B);this.links=(this.options.links)?$$(this.options.links):$$(E.links); +var A=D.location.href.match(/^[^#]*/)[0]+"#";this.links.each(function(G){if(G.href.indexOf(A)!=0){return ;}var F=G.href.substr(A.length);if(F&&$(F)){this.useLink(G,F); +}},this);if(!Browser.Engine.webkit419){this.addEvent("complete",function(){D.location.hash=this.anchor;},true);}},useLink:function(B,A){B.addEvent("click",function(C){this.anchor=A; +this.toElement(A);C.stop();}.bind(this));}});var Slider=new Class({Implements:[Events,Options],options:{onTick:function(A){if(this.options.snap){A=this.toPosition(this.step); +}this.knob.setStyle(this.property,A);},snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(E,A,D){this.setOptions(D); +this.element=$(E);this.knob=$(A);this.previousChange=this.previousEnd=this.step=-1;this.element.addEvent("mousedown",this.clickedElement.bind(this));if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement.bindWithEvent(this)); +}var F,B={},C={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";F="offsetHeight";break;case"horizontal":this.axis="x"; +this.property="left";F="offsetWidth";}this.half=this.knob[F]/2;this.full=this.element[F]-this.knob[F]+(this.options.offset*2);this.min=$chk(this.options.range[0])?this.options.range[0]:0; +this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps; +this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);C[this.axis]=this.property; +B[this.axis]=[-this.options.offset,this.full-this.options.offset];this.drag=new Drag(this.knob,{snap:0,limit:B,modifiers:C,onDrag:this.draggedKnob.bind(this),onStart:this.draggedKnob.bind(this),onComplete:function(){this.draggedKnob(); +this.end();}.bind(this)});if(this.options.snap){this.drag.options.grid=Math.ceil(this.stepWidth);this.drag.options.limit[this.axis][1]=this.full;}},set:function(A){if(!((this.range>0)^(A0)^(A>this.max))){A=this.max;}this.step=Math.round(A);this.checkStep();this.end();this.fireEvent("tick",this.toPosition(this.step));return this; +},clickedElement:function(C){var B=this.range<0?-1:1;var A=C.page[this.axis]-this.element.getPosition()[this.axis]-this.half;A=A.limit(-this.options.offset,this.full-this.options.offset); +this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();this.end();this.fireEvent("tick",A);},scrolledElement:function(A){var B=(this.options.mode=="horizontal")?(A.wheel<0):(A.wheel>0); +this.set(B?this.step-this.stepSize:this.step+this.stepSize);A.stop();},draggedKnob:function(){var B=this.range<0?-1:1;var A=this.drag.value.now[this.axis]; +A=A.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step; +this.fireEvent("change",this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+""); +}},toStep:function(A){var B=(A+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(B-=B%this.stepSize):B;},toPosition:function(A){return(this.full*Math.abs(this.min-A))/(this.steps*this.stepSize)-this.options.offset; +}});var Scroller=new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(A,B){this.element.scrollTo(A,B);}},initialize:function(B,A){this.setOptions(A); +this.element=$(B);this.listener=($type(this.element)!="element")?$(this.element.getDocument().body):this.element;this.timer=null;this.coord=this.getCoords.bind(this); +},start:function(){this.listener.addEvent("mousemove",this.coord);},stop:function(){this.listener.removeEvent("mousemove",this.coord);this.timer=$clear(this.timer); +},getCoords:function(A){this.page=(this.listener.get("tag")=="body")?A.client:A.page;if(!this.timer){this.timer=this.scroll.periodical(50,this);}},scroll:function(){var B=this.element.getSize(),A=this.element.getScroll(),E=this.element.getPosition(),D={x:0,y:0}; +for(var C in this.page){if(this.page[C]<(this.options.area+E[C])&&A[C]!=0){D[C]=(this.page[C]-this.options.area-E[C])*this.options.velocity;}else{if(this.page[C]+this.options.area>(B[C]+E[C])&&B[C]+B[C]!=A[C]){D[C]=(this.page[C]-B[C]+this.options.area-E[C])*this.options.velocity; +}}}if(D.y||D.x){this.fireEvent("change",[A.x+D.x,A.y+D.y]);}}});var Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var C=Array.link(arguments,{container:Element.type,options:Object.type,togglers:$defined,elements:$defined}); +this.parent(C.elements,C.options);this.togglers=$$(C.togglers);this.container=$(C.container);this.previous=-1;if(this.options.alwaysHide){this.options.wait=true; +}if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show;}if(this.options.start){this.options.display=false;this.options.show=false; +}this.effects={};if(this.options.opacity){this.effects.opacity="fullOpacity";}if(this.options.width){this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth"; +}if(this.options.height){this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight";}for(var B=0,A=this.togglers.length;B0));this.fireEvent(C?"background":"active",[this.togglers[D],E]); +for(var F in this.effects){B[D][F]=C?0:E[this.effects[F]];}},this);return this.start(B);}}); \ No newline at end of file diff --git a/src/webui/scripts/progressbar.js b/src/webui/scripts/progressbar.js new file mode 100644 index 000000000..1574c6aef --- /dev/null +++ b/src/webui/scripts/progressbar.js @@ -0,0 +1,89 @@ +var ProgressBar=new Class({ + initialize:function(value,parameters){ + var vals={ + 'id':'progressbar_'+(ProgressBars++), + 'value':$pick(value,0), + 'width':0, + 'height':0, + 'darkbg':'#006', + 'darkfg':'#fff', + 'lightbg':'#fff', + 'lightfg':'#000' + }; + if(parameters && $type(parameters)=='object')$extend(vals,parameters); + if(vals.height<12)vals.height=12; + var obj=new Element('div',{ + 'id':vals.id, + 'class':'progressbar_wrapper', + 'styles':{ + 'border':'1px solid #000', + 'width':vals.width, + 'height':vals.height, + 'position':'relative' + } + }); + obj.vals=vals; + obj.vals.dark=new Element('div',{ + 'id':vals.id+'_dark', + 'class':'progressbar_dark', + 'styles':{ + 'width':vals.width, + 'height':vals.height, + 'background':vals.darkbg, + 'color':vals.darkfg, + 'position':'absolute', + 'text-align':'center', + 'left':0, + 'top':0, + 'line-height':vals.height-2 + } + }); + obj.vals.light=new Element('div',{ + 'id':vals.id+'_light', + 'class':'progressbar_light', + 'styles':{ + 'width':vals.width, + 'height':vals.height, + 'background':vals.lightbg, + 'color':vals.lightfg, + 'position':'absolute', + 'text-align':'center', + 'left':0, + 'top':0, + 'line-height':vals.height-2 + } + }); + obj.appendChild(obj.vals.dark); + obj.appendChild(obj.vals.light); + obj.setValue=ProgressBar_setValue; + if(vals.width)obj.setValue(vals.value); + else setTimeout('ProgressBar_checkForParent("'+obj.id+'")',1); + return obj; + } +}); +function ProgressBar_setValue(value){ + value=parseFloat(value); + if(isNaN(value))value=0; + if(value>100)value=100; + if(value<0)value=0; + this.vals.value=value; + this.vals.dark.empty(); + this.vals.light.empty(); + this.vals.dark.appendText(value+'%'); + this.vals.light.appendText(value+'%'); + var r=parseInt(this.vals.width*(value/100)); + this.vals.dark.setStyle('clip','rect(0,'+r+'px,'+this.vals.height+'px,0)'); + this.vals.light.setStyle('clip','rect(0,'+this.vals.width+'px,'+this.vals.height+'px,'+r+'px)'); +} +function ProgressBar_checkForParent(id){ + var obj=$(id); + if(!obj)return; + if(!obj.parentNode)return setTimeout('ProgressBar_checkForParent("'+id+'")',1); + obj.setStyle('width','100%'); + var w=obj.offsetWidth; + obj.vals.dark.setStyle('width',w); + obj.vals.light.setStyle('width',w); + obj.vals.width=w; + obj.setValue(obj.vals.value); +} +var ProgressBars=0; diff --git a/src/webui/upload.html b/src/webui/upload.html new file mode 100644 index 000000000..c03f0ac54 --- /dev/null +++ b/src/webui/upload.html @@ -0,0 +1,29 @@ + + + + + Upload local torrent file + + + + + + + +
    +

    Download local torrent

    + + +
    + + diff --git a/src/webui/uploadframe.html b/src/webui/uploadframe.html new file mode 100644 index 000000000..e7e7b38b0 --- /dev/null +++ b/src/webui/uploadframe.html @@ -0,0 +1,28 @@ + + + + + Upload local torrent file + + + + + + + +
    + +

    Point to torrent file

    + Download +
    + +