From 969a02b93e704a7cc7157780194b4ad267362bec Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 30 Sep 2006 16:02:39 +0000 Subject: [PATCH] - Moved everything to trunk to create a stable branch --- AUTHORS | 1 + COPYING | 340 +++ Changelog | 172 ++ INSTALL | 33 + NEWS | 4 + README | 34 + TODO | 36 + configure | 1334 ++++++++++ packaging/debian-unstable/debian/changelog | 134 + packaging/debian-unstable/debian/compat | 1 + packaging/debian-unstable/debian/control | 15 + packaging/debian-unstable/debian/copyright | 26 + packaging/debian-unstable/debian/dirs | 2 + packaging/debian-unstable/debian/docs | 3 + packaging/debian-unstable/debian/rules | 107 + packaging/mandriva/qbittorrent.spec | 249 ++ packaging/mandriva/rb_libtorrent.spec | 147 ++ packaging/ubuntu-dapper/debian/changelog | 134 + packaging/ubuntu-dapper/debian/compat | 1 + packaging/ubuntu-dapper/debian/control | 15 + packaging/ubuntu-dapper/debian/copyright | 26 + packaging/ubuntu-dapper/debian/dirs | 2 + packaging/ubuntu-dapper/debian/docs | 3 + packaging/ubuntu-dapper/debian/files | 1 + .../debian/qbittorrent.substvars | 1 + packaging/ubuntu-dapper/debian/rules | 107 + packaging/ubuntu-edgy/debian/changelog | 134 + packaging/ubuntu-edgy/debian/compat | 1 + packaging/ubuntu-edgy/debian/control | 15 + packaging/ubuntu-edgy/debian/copyright | 26 + packaging/ubuntu-edgy/debian/dirs | 2 + packaging/ubuntu-edgy/debian/docs | 3 + packaging/ubuntu-edgy/debian/files | 1 + .../ubuntu-edgy/debian/qbittorrent.substvars | 1 + packaging/ubuntu-edgy/debian/rules | 107 + qbittorrent.pro | 4 + qbittorrent.qc | 20 + qcm/libboost.qcm | 40 + qcm/libcurl.qcm | 25 + qcm/libtorrent.qcm | 25 + qcm/python.qcm | 19 + qcm/qt41.qcm | 16 + src/DLListDelegate.h | 162 ++ src/GUI.cpp | 2192 +++++++++++++++++ src/GUI.h | 195 ++ src/Icons/button_cancel.png | Bin 0 -> 1468 bytes src/Icons/button_ok.png | Bin 0 -> 1393 bytes src/Icons/encrypted.png | Bin 0 -> 750 bytes src/Icons/filter.png | Bin 0 -> 1168 bytes src/Icons/flags/bulgaria.png | Bin 0 -> 173 bytes src/Icons/flags/china.png | Bin 0 -> 284 bytes src/Icons/flags/china_hong_kong.png | Bin 0 -> 431 bytes src/Icons/flags/france.png | Bin 0 -> 156 bytes src/Icons/flags/germany.png | Bin 0 -> 180 bytes src/Icons/flags/greece.png | Bin 0 -> 382 bytes src/Icons/flags/italy.png | Bin 0 -> 169 bytes src/Icons/flags/netherlands.png | Bin 0 -> 167 bytes src/Icons/flags/poland.png | Bin 0 -> 172 bytes src/Icons/flags/portugal.png | Bin 0 -> 525 bytes src/Icons/flags/romania.png | Bin 0 -> 156 bytes src/Icons/flags/russia.png | Bin 0 -> 167 bytes src/Icons/flags/slovakia.png | Bin 0 -> 440 bytes src/Icons/flags/south_korea.png | Bin 0 -> 1131 bytes src/Icons/flags/spain.png | Bin 0 -> 355 bytes src/Icons/flags/spain_catalunya.png | Bin 0 -> 221 bytes src/Icons/flags/sweden.png | Bin 0 -> 313 bytes src/Icons/flags/turkey.png | Bin 0 -> 405 bytes src/Icons/flags/ukraine.png | Bin 0 -> 200 bytes src/Icons/flags/united_kingdom.png | Bin 0 -> 1038 bytes src/Icons/home.png | Bin 0 -> 1199 bytes src/Icons/locale.png | Bin 0 -> 1319 bytes src/Icons/log.png | Bin 0 -> 846 bytes src/Icons/proxy.png | Bin 0 -> 1500 bytes src/Icons/qBittorrent.desktop | 26 + src/Icons/qbittorrent16.png | Bin 0 -> 965 bytes src/Icons/qbittorrent22.png | Bin 0 -> 2084 bytes src/Icons/qbittorrent32.png | Bin 0 -> 2615 bytes src/Icons/skin/add.png | Bin 0 -> 496 bytes src/Icons/skin/connected.png | Bin 0 -> 2312 bytes src/Icons/skin/connecting.png | Bin 0 -> 576 bytes src/Icons/skin/delete.png | Bin 0 -> 2350 bytes src/Icons/skin/delete_all.png | Bin 0 -> 2492 bytes src/Icons/skin/disconnected.png | Bin 0 -> 2035 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 -> 2854 bytes src/Icons/skin/info.png | Bin 0 -> 2211 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/remove.png | Bin 0 -> 304 bytes src/Icons/skin/search.png | Bin 0 -> 1130 bytes src/Icons/skin/seeding.png | Bin 0 -> 427 bytes src/Icons/skin/settings.png | Bin 0 -> 2483 bytes src/Icons/skin/stalled.png | Bin 0 -> 315 bytes src/Icons/skin/url.png | Bin 0 -> 2509 bytes src/Icons/smile.png | Bin 0 -> 770 bytes src/Icons/splash.jpg | Bin 0 -> 40239 bytes src/Icons/stare.png | Bin 0 -> 766 bytes src/Icons/style.png | Bin 0 -> 1098 bytes src/Icons/systemtray.png | Bin 0 -> 1235 bytes src/Icons/unhappy.png | Bin 0 -> 825 bytes src/Icons/wizard.png | Bin 0 -> 1325 bytes src/MainWindow.ui | 930 +++++++ src/OSD.cpp | 65 + src/OSD.h | 47 + src/PreviewListDelegate.h | 115 + src/PropListDelegate.h | 126 + src/SearchListDelegate.h | 95 + src/about.ui | 427 ++++ src/about_imp.h | 405 +++ src/createtorrent.ui | 275 +++ src/createtorrent_imp.cpp | 136 + src/createtorrent_imp.h | 40 + src/doc/qbittorrent.1.gz | Bin 0 -> 485 bytes src/downloadFromURL.ui | 158 ++ src/downloadFromURLImp.h | 76 + src/downloadThread.h | 119 + src/icons.qrc | 67 + src/lang.qrc | 24 + src/lang/qbittorrent_bg.qm | Bin 0 -> 15174 bytes src/lang/qbittorrent_bg.ts | 1624 ++++++++++++ src/lang/qbittorrent_ca.qm | Bin 0 -> 15391 bytes src/lang/qbittorrent_ca.ts | 1672 +++++++++++++ src/lang/qbittorrent_de.qm | Bin 0 -> 15006 bytes src/lang/qbittorrent_de.ts | 1621 ++++++++++++ src/lang/qbittorrent_el.qm | Bin 0 -> 16128 bytes src/lang/qbittorrent_el.ts | 1664 +++++++++++++ src/lang/qbittorrent_en.qm | Bin 0 -> 337 bytes src/lang/qbittorrent_en.ts | 1273 ++++++++++ src/lang/qbittorrent_es.qm | Bin 0 -> 16494 bytes src/lang/qbittorrent_es.ts | 1645 +++++++++++++ src/lang/qbittorrent_fr.qm | Bin 0 -> 18929 bytes src/lang/qbittorrent_fr.ts | 1753 +++++++++++++ src/lang/qbittorrent_it.qm | Bin 0 -> 15804 bytes src/lang/qbittorrent_it.ts | 1485 +++++++++++ src/lang/qbittorrent_ko.qm | Bin 0 -> 10459 bytes src/lang/qbittorrent_ko.ts | 1642 ++++++++++++ src/lang/qbittorrent_nl.qm | Bin 0 -> 15295 bytes src/lang/qbittorrent_nl.ts | 1602 ++++++++++++ src/lang/qbittorrent_pl.qm | Bin 0 -> 15309 bytes src/lang/qbittorrent_pl.ts | 1647 +++++++++++++ src/lang/qbittorrent_pt.qm | Bin 0 -> 15237 bytes src/lang/qbittorrent_pt.ts | 1465 +++++++++++ src/lang/qbittorrent_ro.qm | Bin 0 -> 15603 bytes src/lang/qbittorrent_ro.ts | 1466 +++++++++++ src/lang/qbittorrent_ru.qm | Bin 0 -> 15304 bytes src/lang/qbittorrent_ru.ts | 1554 ++++++++++++ src/lang/qbittorrent_sk.qm | Bin 0 -> 11934 bytes src/lang/qbittorrent_sk.ts | 1524 ++++++++++++ src/lang/qbittorrent_sv.qm | Bin 0 -> 15179 bytes src/lang/qbittorrent_sv.ts | 1331 ++++++++++ src/lang/qbittorrent_tr.qm | Bin 0 -> 15167 bytes src/lang/qbittorrent_tr.ts | 1656 +++++++++++++ src/lang/qbittorrent_uk.qm | Bin 0 -> 15551 bytes src/lang/qbittorrent_uk.ts | 1570 ++++++++++++ src/lang/qbittorrent_zh.qm | Bin 0 -> 9049 bytes src/lang/qbittorrent_zh.ts | 1547 ++++++++++++ src/lang/qbittorrent_zh_HK.qm | Bin 0 -> 6634 bytes src/lang/qbittorrent_zh_HK.ts | 1437 +++++++++++ src/login.ui | 299 +++ src/main.cpp | 169 ++ 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 | 190 ++ src/options.ui | 1305 ++++++++++ src/options_imp.cpp | 942 +++++++ src/options_imp.h | 106 + src/preview.ui | 149 ++ src/previewSelect.h | 144 ++ src/properties.ui | 780 ++++++ src/properties_imp.cpp | 229 ++ src/properties_imp.h | 53 + src/search.qrc | 5 + src/search_engine/nova.py | 432 ++++ src/src.pro | 102 + src/trackerLogin.h | 68 + src/trayicon/trayicon.cpp | 292 +++ src/trayicon/trayicon.h | 98 + src/trayicon/trayicon.pri | 21 + src/trayicon/trayicon_mac.cpp | 17 + src/trayicon/trayicon_win.cpp | 243 ++ src/trayicon/trayicon_x11.cpp | 458 ++++ src/update_qrc_files.py | 43 + testpython.py | 12 + 200 files changed, 46382 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 packaging/debian-unstable/debian/changelog create mode 100644 packaging/debian-unstable/debian/compat create mode 100644 packaging/debian-unstable/debian/control create mode 100644 packaging/debian-unstable/debian/copyright create mode 100644 packaging/debian-unstable/debian/dirs create mode 100644 packaging/debian-unstable/debian/docs create mode 100755 packaging/debian-unstable/debian/rules create mode 100644 packaging/mandriva/qbittorrent.spec create mode 100644 packaging/mandriva/rb_libtorrent.spec create mode 100644 packaging/ubuntu-dapper/debian/changelog create mode 100644 packaging/ubuntu-dapper/debian/compat create mode 100644 packaging/ubuntu-dapper/debian/control create mode 100644 packaging/ubuntu-dapper/debian/copyright create mode 100644 packaging/ubuntu-dapper/debian/dirs create mode 100644 packaging/ubuntu-dapper/debian/docs create mode 100644 packaging/ubuntu-dapper/debian/files create mode 100644 packaging/ubuntu-dapper/debian/qbittorrent.substvars create mode 100755 packaging/ubuntu-dapper/debian/rules create mode 100644 packaging/ubuntu-edgy/debian/changelog create mode 100644 packaging/ubuntu-edgy/debian/compat create mode 100644 packaging/ubuntu-edgy/debian/control create mode 100644 packaging/ubuntu-edgy/debian/copyright create mode 100644 packaging/ubuntu-edgy/debian/dirs create mode 100644 packaging/ubuntu-edgy/debian/docs create mode 100644 packaging/ubuntu-edgy/debian/files create mode 100644 packaging/ubuntu-edgy/debian/qbittorrent.substvars create mode 100755 packaging/ubuntu-edgy/debian/rules 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/libtorrent.qcm create mode 100644 qcm/python.qcm create mode 100644 qcm/qt41.qcm create mode 100644 src/DLListDelegate.h create mode 100644 src/GUI.cpp create mode 100644 src/GUI.h create mode 100644 src/Icons/button_cancel.png create mode 100644 src/Icons/button_ok.png create mode 100644 src/Icons/encrypted.png create mode 100644 src/Icons/filter.png create mode 100644 src/Icons/flags/bulgaria.png create mode 100644 src/Icons/flags/china.png create mode 100644 src/Icons/flags/china_hong_kong.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/italy.png create mode 100644 src/Icons/flags/netherlands.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/turkey.png create mode 100644 src/Icons/flags/ukraine.png create mode 100644 src/Icons/flags/united_kingdom.png create mode 100644 src/Icons/home.png create mode 100644 src/Icons/locale.png create mode 100644 src/Icons/log.png create mode 100644 src/Icons/proxy.png create mode 100644 src/Icons/qBittorrent.desktop create mode 100644 src/Icons/qbittorrent16.png create mode 100644 src/Icons/qbittorrent22.png create mode 100644 src/Icons/qbittorrent32.png create mode 100644 src/Icons/skin/add.png create mode 100644 src/Icons/skin/connected.png create mode 100644 src/Icons/skin/connecting.png create mode 100644 src/Icons/skin/delete.png create mode 100644 src/Icons/skin/delete_all.png create mode 100644 src/Icons/skin/disconnected.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/info.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/remove.png create mode 100644 src/Icons/skin/search.png create mode 100644 src/Icons/skin/seeding.png create mode 100644 src/Icons/skin/settings.png create mode 100644 src/Icons/skin/stalled.png create mode 100644 src/Icons/skin/url.png create mode 100644 src/Icons/smile.png create mode 100644 src/Icons/splash.jpg create mode 100644 src/Icons/stare.png create mode 100644 src/Icons/style.png create mode 100644 src/Icons/systemtray.png create mode 100644 src/Icons/unhappy.png create mode 100644 src/Icons/wizard.png create mode 100644 src/MainWindow.ui create mode 100644 src/OSD.cpp create mode 100644 src/OSD.h create mode 100644 src/PreviewListDelegate.h create mode 100644 src/PropListDelegate.h create mode 100644 src/SearchListDelegate.h create mode 100644 src/about.ui create mode 100644 src/about_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/doc/qbittorrent.1.gz create mode 100644 src/downloadFromURL.ui create mode 100644 src/downloadFromURLImp.h create mode 100644 src/downloadThread.h create mode 100644 src/icons.qrc 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_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_fr.qm create mode 100644 src/lang/qbittorrent_fr.ts create mode 100644 src/lang/qbittorrent_it.qm create mode 100644 src/lang/qbittorrent_it.ts create mode 100644 src/lang/qbittorrent_ko.qm create mode 100644 src/lang/qbittorrent_ko.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_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_HK.qm create mode 100644 src/lang/qbittorrent_zh_HK.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/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/search.qrc create mode 100755 src/search_engine/nova.py create mode 100644 src/src.pro create mode 100644 src/trackerLogin.h create mode 100644 src/trayicon/trayicon.cpp create mode 100644 src/trayicon/trayicon.h create mode 100644 src/trayicon/trayicon.pri create mode 100644 src/trayicon/trayicon_mac.cpp create mode 100644 src/trayicon/trayicon_win.cpp create mode 100644 src/trayicon/trayicon_x11.cpp create mode 100755 src/update_qrc_files.py create mode 100755 testpython.py diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..db09b119c --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Christophe Dumez diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..3912109b5 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin 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..9a181a262 --- /dev/null +++ b/Changelog @@ -0,0 +1,172 @@ +* Unknown - Christophe Dumez - v0.7.0 + - FEATURE: Based on new libtorrent v0.11 (a lot of bugfixes, new features) + - FEATURE: Added DHT (Trackerless) support + - FEATURE: Added support for incremental download (slower but good for previewing) + - FEATURE: Audio/Video File previewing while downloading + - FEATURE: 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 their url at once + - FEATURE: New context menu on main window (Add, Start all, Pause all, Exit...) + - FEATURE: Now supports two new search engines (BtJunkie, 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. + - 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 + - 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 + +* 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..77eb8fcd4 --- /dev/null +++ b/INSTALL @@ -0,0 +1,33 @@ +qBittorrent - A BitTorrent client in C++ / Qt4.1 +------------------------------------------ + +*** 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.1 (libqt-devel, libqtxml, libqtgui, libqtcore, libqtnetwork) + +- rb_libtorrent by Arvid Norberg (>= v0.10 REQUIRED) + -> http://libtorrent.sf.net + Be carefull: another library (the one used by rtorrent) use the same name. + These are TWO different libraries and qBittorrent will only work with the one provided + on sourceforge (created by Arvid Norberg). The two libraries conflicts with each other. + +- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization + +- libcurl + +- python >= 2.3 (previous might work - not tested): needed by search engine. + + +------------------------------------------ +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..a2b705d71 --- /dev/null +++ b/README @@ -0,0 +1,34 @@ +qBittorrent - A BitTorrent client in Qt4.1 +------------------------------------------ + +Description: +******************************** +qBittorrent is a bittorrent client programmed in C++ / Qt4.1 that use +libtorrent (sometimes called rb_libtorrent) 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. + +Installation: +******************************** +For installation follow the instructions from INSTALL file, but simple + +./configure +make && make install +qbittorrent + +will install and execute qBittorrent hopefully without any problems. + +For more information please visit: +http://www.qbittorrent.org + +Please report any bug (or feature requests) to: +http://bugs.qbittorrent.org + +You can also meet me on IRC: +#qbittorrent on irc.freenode.net + +------------------------------------------ +Christophe Dumez + diff --git a/TODO b/TODO new file mode 100644 index 000000000..a79a4d30e --- /dev/null +++ b/TODO @@ -0,0 +1,36 @@ +// Easy +- Write documentation +- Translations into as many languages as possible +- Improve man page +- Add more keyboard shortcuts +- Improve torrent creation tool (look & features) + +// Intermediate +- Move novaUpdater to a Thread (probably use downloadThread) to prevent GUI freezing +- Port on MacOS, Windows (and create an installer for Windows) - Progressing +- Allow to prioritize files within a torrent +- Allow to prioritize torrents +- Optimize code to use less memory/cpu +- Add some transparency (menus, OSD) +- Rewrite trayicon using QSystemTrayIcon class (waiting for Qt 4.2) +- Popup when adding a torrent (Save path, select files in the torrent...) (v0.8.0?) + +// Harder +- Allow user to organize the downloads into categories/folders +- Display new searches in new tabs +- Display a progress bar that really display the pieces we have (like in eMule) + +// Unsure +- Move Speed/ratio to a status bar ? +- Azureus spoofing to prevent ban from trackers? +- Download from RSS? +- Encryption support (waiting for libtorrent) +- Split kernel from GUI? (would be a lot better but require some deep changes) +- Web interface? + +// Before 0.7.0 +- Test file previewing +- Test tracker authentication +- Wait for libtorrent v0.11 final release +- Test DHT +- Test incremental download diff --git a/configure b/configure new file mode 100755 index 000000000..2bdacfd21 --- /dev/null +++ b/configure @@ -0,0 +1,1334 @@ +#!/bin/sh +# +# Generated by qconf 1.2 ( 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 + ;; + + --verbose) + QC_DEBUG="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_DEBUG" = "Y" ]; then +echo +echo PREFIX=$PREFIX +echo BINDIR=$BINDIR +echo DATADIR=$DATADIR +echo EX_QTDIR=$EX_QTDIR +echo +fi + +printf "Verifying Qt 4 build environment ... " + +if [ "$QC_DEBUG" = "Y" ]; then + echo +fi + +qm="" + +# qt4 check: --qtdir +if [ -z "$qm" ]; then + qstr=$EX_QTDIR/bin/qmake + if [ -x "$qstr" ]; then + qm=$qstr + fi +fi +if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then + echo "Warning: qmake not found via --qtdir" +fi + +# qt4 check: QTDIR +if [ -z "$qm" ]; then + qstr=$QTDIR/bin/qmake + if [ -x "$qstr" ]; then + qm=$qstr + fi +fi +if [ -z "$qm" ] && [ "$QC_DEBUG" = "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 + qstr=$str/bin/qmake + if [ -x "$qstr" ]; then + qm=$qstr + fi + fi +fi +if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then + echo "Warning: qmake not found via pkg-config" +fi + +# qt4 check: PATH +if [ -z "$qm" ]; then + qstr=`$WHICH qmake 2>/dev/null` + if [ -x "$qstr" ]; then + qm=$qstr + fi +fi +if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then + echo "Warning: qmake not found via \$PATH" +fi + +if [ -z "$qm" ]; then + if [ "$QC_DEBUG" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + printf "\n" + printf "Reason: Unable to find the 'qmake' tool.\n" + printf "\n" + show_qt_info + exit 1; +fi +if [ "$QC_DEBUG" = "Y" ]; then + echo qmake found in $qm +fi + +gen_files() { +cat >$1/modules.cpp <= 4.1 +-----END QCMOD----- +*/ +class qc_qt41 : public ConfObj +{ +public: + qc_qt41(Conf *c) : ConfObj(c) {} + QString name() const { return "Qt >= 4.1"; } + QString shortname() const { return "qt41"; } + bool exec() + { + return(QT_VERSION >= 0x040100); + } +}; +#line 1 "libtorrent.qcm" +/* +-----BEGIN QCMOD----- +name: libtorrent +-----END QCMOD----- +*/ +class qc_libtorrent : public ConfObj +{ +public: + qc_libtorrent(Conf *c) : ConfObj(c) {} + QString name() const { return "libtorrent >= 0.11"; } + QString shortname() const { return "libtorrent"; } + bool exec(){ + QString s; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("libtorrent/kademlia/node.hpp", sl, &s)) { + qWarning("libtorrent v0.11 includes not found!\nYou can download it at http://www.libtorrent.net"); + return false; + } + conf->addIncludePath(s); + return true; + } +}; +#line 1 "libboost.qcm" +/* +-----BEGIN QCMOD----- +name: libboost +-----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; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("boost/format.hpp", sl, &s)) { + qWarning("libboost includes not found!"); + return false; + } + conf->addIncludePath(s); + if(!conf->findHeader("boost/date_time/posix_time/posix_time.hpp", sl, &s)) { + qWarning("libboost-date-time includes not found!"); + return false; + } + conf->addIncludePath(s); + if(!conf->findHeader("boost/filesystem/path.hpp", sl, &s)) { + qWarning("libboost-filesystem includes not found!"); + return false; + } + if(!conf->findHeader("boost/thread.hpp", sl, &s)) { + qWarning("libboost-thread includes not found!"); + return false; + } + conf->addIncludePath(s); + + return true; + } +}; +#line 1 "libcurl.qcm" +/* +-----BEGIN QCMOD----- +name: libcurl +-----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; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("curl/curl.h", sl, &s)) { + qWarning("libcurl includes not found!\n"); + return false; + } + conf->addIncludePath(s); + return true; + } +}; +#line 1 "python.qcm" +/* +-----BEGIN QCMOD----- +name: python +-----END QCMOD----- +*/ +class qc_python : public ConfObj +{ +public: + qc_python(Conf *c) : ConfObj(c) {} + QString name() const { return "python >= 2.3"; } + QString shortname() const { return "python"; } + bool exec(){ + int r = conf->doCommand("python testpython.py"); + if(r == 0) + return true; + else + return false; + } +}; + +EOT +cat >$1/modules_new.cpp <required = true; + o->disabled = false; + o = new qc_libtorrent(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_python(conf); + o->required = true; + 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(); + */ +} + +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); + } + } +} + +//---------------------------------------------------------------------------- +// 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_") + o->shortname(); + if(getenv(v) != "Y") + continue; + } + // and the opposite? + else + { + QString v = QString("QC_DISABLE_") + 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"); + + 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_DEBUG") == "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("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_DEBUG" = "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_DEBUG" = "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_DEBUG" = "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/packaging/debian-unstable/debian/changelog b/packaging/debian-unstable/debian/changelog new file mode 100644 index 000000000..e4b4fdb5b --- /dev/null +++ b/packaging/debian-unstable/debian/changelog @@ -0,0 +1,134 @@ +qbittorrent (0.6.1-1) unstable; urgency=low + + * Disabled debug mode + + -- Christophe Dumez Mon, 28 Aug 2006 21:22:48 +0200 + +qbittorrent (0.6.1-0) unstable; urgency=low + * BUGFIX: Fixed possible segfaults when using context menus + * BUGFIX: Cleanup up context menus code + * BUGFIX: Used best gzip compressing for manpage + + -- Christophe Dumez Thu, 24 Aug 2006 19:53:32 +0200 + +qbittorrent (0.6.0) unstable; urgency=low + * 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 + + -- Christophe Dumez Wed, 22 Aug 2006 10:42:37 +0200 + +qbittorrent (0.5.0) unstable; urgency=low + * Improved "Download from url" feature (now supports https, ftp & redirections) + * Added a torrent creation tool + * Display progress for each file within a torrent + * Based on new libtorrent v0.10 (lot of improvements) + * Now possible to clear log textbox (popup menu) + * Added two search engines (isohunt, torrentreactor) + * Now Display share ratio on main window + * Use OSD (On Screen Display) when a download or a search is finished + * Allow only one instance of qBittorrent (and add new parameters to download list) + * Remember last selected search engines in search tab + * Improved search engines status output (Aborted, timed out, finished, no results) + * qBittorrent can now update search plugin from qbittorrent.org + * Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages + * Fixed ThePirateBay parser for search engine (website had changed) + * Fixed filenames for results from ThePirateBay search engine + * Fixed unicode support for ThePirateBay search engine + * Now search results are sorted by seeds + * Overwrite nova.py search plugin only if it is outdated + * Fixed possible division by 0 in ETA calculation + * Improved ETA calculation precision + * Fixed default tab in options + * When saving options, reconnect only when listening ports changed + * qBittorrent has now its own new logo + * Display status "downloading" if DL Speed > 0 (even when tracker is down) + * Added a splashscreen + * qBittorrent has new cute icons + * Display number of results in search tab + * Added icons for each item in download list according to its state + * Redesigned Locale settings + * Fixed search engines names width (were cut on the right) + * Moved search engines to the left of the window (better ui) + + -- Christophe Dumez Wed, 2 Aug 2006 19:46:32 +0200 + +qbittorrent (0.4.1) unstable; urgency=low + * 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 + + -- Christophe Dumez Thu, 22 Jun 2006 20:14:27 +0200 + +qbittorrent (0.4.0) unstable; urgency=low + + * 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 + + -- Christophe Dumez Wed, 14 Jun 2006 14:47:27 +0200 + +qbittorrent (0.3.1) unstable; urgency=low + + * 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). + + -- Christophe Dumez Sat, 6 Jun 2006 21:36:27 +0200 + + +qbittorrent (0.3) unstable; urgency=low + + * Initial Release. + + -- Christophe Dumez Sat, 3 Jun 2006 21:57:27 +0200 diff --git a/packaging/debian-unstable/debian/compat b/packaging/debian-unstable/debian/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/packaging/debian-unstable/debian/compat @@ -0,0 +1 @@ +4 diff --git a/packaging/debian-unstable/debian/control b/packaging/debian-unstable/debian/control new file mode 100644 index 000000000..1db544765 --- /dev/null +++ b/packaging/debian-unstable/debian/control @@ -0,0 +1,15 @@ +Source: qbittorrent +Section: net +Priority: optional +Maintainer: Christophe Dumez +Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev +Standards-Version: 3.6.2 + +Package: qbittorrent +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3) +Description: Bittorrent client in Qt4.1 / C++ + qBittorrent is a bittorrent client programmed in C++ / Qt4.1 + using rb_libtorrent by Arvid Norberg. It aims to be a good + alternative to other bittorrent client out there. It is fast, + stable and provides unicode support. diff --git a/packaging/debian-unstable/debian/copyright b/packaging/debian-unstable/debian/copyright new file mode 100644 index 000000000..5434e51a4 --- /dev/null +++ b/packaging/debian-unstable/debian/copyright @@ -0,0 +1,26 @@ +This is qbittorrent, written and maintained by Christophe Dumez +on Sat, 3 Jun 2006 21:57:27 +0200. + +The original source can always be found at: + ftp://ftp.debian.org/dists/unstable/main/source/ + +Copyright (C) 2006 Christophe Dumez + +License: + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. diff --git a/packaging/debian-unstable/debian/dirs b/packaging/debian-unstable/debian/dirs new file mode 100644 index 000000000..ca882bbb7 --- /dev/null +++ b/packaging/debian-unstable/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/packaging/debian-unstable/debian/docs b/packaging/debian-unstable/debian/docs new file mode 100644 index 000000000..5502ed8f4 --- /dev/null +++ b/packaging/debian-unstable/debian/docs @@ -0,0 +1,3 @@ +NEWS +README +TODO diff --git a/packaging/debian-unstable/debian/rules b/packaging/debian-unstable/debian/rules new file mode 100755 index 000000000..e5c6e95a4 --- /dev/null +++ b/packaging/debian-unstable/debian/rules @@ -0,0 +1,107 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr + + +build: build-stamp + +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + #docbook-to-man debian/qbittorrent.sgml > qbittorrent.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/qbittorrent. + $(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs Changelog + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/packaging/mandriva/qbittorrent.spec b/packaging/mandriva/qbittorrent.spec new file mode 100644 index 000000000..7dbbd4cfd --- /dev/null +++ b/packaging/mandriva/qbittorrent.spec @@ -0,0 +1,249 @@ + +%define name qbittorrent +%define major 0 +%define minor 6 +%define patch 1 +%define version %{major}.%{minor}.%{patch} +%define release %mkrel 2 +%define _iconsdir %{_datadir}/icons +%define _mandir %_datadir/man + +Name: %{name} +Summary: A Bittorrent Client using C++ / Qt4 +Version: %{version} +Release: %{release} +Source0: http://sourceforge.net/projects/qbittorrent/%{name}-%{version}.tar.gz +URL: http://sourceforge.net/projects/qbittorrent +Vendor: http://qbittorrent.sourceforge.net/ +Group: Internet/File Transfer +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +License: GPL +BuildRequires: libqt4-devel >= 4.1.2, libqtgui4 >= 4.1.2, libqtcore4 >= 4.1.2, libqtxml4 >= 4.1.2, libqtnetwork4 >= 4.1.2, rb_libtorrent-devel >= 0.10-3, libcurl3-devel +Requires: libqtgui4 >= 4.1.2, libqtcore4 >= 4.1.2, libqtxml4 >= 4.1.2, libqtnetwork4 >= 4.1.2, librb_libtorrent0 >= 0.10-3, python >= 2.3, libcurl3 + +%description +A Bittorrent client using C++ / libtorrent and a Qt4 Graphical User Interface. +It aims to be as fast as possible and to provide multi-OS, unicode support. + +%prep +%setup + +%build +# Export the Environment variables +export QTDIR=%_prefix/%_lib/qt4 +export KDEDIR=%_prefix +export LD_LIBRARY_PATH=$QTDIR/%_lib:$KDEDIR/%_lib:$LD_LIBRARY_PATH +export PATH=$QTDIR/bin:$KDEDIR/bin:$PATH + + +# Change to the Source directory and configure +#cd src +CFLAGS="%optflags" CXXFLAGS="%optflags" \ +./configure --prefix=%{buildroot}%{_prefix} + +# Necessary to remove old compiled files.. if they exist +make clean + +%make + +%install +%makeinstall --directory=src + + +# Create the menu directory +install -d %{buildroot}%{_menudir} + +# Build the Menu +#
[requires] [title] +kdedesktop2mdkmenu.pl %{name} "%{group}" %{buildroot}%{_datadir}/applications/qBittorrent.desktop %{buildroot}%{_menudir}/%{name} + +%clean +%{__rm} -rf %{buildroot} + +%post +/sbin/ldconfig +%{update_menus} + +%postun +/sbin/ldconfig +%{clean_menus} + + +%files +%defattr(-,root,root) +%doc README INSTALL NEWS COPYING AUTHORS TODO Changelog +%doc %{_mandir}/man1/*.bz2 + + +# The binaries +%_bindir/* + + +# Icon files +# Hi and Lo colour icons various sizes +%_iconsdir/hicolor/128x128/apps/qbittorrent.png +%_iconsdir/hicolor/16x16/apps/qbittorrent.png +%_iconsdir/hicolor/192x192/apps/qbittorrent.png +%_iconsdir/hicolor/22x22/apps/qbittorrent.png +%_iconsdir/hicolor/24x24/apps/qbittorrent.png +%_iconsdir/hicolor/32x32/apps/qbittorrent.png +%_iconsdir/hicolor/36x36/apps/qbittorrent.png +%_iconsdir/hicolor/48x48/apps/qbittorrent.png +%_iconsdir/hicolor/64x64/apps/qbittorrent.png +%_iconsdir/hicolor/72x72/apps/qbittorrent.png +%_iconsdir/hicolor/96x96/apps/qbittorrent.png +## %_iconsdir/hicolor/scalable/apps/qbittorrent.svgz + + +# Desktop Link +%_datadir/applications/qBittorrent.desktop + +# The qbittorrent Menu directory +%dir %{_menudir} +%{_menudir}/%{name} + + +%changelog + +* Wed Aug 23 2006 - Christophe Dumez - 0.6.0-0.1.2006mdk +- 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 + +* Tue Aug 08 2006 - Christophe Dumez - 0.5.0-0.1.20060mdk + - 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 - 0.4.1-0.1.20060mdk +- 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 - 0.4.0-0.1.20060mdk +- 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 - 0.3.1-0.1.20060mdk +- 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 - 0.3-0.1.20060mdk +- 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 0.2.3-0.1.20060mdk +- Fixed ports checking function (user couldn't type the value he wanted) +- Check tracker errors list size and clear it if it becomes too big. +- qBittorrent does not remove .torrent file from scanned directory anymore +- Small cosmetic change + +* Wed May 31 2006 Christophe Dumez 0.2.2-0.1.20060mdk +- Fixed missing icons + +* Sat May 27 2006 Jeffery Fernandez 0.2.1-0.1.20060mdk +- Initial Build for Mandriva Linux + +* Thu May 25 2006 Christophe Dumez +- 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/packaging/mandriva/rb_libtorrent.spec b/packaging/mandriva/rb_libtorrent.spec new file mode 100644 index 000000000..110c5583f --- /dev/null +++ b/packaging/mandriva/rb_libtorrent.spec @@ -0,0 +1,147 @@ + +%define package_name rb_libtorrent +%define orig_name libtorrent +%define major 0 +%define minor .10 +%define patch .1 +%define version %{major}%{minor} +%define candidate -rc1 +%define lib_name %mklibname %{package_name} %{major} +%define release %mkrel 4 + +Summary : libtorrent is a C++ bittorrent library. +Name : %{package_name} +Version : %{version} +Release : %{release} +License : GPL +Group : Development/C++ +Source0 : http://www.rasterbar.com/products/libtorrent/libtorrent-%{version}.tar.gz +URL : http://www.rasterbar.com +BuildRequires : boost >= 1.33.1 +BuildRoot : %{_tmppath}/%{orig_name}-%{version}-%{release}-root +Patch0 : file_progress_arvid.patch.bz2 + +%description + libtorrent is a C++ library that aims to be a good alternative +to all the other bittorrent implementations around. + + +%package -n %{package_name}-devel +Group : Development/C++ +Summary : Development files for %{package_name} +Conflicts : libtorrent7-devel + +%description -n %{package_name}-devel + Development files for %{package_name} + +%package -n %{lib_name} +Group : Development/C++ +Summary : Library files for %{package_name} +Conflicts : libtorrent7 + +%description -n %{lib_name} + Library files for %{package_name} + +%prep +%setup -n %{orig_name}-%{version} + +%build +%configure --prefix=%{_prefix} +%make + + +%install +%makeinstall + +# Create directories for the package +install -d %{buildroot}%{_includedir}/%{orig_name} +install -d %{buildroot}%{_libdir}/pkgconfig + +%clean +rm -rf %{buildroot} + +# The binaries +%files %(orig_name) +%defattr(0644, root, root, 0755) +%{_bindir}/* + +# Documentation +%defattr(-, root, root) +%doc README AUTHORS INSTALL COPYING ChangeLog NEWS +%doc docs/* + + +# Devel Package +%files -n %{package_name}-devel +%defattr(-,root,root,-) +%dir %{_includedir}/%{orig_name}/ +%dir %{_includedir}/%{orig_name}/asio/ +%dir %{_includedir}/%{orig_name}/asio/detail/ +%dir %{_includedir}/%{orig_name}/asio/impl/ +%dir %{_includedir}/%{orig_name}/asio/ip/ +%dir %{_includedir}/%{orig_name}/asio/ip/detail/ +%dir %{_includedir}/%{orig_name}/asio/ssl/ +%dir %{_includedir}/%{orig_name}/asio/ssl/detail/ +%{_includedir}/%{orig_name}/*.hpp +%{_includedir}/%{orig_name}/asio/*.hpp +%{_includedir}/%{orig_name}/asio/detail/*.hpp +%{_includedir}/%{orig_name}/asio/impl/*.ipp +%{_includedir}/%{orig_name}/asio/ip/*.hpp +%{_includedir}/%{orig_name}/asio/ip/detail/*.hpp +%{_includedir}/%{orig_name}/asio/ssl/*.hpp +%{_includedir}/%{orig_name}/asio/ssl/detail/*.hpp + + + + + +%{_libdir}/%{orig_name}.a +%{_libdir}/%{orig_name}.la +%{_libdir}/%{orig_name}.so +%{_libdir}/pkgconfig/libtorrent.pc + + +# Library Package +%files -n %{lib_name} +%defattr(-,root,root,-) +%_libdir/%{orig_name}.so.* + + +%changelog + +* Wed Aug 23 2006 Christophe Dumez 10.0.1-2006mdk +- Added patch for Torrent Properties crash fix + +* Sat Jul 1 2006 %{packager} %{version}-%{release} +- fixed a bug where the requested number of peers in a tracker request could + be too big. +- fixed a bug where empty files were not created in full allocation mode. +- fixed a bug in storage that would, in rare cases, fail to do a + complete check. +- exposed more settings for tweaking parameters in the piece-picker, + downloader and uploader (http_settings replaced by session_settings). +- tweaked default settings to improve high bandwidth transfers. +- improved the piece picker performance and made it possible to download + popular pieces in sequence to improve disk performance. +- added the possibility to control upload and download limits per peer. +- fixed problem with re-requesting skipped pieces when peer was sending pieces + out of fifo-order. +- added support for http seeding (the GetRight protocol) +- renamed identifiers called 'id' in the public interface to support linking + with Objective.C++ +- changed the extensions protocol to use the new one, which is also + implemented by uTorrent. +- factorized the peer_connection and added web_peer_connection which is + able to download from http-sources. +- converted the network code to use asio (resulted in slight api changes + dealing with network addresses). +- made libtorrent build in vc7 (patches from Allen Zhao) +- fixed bug caused when binding outgoing connections to a non-local interface. +- add_torrent() will now throw if called while the session object is + being closed. +- added the ability to limit the number of simultaneous half-open + TCP connections. Flags in peer_info has been added. + + +* Thu Jun 1 2006 %{packager} %{version}-%{release} +- Initial Build for Mandriva Linux diff --git a/packaging/ubuntu-dapper/debian/changelog b/packaging/ubuntu-dapper/debian/changelog new file mode 100644 index 000000000..87f9d85a7 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/changelog @@ -0,0 +1,134 @@ +qbittorrent (0.6.1-0ubuntu2) dapper; urgency=low + + * Disabled debug mode + + -- Christophe Dumez Mon, 28 Aug 2006 19:29:17 +0000 + +qbittorrent (0.6.1-0ubuntu1) dapper; urgency=low + * BUGFIX: Fixed possible segfaults when using context menus + * BUGFIX: Cleanup up context menus code + * BUGFIX: Used best gzip compressing for manpage + + -- Christophe Dumez Thu, 24 Aug 2006 19:53:32 +0200 + +qbittorrent (0.6.0) dapper; urgency=low + * 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 + + -- Christophe Dumez Wed, 22 Aug 2006 10:42:37 +0200 + +qbittorrent (0.5.0) dapper; urgency=low + * Improved "Download from url" feature (now supports https, ftp & redirections) + * Added a torrent creation tool + * Display progress for each file within a torrent + * Based on new libtorrent v0.10 (lot of improvements) + * Now possible to clear log textbox (popup menu) + * Added two search engines (isohunt, torrentreactor) + * Now Display share ratio on main window + * Use OSD (On Screen Display) when a download or a search is finished + * Allow only one instance of qBittorrent (and add new parameters to download list) + * Remember last selected search engines in search tab + * Improved search engines status output (Aborted, timed out, finished, no results) + * qBittorrent can now update search plugin from qbittorrent.org + * Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages + * Fixed ThePirateBay parser for search engine (website had changed) + * Fixed filenames for results from ThePirateBay search engine + * Fixed unicode support for ThePirateBay search engine + * Now search results are sorted by seeds + * Overwrite nova.py search plugin only if it is outdated + * Fixed possible division by 0 in ETA calculation + * Improved ETA calculation precision + * Fixed default tab in options + * When saving options, reconnect only when listening ports changed + * qBittorrent has now its own new logo + * Display status "downloading" if DL Speed > 0 (even when tracker is down) + * Added a splashscreen + * qBittorrent has new cute icons + * Display number of results in search tab + * Added icons for each item in download list according to its state + * Redesigned Locale settings + * Fixed search engines names width (were cut on the right) + * Moved search engines to the left of the window (better ui) + + -- Christophe Dumez Wed, 2 Aug 2006 19:46:32 +0200 + +qbittorrent (0.4.1) dapper; urgency=low + * 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 + + -- Christophe Dumez Thu, 22 Jun 2006 20:14:27 +0200 + +qbittorrent (0.4.0) dapper; urgency=low + + * 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 + + -- Christophe Dumez Wed, 14 Jun 2006 14:47:27 +0200 + +qbittorrent (0.3.1) dapper; urgency=low + + * 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). + + -- Christophe Dumez Sat, 6 Jun 2006 21:36:27 +0200 + + +qbittorrent (0.3) dapper; urgency=low + + * Initial Release. + + -- Christophe Dumez Sat, 3 Jun 2006 21:57:27 +0200 diff --git a/packaging/ubuntu-dapper/debian/compat b/packaging/ubuntu-dapper/debian/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/packaging/ubuntu-dapper/debian/compat @@ -0,0 +1 @@ +4 diff --git a/packaging/ubuntu-dapper/debian/control b/packaging/ubuntu-dapper/debian/control new file mode 100644 index 000000000..1db544765 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/control @@ -0,0 +1,15 @@ +Source: qbittorrent +Section: net +Priority: optional +Maintainer: Christophe Dumez +Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev +Standards-Version: 3.6.2 + +Package: qbittorrent +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3) +Description: Bittorrent client in Qt4.1 / C++ + qBittorrent is a bittorrent client programmed in C++ / Qt4.1 + using rb_libtorrent by Arvid Norberg. It aims to be a good + alternative to other bittorrent client out there. It is fast, + stable and provides unicode support. diff --git a/packaging/ubuntu-dapper/debian/copyright b/packaging/ubuntu-dapper/debian/copyright new file mode 100644 index 000000000..5434e51a4 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/copyright @@ -0,0 +1,26 @@ +This is qbittorrent, written and maintained by Christophe Dumez +on Sat, 3 Jun 2006 21:57:27 +0200. + +The original source can always be found at: + ftp://ftp.debian.org/dists/unstable/main/source/ + +Copyright (C) 2006 Christophe Dumez + +License: + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. diff --git a/packaging/ubuntu-dapper/debian/dirs b/packaging/ubuntu-dapper/debian/dirs new file mode 100644 index 000000000..ca882bbb7 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/packaging/ubuntu-dapper/debian/docs b/packaging/ubuntu-dapper/debian/docs new file mode 100644 index 000000000..5502ed8f4 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/docs @@ -0,0 +1,3 @@ +NEWS +README +TODO diff --git a/packaging/ubuntu-dapper/debian/files b/packaging/ubuntu-dapper/debian/files new file mode 100644 index 000000000..66aff7545 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/files @@ -0,0 +1 @@ +qbittorrent_0.6.1-0ubuntu2_i386.deb net optional diff --git a/packaging/ubuntu-dapper/debian/qbittorrent.substvars b/packaging/ubuntu-dapper/debian/qbittorrent.substvars new file mode 100644 index 000000000..d26b4e7da --- /dev/null +++ b/packaging/ubuntu-dapper/debian/qbittorrent.substvars @@ -0,0 +1 @@ +shlibs:Depends=libboost-date-time1.33.1, libboost-filesystem1.33.1, libboost-thread1.33.1, libc6 (>= 2.3.4-1), libcurl3 (>= 7.15.0-1), libgcc1 (>= 1:4.0.2), libqt4-core (>= 4.1.2), libqt4-gui (>= 4.1.2), libstdc++6 (>= 4.0.2-4), libx11-6, libxext6, zlib1g (>= 1:1.2.1) diff --git a/packaging/ubuntu-dapper/debian/rules b/packaging/ubuntu-dapper/debian/rules new file mode 100755 index 000000000..e5c6e95a4 --- /dev/null +++ b/packaging/ubuntu-dapper/debian/rules @@ -0,0 +1,107 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr + + +build: build-stamp + +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + #docbook-to-man debian/qbittorrent.sgml > qbittorrent.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/qbittorrent. + $(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs Changelog + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/packaging/ubuntu-edgy/debian/changelog b/packaging/ubuntu-edgy/debian/changelog new file mode 100644 index 000000000..6eb6e1adf --- /dev/null +++ b/packaging/ubuntu-edgy/debian/changelog @@ -0,0 +1,134 @@ +qbittorrent (0.6.1-0ubuntu2) edgy; urgency=low + + * Disabled debug mode + + -- Christophe Dumez Mon, 28 Aug 2006 21:22:48 +0200 + +qbittorrent (0.6.1-0ubuntu1) edgy; urgency=low + * BUGFIX: Fixed possible segfaults when using context menus + * BUGFIX: Cleanup up context menus code + * BUGFIX: Used best gzip compressing for manpage + + -- Christophe Dumez Thu, 24 Aug 2006 19:53:32 +0200 + +qbittorrent (0.6.0) edgy; urgency=low + * 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 + + -- Christophe Dumez Wed, 22 Aug 2006 10:42:37 +0200 + +qbittorrent (0.5.0) edgy; urgency=low + * Improved "Download from url" feature (now supports https, ftp & redirections) + * Added a torrent creation tool + * Display progress for each file within a torrent + * Based on new libtorrent v0.10 (lot of improvements) + * Now possible to clear log textbox (popup menu) + * Added two search engines (isohunt, torrentreactor) + * Now Display share ratio on main window + * Use OSD (On Screen Display) when a download or a search is finished + * Allow only one instance of qBittorrent (and add new parameters to download list) + * Remember last selected search engines in search tab + * Improved search engines status output (Aborted, timed out, finished, no results) + * qBittorrent can now update search plugin from qbittorrent.org + * Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages + * Fixed ThePirateBay parser for search engine (website had changed) + * Fixed filenames for results from ThePirateBay search engine + * Fixed unicode support for ThePirateBay search engine + * Now search results are sorted by seeds + * Overwrite nova.py search plugin only if it is outdated + * Fixed possible division by 0 in ETA calculation + * Improved ETA calculation precision + * Fixed default tab in options + * When saving options, reconnect only when listening ports changed + * qBittorrent has now its own new logo + * Display status "downloading" if DL Speed > 0 (even when tracker is down) + * Added a splashscreen + * qBittorrent has new cute icons + * Display number of results in search tab + * Added icons for each item in download list according to its state + * Redesigned Locale settings + * Fixed search engines names width (were cut on the right) + * Moved search engines to the left of the window (better ui) + + -- Christophe Dumez Wed, 2 Aug 2006 19:46:32 +0200 + +qbittorrent (0.4.1) edgy; urgency=low + * 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 + + -- Christophe Dumez Thu, 22 Jun 2006 20:14:27 +0200 + +qbittorrent (0.4.0) edgy; urgency=low + + * 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 + + -- Christophe Dumez Wed, 14 Jun 2006 14:47:27 +0200 + +qbittorrent (0.3.1) edgy; urgency=low + + * 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). + + -- Christophe Dumez Sat, 6 Jun 2006 21:36:27 +0200 + + +qbittorrent (0.3) edgy; urgency=low + + * Initial Release. + + -- Christophe Dumez Sat, 3 Jun 2006 21:57:27 +0200 diff --git a/packaging/ubuntu-edgy/debian/compat b/packaging/ubuntu-edgy/debian/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/packaging/ubuntu-edgy/debian/compat @@ -0,0 +1 @@ +4 diff --git a/packaging/ubuntu-edgy/debian/control b/packaging/ubuntu-edgy/debian/control new file mode 100644 index 000000000..1db544765 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/control @@ -0,0 +1,15 @@ +Source: qbittorrent +Section: net +Priority: optional +Maintainer: Christophe Dumez +Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev +Standards-Version: 3.6.2 + +Package: qbittorrent +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3) +Description: Bittorrent client in Qt4.1 / C++ + qBittorrent is a bittorrent client programmed in C++ / Qt4.1 + using rb_libtorrent by Arvid Norberg. It aims to be a good + alternative to other bittorrent client out there. It is fast, + stable and provides unicode support. diff --git a/packaging/ubuntu-edgy/debian/copyright b/packaging/ubuntu-edgy/debian/copyright new file mode 100644 index 000000000..5434e51a4 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/copyright @@ -0,0 +1,26 @@ +This is qbittorrent, written and maintained by Christophe Dumez +on Sat, 3 Jun 2006 21:57:27 +0200. + +The original source can always be found at: + ftp://ftp.debian.org/dists/unstable/main/source/ + +Copyright (C) 2006 Christophe Dumez + +License: + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. diff --git a/packaging/ubuntu-edgy/debian/dirs b/packaging/ubuntu-edgy/debian/dirs new file mode 100644 index 000000000..ca882bbb7 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/packaging/ubuntu-edgy/debian/docs b/packaging/ubuntu-edgy/debian/docs new file mode 100644 index 000000000..5502ed8f4 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/docs @@ -0,0 +1,3 @@ +NEWS +README +TODO diff --git a/packaging/ubuntu-edgy/debian/files b/packaging/ubuntu-edgy/debian/files new file mode 100644 index 000000000..66aff7545 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/files @@ -0,0 +1 @@ +qbittorrent_0.6.1-0ubuntu2_i386.deb net optional diff --git a/packaging/ubuntu-edgy/debian/qbittorrent.substvars b/packaging/ubuntu-edgy/debian/qbittorrent.substvars new file mode 100644 index 000000000..f2c72471b --- /dev/null +++ b/packaging/ubuntu-edgy/debian/qbittorrent.substvars @@ -0,0 +1 @@ +shlibs:Depends=libboost-date-time1.33.1, libboost-filesystem1.33.1, libboost-thread1.33.1, libc6 (>= 2.4-1), libcurl3 (>= 7.15.4-1), libgcc1 (>= 1:4.1.1-11ubuntu1), libqt4-core (>= 4.1.4), libqt4-gui (>= 4.1.4), libstdc++6 (>= 4.1.1-11ubuntu1), libx11-6, libxext6, zlib1g (>= 1:1.2.1) diff --git a/packaging/ubuntu-edgy/debian/rules b/packaging/ubuntu-edgy/debian/rules new file mode 100755 index 000000000..e5c6e95a4 --- /dev/null +++ b/packaging/ubuntu-edgy/debian/rules @@ -0,0 +1,107 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr + + +build: build-stamp + +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + #docbook-to-man debian/qbittorrent.sgml > qbittorrent.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/qbittorrent. + $(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs Changelog + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/qbittorrent.pro b/qbittorrent.pro new file mode 100644 index 000000000..d92342723 --- /dev/null +++ b/qbittorrent.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs + +SUBDIRS += src + diff --git a/qbittorrent.qc b/qbittorrent.qc new file mode 100644 index 000000000..8d7214778 --- /dev/null +++ b/qbittorrent.qc @@ -0,0 +1,20 @@ + + qbittorrent + qbittorrent.pro + qcm + + + + + + + + + + + + + + + + diff --git a/qcm/libboost.qcm b/qcm/libboost.qcm new file mode 100644 index 000000000..62120d3fe --- /dev/null +++ b/qcm/libboost.qcm @@ -0,0 +1,40 @@ +/* +-----BEGIN QCMOD----- +name: libboost +-----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; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("boost/format.hpp", sl, &s)) { + qWarning("libboost includes not found!"); + return false; + } + conf->addIncludePath(s); + if(!conf->findHeader("boost/date_time/posix_time/posix_time.hpp", sl, &s)) { + qWarning("libboost-date-time includes not found!"); + return false; + } + conf->addIncludePath(s); + if(!conf->findHeader("boost/filesystem/path.hpp", sl, &s)) { + qWarning("libboost-filesystem includes not found!"); + return false; + } + if(!conf->findHeader("boost/thread.hpp", sl, &s)) { + qWarning("libboost-thread includes not found!"); + return false; + } + conf->addIncludePath(s); + + return true; + } +}; diff --git a/qcm/libcurl.qcm b/qcm/libcurl.qcm new file mode 100644 index 000000000..4c7e71111 --- /dev/null +++ b/qcm/libcurl.qcm @@ -0,0 +1,25 @@ +/* +-----BEGIN QCMOD----- +name: libcurl +-----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; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("curl/curl.h", sl, &s)) { + qWarning("libcurl includes not found!\n"); + return false; + } + conf->addIncludePath(s); + return true; + } +}; diff --git a/qcm/libtorrent.qcm b/qcm/libtorrent.qcm new file mode 100644 index 000000000..5497b241f --- /dev/null +++ b/qcm/libtorrent.qcm @@ -0,0 +1,25 @@ +/* +-----BEGIN QCMOD----- +name: libtorrent +-----END QCMOD----- +*/ +class qc_libtorrent : public ConfObj +{ +public: + qc_libtorrent(Conf *c) : ConfObj(c) {} + QString name() const { return "libtorrent >= 0.11"; } + QString shortname() const { return "libtorrent"; } + bool exec(){ + QString s; + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("libtorrent/kademlia/node.hpp", sl, &s)) { + qWarning("libtorrent v0.11 includes not found!\nYou can download it at http://www.libtorrent.net"); + return false; + } + conf->addIncludePath(s); + return true; + } +}; diff --git a/qcm/python.qcm b/qcm/python.qcm new file mode 100644 index 000000000..0aa673faf --- /dev/null +++ b/qcm/python.qcm @@ -0,0 +1,19 @@ +/* +-----BEGIN QCMOD----- +name: python +-----END QCMOD----- +*/ +class qc_python : public ConfObj +{ +public: + qc_python(Conf *c) : ConfObj(c) {} + QString name() const { return "python >= 2.3"; } + QString shortname() const { return "python"; } + bool exec(){ + int r = conf->doCommand("python testpython.py"); + if(r == 0) + return true; + else + return false; + } +}; diff --git a/qcm/qt41.qcm b/qcm/qt41.qcm new file mode 100644 index 000000000..dc1a9d9f5 --- /dev/null +++ b/qcm/qt41.qcm @@ -0,0 +1,16 @@ +/* +-----BEGIN QCMOD----- +name: Qt >= 4.1 +-----END QCMOD----- +*/ +class qc_qt41 : public ConfObj +{ +public: + qc_qt41(Conf *c) : ConfObj(c) {} + QString name() const { return "Qt >= 4.1"; } + QString shortname() const { return "qt41"; } + bool exec() + { + return(QT_VERSION >= 0x040100); + } +}; diff --git a/src/DLListDelegate.h b/src/DLListDelegate.h new file mode 100644 index 000000000..e5b7a1b27 --- /dev/null +++ b/src/DLListDelegate.h @@ -0,0 +1,162 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DLLISTDELEGATE_H +#define DLLISTDELEGATE_H + +#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 STATUS 5 +#define ETA 6 + +class DLListDelegate: public QAbstractItemDelegate { + Q_OBJECT + + public: + DLListDelegate(QObject *parent=0) : QAbstractItemDelegate(parent){} + + ~DLListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItem opt = option; + char tmp[MAX_CHAR_TMP]; + // set text color + QVariant value = index.data(Qt::TextColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + }else{ + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + // draw the background color + if(index.column() != PROGRESS){ + if (option.showDecorationSelected && (option.state & QStyle::State_Selected)){ + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)){ + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + }else{ + value = index.data(Qt::BackgroundColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + } + switch(index.column()){ + case SIZE: + painter->drawText(option.rect, Qt::AlignCenter, misc::friendlyUnit(index.data().toLongLong())); + break; + case ETA: + painter->drawText(option.rect, Qt::AlignCenter, misc::userFriendlyDuration(index.data().toLongLong())); + break; + case UPSPEED: + case DLSPEED:{ + float speed = index.data().toDouble(); + snprintf(tmp, MAX_CHAR_TMP, "%.1f", speed/1024.); + painter->drawText(option.rect, Qt::AlignCenter, QString(tmp)+" "+tr("KiB/s")); + break; + } + case PROGRESS:{ + QStyleOptionProgressBarV2 newopt; + float progress; + progress = index.data().toDouble()*100.; + snprintf(tmp, MAX_CHAR_TMP, "%.1f", progress); + newopt.rect = opt.rect; + newopt.text = QString(tmp)+"%"; + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = false; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + //We prefer to display text manually to control color/font/boldness + if (option.state & QStyle::State_Selected){ + opt.palette.setColor(QPalette::Text, QColor("grey")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + painter->drawText(option.rect, Qt::AlignCenter, newopt.text); + break; + } + case NAME:{ + // decoration + value = index.data(Qt::DecorationRole); + QPixmap pixmap = qvariant_cast(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); + QRect pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); + if (pixmapRect.isValid()){ + QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); + painter->drawPixmap(p, pixmap); + } + painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft, index.data().toString()); + break; + } + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } + } + + 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(); + } + +// QWidget* createEditor(QWidget * parent, const QStyleOptionViewItem& /*option*/, const QModelIndex & index) const{ +// if(index.column() == PROGRESS){ +// QProgressBar *progressBar = new QProgressBar(parent); +// progressBar->setRange(0,100); +// progressBar->installEventFilter(const_cast(this)); +// return progressBar; +// } +// return 0; +// } +// void setEditorData(QWidget *editor, const QModelIndex &index) const{ +// QProgressBar *progressBar = static_cast(editor); +// float progress = index.data().toDouble(); +// progressBar->setValue((int)(progress*100.)); +// } +// void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & index) const{ +// if(index.column() == PROGRESS){ +// editor->setGeometry(option.rect); +// } +// } +}; + +#endif diff --git a/src/GUI.cpp b/src/GUI.cpp new file mode 100644 index 000000000..e810ec2b2 --- /dev/null +++ b/src/GUI.cpp @@ -0,0 +1,2192 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "GUI.h" +#include "misc.h" +#include "createtorrent_imp.h" +#include "properties_imp.h" +#include "trayicon/trayicon.h" +#include "DLListDelegate.h" +#include "SearchListDelegate.h" +#include "downloadThread.h" +#include "downloadFromURLImp.h" + +#include +#include + +/***************************************************** + * * + * GUI * + * * + *****************************************************/ + +// Constructor +GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent){ + setupUi(this); + setWindowTitle(tr("qBittorrent ")+VERSION); + QCoreApplication::setApplicationName("qBittorrent"); + loadWindowSize(); + s = new session(fingerprint("qB", 0, 7, 0, 0)); + //s = new session(fingerprint("AZ", 2, 5, 0, 0)); //Azureus fingerprint + // Setting icons + this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/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"))); + 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"))); +// actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/help.png"))); + actionConnexion_Status->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/disconnected.png"))); + actionDelete_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_all.png"))); + actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); + actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png"))); + info_icon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/log.png"))); + tabs->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/home.png"))); + tabs->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/skin/search.png"))); + // Set default ratio + lbl_ratio_icon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/stare.png"))); + // Fix Tool bar layout + toolBar->layout()->setSpacing(7); + // Set Download list model + DLListModel = new QStandardItemModel(0,7); + DLListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); + DLListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + DLListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + DLListModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("DL Speed")); + DLListModel->setHeaderData(UPSPEED, Qt::Horizontal, tr("UP Speed")); + DLListModel->setHeaderData(STATUS, Qt::Horizontal, tr("Status")); + DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA")); + downloadList->setModel(DLListModel); + DLDelegate = new DLListDelegate(); + downloadList->setItemDelegate(DLDelegate); + // Load last columns width for download list + if(!loadColWidthDLList()){ + downloadList->header()->resizeSection(0, 200); + } + // creating options + options = new options_imp(this); + connect(options, SIGNAL(status_changed(const QString&)), this, SLOT(OptionsSaved(const QString&))); + // Scan Dir + timerScan = new QTimer(this); + connect(timerScan, SIGNAL(timeout()), this, SLOT(scanDirectory())); + // Set severity level of libtorrent session + s->set_severity_level(alert::info); + // To avoid some exceptions + fs::path::default_name_check(fs::no_check); + // DHT (Trackerless) + DHTEnabled = false; + // Configure BT session according to options + configureSession(); + s->disable_extensions(); + // download thread + downloader = new downloadThread(this); + connect(downloader, SIGNAL(downloadFinished(QString, QString, int, QString)), this, SLOT(processDownloadedFile(QString, QString, int, QString))); + //Resume unfinished torrent downloads + resumeUnfinished(); + // Add torrent given on command line + ProcessParams(torrentCmdLine); + // Make download list header clickable for sorting + downloadList->header()->setClickable(true); + downloadList->header()->setSortIndicatorShown(true); + // Connecting Actions to slots + connect(actionExit, SIGNAL(triggered()), this, SLOT(close())); + connect(actionOpen, SIGNAL(triggered()), this, SLOT(askForTorrents())); + connect(actionDelete_All, SIGNAL(triggered()), this, SLOT(deleteAll())); + connect(actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelection())); + connect(actionOptions, SIGNAL(triggered()), this, SLOT(showOptions())); + connect(actionDownload_from_URL, SIGNAL(triggered()), this, SLOT(askForTorrentUrl())); + connect(actionPause_All, SIGNAL(triggered()), this, SLOT(pauseAll())); + connect(actionStart_All, SIGNAL(triggered()), this, SLOT(startAll())); + connect(actionPause, SIGNAL(triggered()), this, SLOT(pauseSelection())); + connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection())); + connect(actionStart, SIGNAL(triggered()), this, SLOT(startSelection())); + connect(actionAbout, SIGNAL(triggered()), this, SLOT(showAbout())); + connect(actionCreate_torrent, SIGNAL(triggered()), this, SLOT(showCreateWindow())); + connect(actionClearLog, SIGNAL(triggered()), this, SLOT(clearLog())); + connect(downloadList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(togglePausedState(const QModelIndex&))); + connect(downloadList->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortDownloadList(int))); + connect(downloadList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLListMenu(const QPoint&))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayGUIMenu(const QPoint&))); + connect(actionPreview_file, SIGNAL(triggered()), this, SLOT(previewFileSelection())); + connect(infoBar, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayInfoBarMenu(const QPoint&))); + // Create tray icon + myTrayIcon = new TrayIcon(this); + // Start download list refresher + refresher = new QTimer(this); + connect(refresher, SIGNAL(timeout()), this, SLOT(updateDlList())); + refresher->start(2000); + // Center window + centerWindow(); + // Add tray icon and customize it + myTrayIcon->setWMDock(false); + myTrayIcon->setIcon(QPixmap::QPixmap(":/Icons/qbittorrent22.png")); + // Tray icon Menu + myTrayIconMenu = new QMenu(this); + myTrayIconMenu->addAction(actionOpen); + myTrayIconMenu->addAction(actionDownload_from_URL); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionStart_All); + myTrayIconMenu->addAction(actionPause_All); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionExit); + myTrayIcon->setPopup(myTrayIconMenu); + // End of Icon Menu + connect(myTrayIcon, SIGNAL(clicked(const QPoint &, int)), this, SLOT(toggleVisibility())); + myTrayIcon->show(); + // Use a tcp server to allow only one instance of qBittorrent + tcpServer = new QTcpServer(this); + if (!tcpServer->listen(QHostAddress::LocalHost, 1666)) { + std::cout << "Couldn't create socket, single instance mode won't work...\n"; + } + connect(tcpServer, SIGNAL(newConnection()), this, SLOT(AnotherInstanceConnected())); + // Start connection checking timer + checkConnect = new QTimer(this); + connect(checkConnect, SIGNAL(timeout()), this, SLOT(checkConnectionStatus())); + checkConnect->start(5000); + // Set Search results list model + SearchListModel = new QStandardItemModel(0,5); + SearchListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); + SearchListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + SearchListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Seeders")); + SearchListModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("Leechers")); + SearchListModel->setHeaderData(UPSPEED, Qt::Horizontal, tr("Search engine")); + resultsBrowser->setModel(SearchListModel); + SearchDelegate = new SearchListDelegate(); + resultsBrowser->setItemDelegate(SearchDelegate); + // Make search list header clickable for sorting + resultsBrowser->header()->setClickable(true); + resultsBrowser->header()->setSortIndicatorShown(true); + // Load last columns width for search results list + if(!loadColWidthSearchList()){ + resultsBrowser->header()->resizeSection(0, 275); + } + // Boolean initialization + search_stopped = false; + // Connect signals to slots (search part) + connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(downloadSelectedItem(const QModelIndex&))); + connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int))); + // Creating Search Process + searchProcess = new QProcess(this); + 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))); + // Set search engines names + mininova->setText("Mininova"); + piratebay->setText("ThePirateBay"); + reactor->setText("TorrentReactor"); + isohunt->setText("Isohunt"); + btjunkie->setText("BTJunkie"); + meganova->setText("Meganova"); + // Check last checked search engines + loadCheckedSearchEngines(); + connect(mininova, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + connect(piratebay, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + connect(reactor, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + connect(isohunt, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + connect(btjunkie, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + connect(meganova, SIGNAL(stateChanged(int)), this, SLOT(saveCheckedSearchEngines(int))); + // Update nova.py search plugin if necessary + updateNova(); + // OSD + OSDWindow = new OSD(this); + // Supported preview extensions + // XXX: might be incomplete + supported_preview_extensions<<"AVI"<<"DIVX"<<"MPG"<<"MPEG"<<"MP3"<<"OGG"<<"WMV"<<"WMA"<<"RMV"<<"RMVB"<<"ASF"<<"MOV"<<"WAV"<<"MP2"<<"SWF"<<"AC3"; + previewProcess = new QProcess(this); + connect(previewProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(cleanTempPreviewFile(int, QProcess::ExitStatus))); + // Accept drag 'n drops + setAcceptDrops(true); + // Set info Bar infos + setInfoBar(tr("qBittorrent ")+VERSION+tr(" started.")); + qDebug("GUI Built"); +} + +// Destructor +GUI::~GUI(){ + delete options; + delete checkConnect; + delete timerScan; + delete searchProcess; + delete refresher; + delete myTrayIcon; + delete myTrayIconMenu; + delete OSDWindow; + delete tcpServer; + delete DLDelegate; + delete DLListModel; + delete SearchListModel; + delete SearchDelegate; + delete previewProcess; + delete downloader; + delete s; +} + +// Update Info Bar information +void GUI::setInfoBar(const QString& info, const QString& color){ + static unsigned short nbLines = 0; + ++nbLines; + // Check log size, clear it if too big + if(nbLines > 200){ + infoBar->clear(); + nbLines = 1; + } + infoBar->append(""+ QTime::currentTime().toString("hh:mm:ss") + " - " + info + "
"); +} + +// Buggy with Qt 4.1.2 : should try with another version +// void GUI::readParamsOnSocket(){ +// QTcpSocket *clientConnection = tcpServer->nextPendingConnection(); +// if(clientConnection != 0){ +// connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); +// std::cout << "reading...\n"; +// while (clientConnection->bytesAvailable() < (int)sizeof(quint16)) { +// std::cout << "reading size chunk\n"; +// if (!clientConnection->waitForReadyRead(5000)) { +// std::cout << clientConnection->errorString().toStdString() << '\n'; +// return; +// } +// } +// quint16 blockSize; +// QDataStream in(clientConnection); +// in.setVersion(QDataStream::Qt_4_0); +// in >> blockSize; +// while (clientConnection->bytesAvailable() < blockSize) { +// if (!clientConnection->waitForReadyRead(5000)) { +// std::cout << clientConnection->errorString().toStdString() << '\n'; +// return; +// } +// } +// QString params; +// in >> params; +// std::cout << params.toStdString() << '\n'; +// clientConnection->disconnectFromHost(); +// } +// std::cout << "end reading\n"; +// } + +void GUI::AnotherInstanceConnected(){ + clientConnection = tcpServer->nextPendingConnection(); + if(clientConnection != 0){ + connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsInFile())); + } +} + +void GUI::togglePausedState(const QModelIndex& index){ + int row = index.row(); + QString fileName = DLListModel->data(DLListModel->index(row, NAME)).toString(); + torrent_handle h = handles.value(fileName); + if(h.is_paused()){ + startSelection(); + }else{ + pauseSelection(); + } +} + +void GUI::previewFileSelection(){ + QModelIndex index; + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + // Get the file name + QString fileName = index.data().toString(); + torrent_handle h = handles.value(fileName); + previewSelection = new previewSelect(this, h); + break; + } + } +} + +void GUI::cleanTempPreviewFile(int, QProcess::ExitStatus){ + QFile::remove(QDir::tempPath()+QDir::separator()+"qBT_preview.tmp"); +} + +void GUI::displayDLListMenu(const QPoint& pos){ + QMenu myDLLlistMenu(this); + // Clear selection + downloadList->clearSelection(); + // Select items + QModelIndex index = downloadList->indexAt(pos); + selectGivenRow(index); + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + // Get the file name + QString fileName = index.data().toString(); + // Get handle and pause the torrent + torrent_handle h = handles.value(fileName); + if(h.is_paused()){ + myDLLlistMenu.addAction(actionStart); + }else{ + myDLLlistMenu.addAction(actionPause); + } + myDLLlistMenu.addAction(actionDelete); + myDLLlistMenu.addAction(actionTorrent_Properties); + if(!options->getPreviewProgram().isEmpty() && isFilePreviewPossible(h)){ + myDLLlistMenu.addAction(actionPreview_file); + } + break; + } + } + // Call menu + // XXX: why mapToGlobal() is not enough? + myDLLlistMenu.exec(mapToGlobal(pos)+QPoint(22,180)); +} + +void GUI::displayGUIMenu(const QPoint& pos){ + QMenu myGUIMenu(this); + myGUIMenu.addAction(actionOpen); + myGUIMenu.addAction(actionDownload_from_URL); + myGUIMenu.addAction(actionStart_All); + myGUIMenu.addAction(actionPause_All); + myGUIMenu.addAction(actionDelete_All); + myGUIMenu.addAction(actionExit); + myGUIMenu.exec(mapToGlobal(pos)); +} + +void GUI::previewFile(const QString& filePath){ + // Check if there is already one preview running + if(previewProcess->state() == QProcess::NotRunning){ + // First copy temporarily + QString tmpPath = QDir::tempPath()+QDir::separator()+"qBT_preview.tmp"; + QFile::remove(tmpPath); + QFile::copy(filePath, tmpPath); + // Launch program preview + QStringList params; + params << tmpPath; + previewProcess->start(options->getPreviewProgram(), params, QIODevice::ReadOnly); + }else{ + QMessageBox::critical(0, tr("Preview process already running"), tr("There is already another preview process running.\nPlease close the other one first.")); + } +} + +void GUI::selectGivenRow(const QModelIndex& index){ + int row = index.row(); + for(int i=0; icolumnCount(); ++i){ + downloadList->selectionModel()->select(DLListModel->index(row, i), QItemSelectionModel::Select); + } +} + +// Called when the other instance is disconnected +// Means the file is written +void GUI::readParamsInFile(){ + QFile paramsFile(QDir::tempPath()+QDir::separator()+"qBT-params.txt"); + if (!paramsFile.open(QIODevice::ReadOnly | QIODevice::Text)){ + paramsFile.remove(); + return; + } + QStringList params; + while (!paramsFile.atEnd()) { + QByteArray line = paramsFile.readLine(); + if(line.at(line.size()-1) == '\n'){ + line.truncate(line.size()-1); + } + params << line; + } + if(params.size()){ + std::cout << "Received parameters from another instance\n"; + addTorrents(params); + } + paramsFile.close(); + paramsFile.remove(); +} + +void GUI::clearLog(){ + infoBar->clear(); +} + +void GUI::displayInfoBarMenu(const QPoint& pos){ + // Log Menu + QMenu myLogMenu(this); + myLogMenu.addAction(actionClearLog); + // XXX: Why mapToGlobal() is not enough? + myLogMenu.exec(mapToGlobal(pos)+QPoint(22,383)); +} + +// get information from torrent handles and +// update download list accordingly +void GUI::updateDlList(){ + torrent_handle h; + char tmp[MAX_CHAR_TMP]; + char tmp2[MAX_CHAR_TMP]; + // update global informations + session_status sessionStatus = s->status(); + snprintf(tmp, MAX_CHAR_TMP, "%.1f", sessionStatus.payload_upload_rate/1024.); + snprintf(tmp2, MAX_CHAR_TMP, "%.1f", sessionStatus.payload_download_rate/1024.); + myTrayIcon->setToolTip(tr("qBittorrent
DL Speed: ")+ QString(tmp2) +tr("KiB/s")+"
"+tr("UP Speed: ")+ QString(tmp) + tr("KiB/s")); // tray icon + if(isMinimized() || isHidden() || tabs->currentIndex()){ + // No need to update if qBittorrent DL list is hidden + return; + } + LCD_UpSpeed->display(tmp); // UP LCD + LCD_DownSpeed->display(tmp2); // DL LCD + // browse handles + foreach(h, handles){ + torrent_status torrentStatus = h.status(); + QString fileName = QString(h.get_torrent_info().name().c_str()); + if(!h.is_paused()){ + int row = getRowFromName(fileName); + if(row == -1){ + std::cout << "Error: Could not find filename in download list..\n"; + continue; + } + // Parse download state + torrent_info ti = h.get_torrent_info(); + // Setting download state + switch(torrentStatus.state){ + case torrent_status::finished: + case torrent_status::seeding: + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)torrentStatus.upload_payload_rate)); + break; + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Checking..."))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/connecting.png")), Qt::DecorationRole); + setRowColor(row, "grey"); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); + break; + case torrent_status::connecting_to_tracker: + if(torrentStatus.download_payload_rate > 0){ + // Display "Downloading" status when connecting if download speed > 0 + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading..."))); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)(((qlonglong)ti.total_size()-(qlonglong)torrentStatus.total_done)/(qlonglong)torrentStatus.download_payload_rate))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole); + setRowColor(row, "green"); + }else{ + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Connecting..."))); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/connecting.png")), Qt::DecorationRole); + setRowColor(row, "grey"); + } + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)torrentStatus.download_payload_rate)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)torrentStatus.upload_payload_rate)); + break; + case torrent_status::downloading: + case torrent_status::downloading_metadata: + if(torrentStatus.download_payload_rate > 0){ + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading..."))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)(((qlonglong)ti.total_size()-(qlonglong)torrentStatus.total_done)/(qlonglong)torrentStatus.download_payload_rate))); + setRowColor(row, "green"); + }else{ + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Stalled", "state of a torrent whose DL Speed is 0"))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/stalled.png")), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + setRowColor(row, "black"); + } + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)torrentStatus.download_payload_rate)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)torrentStatus.upload_payload_rate)); + break; + default: + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + } + } + } +} + +bool GUI::isFilePreviewPossible(const torrent_handle& h) const{ + // See if there are supported files in the torrent + torrent_info torrentInfo = h.get_torrent_info(); + for(int i=0; i= 0){ + return true; + } + } + return false; +} + +void GUI::sortDownloadListFloat(int index, Qt::SortOrder sortOrder){ + QList > lines; + // insertion sorting + for(int i=0; irowCount(); ++i){ + misc::insertSort(lines, QPair(i, DLListModel->data(DLListModel->index(i, index)).toDouble()), sortOrder); + } + // Insert items in new model, in correct order + int nbRows_old = lines.size(); + for(int row=0; rowinsertRow(DLListModel->rowCount()); + int sourceRow = lines[row].first; + for(int col=0; col<7; ++col){ + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col))); + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col), Qt::TextColorRole), Qt::TextColorRole); + } + } + // Remove old rows + DLListModel->removeRows(0, nbRows_old); +} + +void GUI::sortDownloadListString(int index, Qt::SortOrder sortOrder){ + QList > lines; + // Insertion sorting + for(int i=0; irowCount(); ++i){ + misc::insertSortString(lines, QPair(i, DLListModel->data(DLListModel->index(i, index)).toString()), sortOrder); + } + // Insert items in new model, in correct order + int nbRows_old = lines.size(); + for(int row=0; rowinsertRow(DLListModel->rowCount()); + int sourceRow = lines[row].first; + for(int col=0; col<7; ++col){ + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col))); + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(nbRows_old+row, col), DLListModel->data(DLListModel->index(sourceRow, col), Qt::TextColorRole), Qt::TextColorRole); + } + } + // Remove old rows + DLListModel->removeRows(0, nbRows_old); +} + +void GUI::sortDownloadList(int index){ + static Qt::SortOrder sortOrder = Qt::AscendingOrder; + if(downloadList->header()->sortIndicatorSection() == index){ + if(sortOrder == Qt::AscendingOrder){ + sortOrder = Qt::DescendingOrder; + }else{ + sortOrder = Qt::AscendingOrder; + } + } + downloadList->header()->setSortIndicator(index, sortOrder); + switch(index){ + case SIZE: + case ETA: + case UPSPEED: + case DLSPEED: + case PROGRESS: + sortDownloadListFloat(index, sortOrder); + break; + default: + sortDownloadListString(index, sortOrder); + } +} + +void GUI::sortSearchList(int index){ + static Qt::SortOrder sortOrder = Qt::AscendingOrder; + if(resultsBrowser->header()->sortIndicatorSection() == index){ + if(sortOrder == Qt::AscendingOrder){ + sortOrder = Qt::DescendingOrder; + }else{ + sortOrder = Qt::AscendingOrder; + } + } + resultsBrowser->header()->setSortIndicator(index, sortOrder); + switch(index){ + //case SIZE: + case SEEDERS: + case LEECHERS: + case SIZE: + sortSearchListInt(index, sortOrder); + break; + default: + sortSearchListString(index, sortOrder); + } +} + +void GUI::sortSearchListInt(int index, Qt::SortOrder sortOrder){ + QList > lines; + // Insertion sorting + for(int i=0; irowCount(); ++i){ + misc::insertSort(lines, QPair(i, SearchListModel->data(SearchListModel->index(i, index)).toLongLong()), sortOrder); + } + // Insert items in new model, in correct order + int nbRows_old = lines.size(); + for(int row=0; rowinsertRow(SearchListModel->rowCount()); + int sourceRow = lines[row].first; + for(int col=0; col<5; ++col){ + SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col))); + SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::TextColorRole), Qt::TextColorRole); + } + } + // Remove old rows + SearchListModel->removeRows(0, nbRows_old); +} + +void GUI::sortSearchListString(int index, Qt::SortOrder sortOrder){ + QList > lines; + // Insetion sorting + for(int i=0; irowCount(); ++i){ + misc::insertSortString(lines, QPair(i, SearchListModel->data(SearchListModel->index(i, index)).toString()), sortOrder); + } + // Insert items in new model, in correct order + int nbRows_old = lines.size(); + for(int row=0; rowinsertRow(SearchListModel->rowCount()); + int sourceRow = lines[row].first; + for(int col=0; col<5; ++col){ + SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col))); + SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::TextColorRole), Qt::TextColorRole); + } + } + // Remove old rows + SearchListModel->removeRows(0, nbRows_old); +} + +// Toggle Main window visibility +void GUI::toggleVisibility(){ + if(isHidden()){ + show(); + if(isMinimized()){ + if(isMaximized()){ + showMaximized(); + }else{ + showNormal(); + } + } + raise(); + activateWindow(); + }else{ + hide(); + } +} + +// Center window +void GUI::centerWindow(){ + 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)); + + this->move((desk.width() - this->frameGeometry().width()) / 2, + (desk.height() - this->frameGeometry().height()) / 2); +} + +void GUI::saveWindowSize() const{ + QFile lastWindowSize(misc::qBittorrentPath()+"lastWindowSize.txt"); + // delete old file + lastWindowSize.remove(); + if(lastWindowSize.open(QIODevice::WriteOnly | QIODevice::Text)){ + lastWindowSize.write(QByteArray((misc::toString(this->size().width())+"\n").c_str())); + lastWindowSize.write(QByteArray((misc::toString(this->size().height())+"\n").c_str())); + lastWindowSize.close(); + qDebug("Saved window size"); + }else{ + std::cout << "Error: Could not save last windows size\n"; + } +} + +void GUI::loadWindowSize(){ + qDebug("Loading window size"); + QFile lastWindowSize(misc::qBittorrentPath()+"lastWindowSize.txt"); + if(lastWindowSize.exists()){ + if(lastWindowSize.open(QIODevice::ReadOnly | QIODevice::Text)){ + int w, h; + QByteArray line; + // read width + line = lastWindowSize.readLine(); + // remove '\n' + if(line.at(line.size()-1) == '\n'){ + line.truncate(line.size()-1); + } + w = line.toInt(); + // read height + line = lastWindowSize.readLine(); + // remove '\n' + if(line.at(line.size()-1) == '\n'){ + line.truncate(line.size()-1); + } + h = line.toInt(); + lastWindowSize.close(); + // Apply new size + if(w && h){ + this->resize(QSize(w, h)); + qDebug("Window size loaded"); + } + } + } +} + +// Save last checked search engines to a file +void GUI::saveCheckedSearchEngines(int) const{ + qDebug("Saving checked window size"); + QFile lastSearchEngines(misc::qBittorrentPath()+"lastSearchEngines.txt"); + // delete old file + lastSearchEngines.remove(); + if(lastSearchEngines.open(QIODevice::WriteOnly | QIODevice::Text)){ + if(mininova->isChecked()) + lastSearchEngines.write(QByteArray("mininova\n")); + if(piratebay->isChecked()) + lastSearchEngines.write(QByteArray("piratebay\n")); + if(reactor->isChecked()) + lastSearchEngines.write(QByteArray("reactor\n")); + if(isohunt->isChecked()) + lastSearchEngines.write(QByteArray("isohunt\n")); + if(btjunkie->isChecked()) + lastSearchEngines.write(QByteArray("btjunkie\n")); + if(meganova->isChecked()) + lastSearchEngines.write(QByteArray("meganova\n")); + lastSearchEngines.close(); + qDebug("Saved checked search engines"); + }else{ + std::cout << "Error: Could not save last checked search engines\n"; + } +} + +// Save columns width in a file to remember them +// (download list) +void GUI::saveColWidthDLList() const{ + qDebug("Saving columns width in download list"); + QFile lastDLListWidth(misc::qBittorrentPath()+"lastDLListWidth.txt"); + // delete old file + lastDLListWidth.remove(); + QStringList width_list; + for(int i=0; icolumnCount(); ++i){ + width_list << QString(misc::toString(downloadList->columnWidth(i)).c_str()); + } + if(lastDLListWidth.open(QIODevice::WriteOnly | QIODevice::Text)){ + lastDLListWidth.write(QByteArray(width_list.join(" ").toStdString().c_str())); + lastDLListWidth.close(); + qDebug("Columns width saved"); + }else{ + std::cout << "Error: Could not save last columns width in download list\n"; + } +} + +// Load columns width in a file that were saved previously +// (download list) +bool GUI::loadColWidthDLList(){ + qDebug("Loading colums width in download list"); + QFile lastDLListWidth(misc::qBittorrentPath()+"lastDLListWidth.txt"); + if(lastDLListWidth.exists()){ + if(lastDLListWidth.open(QIODevice::ReadOnly | QIODevice::Text)){ + QByteArray line = lastDLListWidth.readLine(); + lastDLListWidth.close(); + line.chop(1); + QStringList width_list = QString(line).split(' '); + if(width_list.size() != DLListModel-> columnCount()){ + return false; + } + for(int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + } + qDebug("Loaded columns width in download list"); + return true; + }else{ + std::cout << "Error: Could not load last columns width for download list\n"; + return false; + } + } + return false; +} + +// Save columns width in a file to remember them +// (download list) +void GUI::saveColWidthSearchList() const{ + qDebug("Saving columns width in search list"); + QFile lastSearchListWidth(misc::qBittorrentPath()+"lastSearchListWidth.txt"); + // delete old file + lastSearchListWidth.remove(); + QStringList width_list; + for(int i=0; icolumnCount(); ++i){ + width_list << QString(misc::toString(resultsBrowser->columnWidth(i)).c_str()); + } + if(lastSearchListWidth.open(QIODevice::WriteOnly | QIODevice::Text)){ + lastSearchListWidth.write(QByteArray(width_list.join(" ").toStdString().c_str())); + lastSearchListWidth.close(); + qDebug("Columns width saved in search list"); + }else{ + std::cout << "Error: Could not save last columns width in search results list\n"; + } +} + +// Load columns width in a file that were saved previously +// (search list) +bool GUI::loadColWidthSearchList(){ + qDebug("Loading column width in search list"); + QFile lastSearchListWidth(misc::qBittorrentPath()+"lastSearchListWidth.txt"); + if(lastSearchListWidth.exists()){ + if(lastSearchListWidth.open(QIODevice::ReadOnly | QIODevice::Text)){ + QByteArray line = lastSearchListWidth.readLine(); + lastSearchListWidth.close(); + line.chop(1); + QStringList width_list = QString(line).split(' '); + if(width_list.size() != SearchListModel-> columnCount()){ + return false; + } + for(int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + } + qDebug("Columns width loaded in search list"); + return true; + }else{ + std::cout << "Error: Could not load last columns width for search results list\n"; + return false; + } + } + return false; +} + +// load last checked search engines from a file +void GUI::loadCheckedSearchEngines(){ + qDebug("Loading checked search engines"); + QFile lastSearchEngines(misc::qBittorrentPath()+"lastSearchEngines.txt"); + QStringList searchEnginesList; + if(lastSearchEngines.exists()){ + if(lastSearchEngines.open(QIODevice::ReadOnly | QIODevice::Text)){ + QByteArray searchEngine; + while(!lastSearchEngines.atEnd()){ + searchEngine = lastSearchEngines.readLine(); + searchEnginesList << QString(searchEngine.data()); + } + lastSearchEngines.close(); + if(searchEnginesList.indexOf("mininova\n") != -1){ + mininova->setChecked(true); + }else{ + mininova->setChecked(false); + } + if(searchEnginesList.indexOf("piratebay\n") != -1){ + piratebay->setChecked(true); + }else{ + piratebay->setChecked(false); + } + if(searchEnginesList.indexOf("reactor\n") != -1){ + reactor->setChecked(true); + }else{ + reactor->setChecked(false); + } + if(searchEnginesList.indexOf("isohunt\n") != -1){ + isohunt->setChecked(true); + }else{ + isohunt->setChecked(false); + } + if(searchEnginesList.indexOf("btjunkie\n") != -1){ + btjunkie->setChecked(true); + }else{ + btjunkie->setChecked(false); + } + if(searchEnginesList.indexOf("meganova\n") != -1){ + meganova->setChecked(true); + }else{ + meganova->setChecked(false); + } + qDebug("Checked search engines loaded"); + }else{ + std::cout << "Error: Could not load last checked search engines\n"; + } + } +} + +// Display About Dialog +void GUI::showAbout(){ + //About dialog + aboutdlg = new about(this); +} + +// Called when we close the program +void GUI::closeEvent(QCloseEvent *e){ + if(options->getConfirmOnExit()){ + if(QMessageBox::question(this, + tr("Are you sure you want to quit? -- qBittorrent"), + tr("Are you sure you want to quit qbittorrent?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1)){ + e->ignore(); + return; + } + } + // Save DHT entry + if(DHTEnabled){ + try{ + entry dht_state = s->dht_state(); + boost::filesystem::ofstream out(misc::qBittorrentPath().toStdString()+"dht_state", std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), dht_state); + }catch (std::exception& e){ + std::cout << e.what() << "\n"; + } + } + // Save window size, columns size + saveWindowSize(); + saveColWidthDLList(); + saveColWidthSearchList(); + // Create fast resume data + saveFastResumeData(); + // Hide tray icon + myTrayIcon->hide(); + // Accept exit + e->accept(); +} + +// Display window to create a torrent +void GUI::showCreateWindow(){ + createWindow = new createtorrent(this); +} + +// Called when we minimize the program +void GUI::hideEvent(QHideEvent *e){ + if(options->getGoToSysTrayOnMinimizingWindow()){ + // Hide window + hide(); + } + // Accept exit + e->accept(); +} + +// Action executed when a file is dropped +void GUI::dropEvent(QDropEvent *event){ + event->acceptProposedAction(); + QStringList files=event->mimeData()->text().split('\n'); + // Add file to download list + addTorrents(files); +} + +// Decode if we accept drag 'n drop or not +void GUI::dragEnterEvent(QDragEnterEvent *event){ + if (event->mimeData()->hasFormat("text/plain")){ + event->acceptProposedAction(); + } +} + +/***************************************************** + * * + * Torrent * + * * + *****************************************************/ + +// Display a dialog to allow user to add +// torrents to download list +void GUI::askForTorrents(){ + QStringList pathsList; + QString lastDir = misc::qBittorrentPath()+"lastDir.txt"; + QString dirPath=QDir::homePath(); + QFile lastDirFile(lastDir); + // Load remembered last dir + if(lastDirFile.exists()){ + lastDirFile.open(QIODevice::ReadOnly | QIODevice::Text); + dirPath=lastDirFile.readLine(); + lastDirFile.close(); + } + // Open File Open Dialog + // Note: it is possible to select more than one file + pathsList = QFileDialog::getOpenFileNames(this, + tr("Open Torrent Files"), dirPath, + tr("Torrent Files")+" (*.torrent)"); + if(!pathsList.empty()){ + //Add torrents to download list + addTorrents(pathsList); + // Save last dir to remember it + lastDirFile.open(QIODevice::WriteOnly | QIODevice::Text); + QStringList top_dir = pathsList.at(0).split(QDir::separator()); + top_dir.removeLast(); + lastDirFile.write(QByteArray(top_dir.join(QDir::separator()).toStdString().c_str())); + lastDirFile.close(); + } +} + +// Scan the first level of the directory for torrent files +// and add them to download list +void GUI::scanDirectory(){ + QString dirText = options->getScanDir(); + QString file; + if(!dirText.isNull()){ + QStringList to_add; + QDir dir(dirText); + QStringList files = dir.entryList(QDir::Files, QDir::Unsorted); + foreach(file, files){ + QString fullPath = dir.path()+QDir::separator()+file; + if(fullPath.endsWith(".torrent")){ + to_add << fullPath; + } + } + if(!to_add.empty()){ + addTorrents(to_add, true); + } + } +} + +void GUI::saveFastResumeData() const{ + qDebug("Saving fast resume data"); + std::string file; + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + // Checking if torrentBackup Dir exists + // create it if it is not + if(! torrentBackup.exists()){ + torrentBackup.mkpath(torrentBackup.path()); + } + // Write fast resume data + foreach(torrent_handle h, handles){ + // Pause download (needed before fast resume writing) + h.pause(); + // Extracting resume data + if (h.has_metadata()){ + QString filename = QString(h.get_torrent_info().name().c_str()); + if(QFile::exists(torrentBackup.path()+QDir::separator()+filename+".torrent")){ + // Remove old .fastresume data in case it exists + QFile::remove(filename + ".fastresume"); + // Write fast resume data + entry resumeData = h.write_resume_data(); + file = filename.toStdString() + ".fastresume"; + boost::filesystem::ofstream out(fs::path(torrentBackup.path().toStdString()) / file, std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), resumeData); + } + } + } + qDebug("Fast resume data saved"); +} + +// delete All Downloads in the list +void GUI::deleteAll(){ + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList torrents; + QString scan_dir = options->getScanDir(); + bool isScanningDir = !scan_dir.isNull(); + if(isScanningDir && scan_dir.at(scan_dir.length()-1) != QDir::separator()){ + scan_dir += QDir::separator(); + } + + if(QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete all files in download list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1) == 0) { + // User clicked YES + // Remove torrents from BT session + foreach(torrent_handle h, handles){ + // remove it from scan dir or it will start again + if(isScanningDir){ + QFile::remove(scan_dir+QString(h.get_torrent_info().name().c_str())+".torrent"); + } + // remove it from session + s->remove_torrent(h); + } + // Clear handles + handles.clear(); + // Clear torrent backup directory + torrents = torrentBackup.entryList(); + QString torrent; + foreach(torrent, torrents){ + if(torrent.endsWith(".fastresume") || torrent.endsWith(".torrent") || torrent.endsWith(".paused") || torrent.endsWith(".incremental")){ + torrentBackup.remove(torrent); + } + } + // Clear Download list + DLListModel->removeRows(0, DLListModel->rowCount()); + //Update info Bar + setInfoBar(tr("Download list cleared.")); + } +} + +// delete selected items in the list +void GUI::deleteSelection(){ + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QString scan_dir = options->getScanDir(); + bool isScanningDir = !scan_dir.isNull(); + if(isScanningDir && scan_dir.at(scan_dir.length()-1) != QDir::separator()){ + scan_dir += QDir::separator(); + } + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + if(!selectedIndexes.isEmpty()){ + if(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) == 0) { + //User clicked YES + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + // Get the file name + QString fileName = index.data().toString(); + // Get handle and pause the torrent + torrent_handle h = handles.value(fileName); + s->remove_torrent(h); + // remove it from scan dir or it will start again + if(isScanningDir){ + QFile::remove(scan_dir+fileName+".torrent"); + } + // Remove torrent from handles + handles.remove(fileName); + // Remove it from torrent backup directory + torrentBackup.remove(fileName+".torrent"); + torrentBackup.remove(fileName+".fastresume"); + torrentBackup.remove(fileName+".paused"); + torrentBackup.remove(fileName+".incremental"); + // Update info bar + setInfoBar("'" + fileName +"' "+tr("removed.", " removed.")); + // Delete item from download list + int row = getRowFromName(fileName); + if(row == -1){ + std::cout << "Error: Couldn't find filename in download list...\n"; + continue; + } + DLListModel->removeRow(row); + } + } + } + } +} + +// Will fast resume unfinished torrents in +// backup directory +void GUI::resumeUnfinished(){ + qDebug("Resuming unfinished torrents"); + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList fileNames, filePaths; + // Scan torrentBackup directory + fileNames = torrentBackup.entryList(); + QString fileName; + foreach(fileName, fileNames){ + if(fileName.endsWith(".torrent")){ + filePaths.append(torrentBackup.path()+QDir::separator()+fileName); + } + } + // Resume downloads + addTorrents(filePaths); + qDebug("Unfinished torrents resumed"); +} + +// Method used to add torrents to download list +void GUI::addTorrents(const QStringList& pathsList, bool fromScanDir, const QString& from_url){ + torrent_handle h; + entry resume_data; + bool fastResume=false; + QDir saveDir(options->getSavePath()), torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QString file, dest_file, scan_dir; + + // Checking if savePath Dir exists + // create it if it is not + if(! saveDir.exists()){ + if(! saveDir.mkpath(saveDir.path())){ + setInfoBar(tr("Couldn't create the directory:")+" '"+saveDir.path()+"'", "red"); + return; + } + } + + // Checking if BT_backup Dir exists + // create it if it is not + if(! torrentBackup.exists()){ + if(! torrentBackup.mkpath(torrentBackup.path())){ + setInfoBar(tr("Couldn't create the directory:")+" '"+torrentBackup.path()+"'", "red"); + return; + } + } + // Processing torrents + foreach(file, pathsList){ + file = file.trimmed().replace("file://", ""); + if(file.isEmpty()){ + continue; + } + qDebug("Adding %s to download list", file.toStdString().c_str()); + std::ifstream in(file.toStdString().c_str(), std::ios_base::binary); + in.unsetf(std::ios_base::skipws); + try{ + // Decode torrent file + entry e = bdecode(std::istream_iterator(in), std::istream_iterator()); + //qDebug("Entry bdecoded"); + // Getting torrent file informations + torrent_info t(e); + //qDebug("Got torrent infos"); + if(handles.contains(QString(t.name().c_str()))){ + // Update info Bar + if(!fromScanDir){ + if(!from_url.isNull()){ + setInfoBar("'" + from_url + "' "+tr("already in download list.", " already in download list.")); + }else{ + setInfoBar("'" + file + "' "+tr("already in download list.", " already in download list.")); + } + }else{ + // Delete torrent from scan dir + QFile::remove(file); + } + continue; + } + //Getting fast resume data if existing + if(torrentBackup.exists(QString::QString(t.name().c_str())+".fastresume")){ + try{ + std::stringstream strStream; + strStream << t.name() << ".fastresume"; + boost::filesystem::ifstream resume_file(fs::path(torrentBackup.path().toStdString()) / strStream.str(), std::ios_base::binary); + resume_file.unsetf(std::ios_base::skipws); + resume_data = bdecode(std::istream_iterator(resume_file), std::istream_iterator()); + fastResume=true; + }catch (invalid_encoding&) {} + catch (fs::filesystem_error&) {} + //qDebug("Got fast resume data"); + } + int row = DLListModel->rowCount(); + // Adding files to bittorrent session + h = s->add_torrent(t, fs::path(saveDir.path().toStdString()), resume_data); + //qDebug("Added to session"); + torrent_status torrentStatus = h.status(); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)torrentStatus.progress)); + handles.insert(QString(t.name().c_str()), h); + QString newFile = torrentBackup.path() + QDir::separator() + QString(t.name().c_str())+".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); + } + //qDebug("Copied to torrent backup directory"); + if(fromScanDir){ + scan_dir = options->getScanDir(); + if(scan_dir.at(scan_dir.length()-1) != QDir::separator()){ + scan_dir += QDir::separator(); + } + //rename torrent file to match file name and find it easily later + dest_file = scan_dir+t.name().c_str()+".torrent"; + if(!QFile::exists(dest_file)){ + QFile::rename(file, dest_file); + } + } + // Adding torrent to download list + DLListModel->insertRow(row); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(t.name().c_str())); + DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)t.total_size())); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + // Pause torrent if it was paused last time + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(t.name().c_str())+".paused")){ + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Paused"))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/paused.png")), Qt::DecorationRole); + setRowColor(row, "red"); + }else{ + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Connecting..."))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/connecting.png")), Qt::DecorationRole); + setRowColor(row, "grey"); + } + //qDebug("Added to download list"); + // Pause torrent if it was paused last time + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(t.name().c_str())+".paused")){ + h.pause(); + } + // Incremental download + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(t.name().c_str())+".incremental")){ + qDebug("Incremental download enabled for %s", t.name().c_str()); + h.set_sequenced_download_threshold(1); + } + // Update info Bar + if(!fastResume){ + if(!from_url.isNull()){ + setInfoBar("'" + from_url + "' "+tr("added to download list.")); + }else{ + setInfoBar("'" + file + "' "+tr("added to download list.")); + } + }else{ + if(!from_url.isNull()){ + setInfoBar("'" + from_url + "' "+tr("resumed. (fast resume)")); + }else{ + setInfoBar("'" + file + "' "+tr("resumed. (fast resume)")); + } + } + }catch (invalid_encoding& e){ // Raised by bdecode() + std::cout << "Could not decode file, reason: " << e.what() << '\n'; + // Display warning to tell user we can't decode the torrent file + if(!from_url.isNull()){ + setInfoBar(tr("Unable to decode torrent file:")+" '"+from_url+"'", "red"); + }else{ + setInfoBar(tr("Unable to decode torrent file:")+" '"+file+"'", "red"); + } + setInfoBar(tr("This file is either corrupted or this isn't a torrent."),"red"); + if(fromScanDir){ + // Remove .corrupt file in case it already exists + QFile::remove(file+".corrupt"); + //Rename file extension so that it won't display error message more than once + QFile::rename(file,file+".corrupt"); + } + } + catch (invalid_torrent_file&){ // Raised by torrent_info constructor + // Display warning to tell user we can't decode the torrent file + if(!from_url.isNull()){ + setInfoBar(tr("Unable to decode torrent file:")+" '"+from_url+"'", "red"); + }else{ + setInfoBar(tr("Unable to decode torrent file:")+" '"+file+"'", "red"); + } + setInfoBar(tr("This file is either corrupted or this isn't a torrent."),"red"); + if(fromScanDir){ + //Rename file extension so that it won't display error message more than once + QFile::rename(file,file+".corrupt"); + } + } + } +} + +// 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){ + QString param; + foreach(param, params){ + param = param.trimmed(); + if(param.startsWith("http://", Qt::CaseInsensitive) || param.startsWith("ftp://", Qt::CaseInsensitive) || param.startsWith("https://", Qt::CaseInsensitive)){ + downloadFromUrl(param); + }else{ + addTorrents(QStringList(param)); + } + } +} + +// libtorrent allow to adjust ratio for each torrent +// This function will apply to same ratio to all torrents +void GUI::setGlobalRatio(float ratio){ + foreach(torrent_handle h, handles){ + h.set_ratio(ratio); + } +} + +// Show torrent properties dialog +void GUI::showProperties(const QModelIndex &index){ + int row = index.row(); + QString fileName = DLListModel->data(DLListModel->index(row, NAME)).toString(); + torrent_handle h = handles.value(fileName); + QStringList errors = trackerErrors.value(fileName, QStringList(tr("None"))); + properties *prop = new properties(this, h, errors); + prop->show(); +} + +// Set BT session configuration +void GUI::configureSession(){ + qDebug("Configuring session"); + QPair limits; + unsigned short old_listenPort, new_listenPort; + session_settings proxySettings; + // creating BT Session & listen + // Configure session regarding options + try { + if(s->is_listening()){ + old_listenPort = s->listen_port(); + }else{ + old_listenPort = 0; + } + std::pair new_listenPorts = options->getPorts(); + if(listenPorts != new_listenPorts){ + s->listen_on(new_listenPorts); + listenPorts = new_listenPorts; + } + + if(s->is_listening()){ + new_listenPort = s->listen_port(); + if(new_listenPort != old_listenPort){ + setInfoBar(tr("Listening on port: ")+ QString(misc::toString(new_listenPort).c_str())); + } + } + struct rlimit rlim; + getrlimit(RLIMIT_NOFILE, &rlim); + s->set_max_connections((int)rlim.rlim_max-60); + // Apply max connec limit (-1 if disabled) + int max_connec = options->getMaxConnec(); + if(max_connec == -1 or max_connec >= (int)rlim.rlim_max-50){ + s->set_max_connections(rlim.rlim_max-50); + }else{ + s->set_max_connections(max_connec); + } + // Apply Up/Dl limits (-1 if disabled) + limits = options->getLimits(); + switch(limits.first){ + case -1: // Download limit disabled + case 0: + s->set_download_rate_limit(-1); + break; + default: + s->set_download_rate_limit(limits.first*1024); + } + switch(limits.second){ + case -1: // Upload limit disabled + case 0: + s->set_upload_rate_limit(-1); + break; + default: + s->set_upload_rate_limit(limits.second*1024); + } + // Apply ratio (0 if disabled) + setGlobalRatio(options->getRatio()); + // DHT (Trackerless) + if(options->isDHTEnabled() && !DHTEnabled){ + boost::filesystem::ifstream dht_state_file(misc::qBittorrentPath().toStdString()+"dht_state", std::ios_base::binary); + dht_state_file.unsetf(std::ios_base::skipws); + entry dht_state; + try{ + dht_state = bdecode(std::istream_iterator(dht_state_file), std::istream_iterator()); + }catch (std::exception&) {} + 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("Enabling DHT Support"); + }else{ + if(!options->isDHTEnabled() && DHTEnabled){ + s->stop_dht(); + DHTEnabled = false; + qDebug("Disabling DHT Support"); + } + } + // Apply filtering settings + if(options->isFilteringEnabled()){ + s->set_ip_filter(options->getFilter()); + }else{ + s->set_ip_filter(ip_filter()); + } + // Apply Proxy settings + if(options->isProxyEnabled()){ + proxySettings.proxy_ip = options->getProxyIp().toStdString(); + proxySettings.proxy_port = options->getProxyPort(); + if(options->isProxyAuthEnabled()){ + proxySettings.proxy_login = options->getProxyUsername().toStdString(); + proxySettings.proxy_password = options->getProxyPassword().toStdString(); + } + } + proxySettings.user_agent = "qBittorrent "VERSION; + //proxySettings.user_agent = "Azureus"; + s->set_settings(proxySettings); + // Scan dir stuff + if(options->getScanDir().isNull()){ + if(timerScan->isActive()){ + timerScan->stop(); + } + }else{ + if(!timerScan->isActive()){ + timerScan->start(5000); + } + } + }catch(std::exception& e){ + std::cout << e.what() << "\n"; + } + qDebug("Session configured"); +} + +// Pause All Downloads in DL list +void GUI::pauseAll(){ + QString fileName; + bool changes=false; + // Browse Handles to pause all downloads + foreach(torrent_handle h, handles){ + if(!h.is_paused()){ + fileName = QString(h.get_torrent_info().name().c_str()); + changes=true; + h.pause(); + // Create .paused file + QFile paused_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+fileName+".paused"); + paused_file.open(QIODevice::WriteOnly | QIODevice::Text); + paused_file.close(); + // update DL Status + int row = getRowFromName(fileName); + if(row == -1){ + std::cout << "Error: Filename could not be found in download list...\n"; + continue; + } + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Paused"))); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/paused.png")), Qt::DecorationRole); + setRowColor(row, "red"); + } + } + //Set Info Bar + if(changes){ + setInfoBar(tr("All Downloads Paused.")); + } +} + +// pause selected items in the list +void GUI::pauseSelection(){ + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + // Get the file name + QString fileName = index.data().toString(); + // Get handle and pause the torrent + torrent_handle h = handles.value(fileName); + if(!h.is_paused()){ + h.pause(); + // Create .paused file + QFile paused_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+fileName+".paused"); + paused_file.open(QIODevice::WriteOnly | QIODevice::Text); + paused_file.close(); + // Update DL status + int row = index.row(); + 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, STATUS), QVariant(tr("Paused"))); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + setInfoBar("'"+ fileName +"' "+tr("paused.", " paused.")); + DLListModel->setData(DLListModel->index(row, NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + setRowColor(row, "red"); + } + } + } +} + +// Start All Downloads in DL list +void GUI::startAll(){ + QString fileName; + bool changes=false; + // Browse Handles to pause all downloads + foreach(torrent_handle h, handles){ + if(h.is_paused()){ + fileName = QString(h.get_torrent_info().name().c_str()); + changes=true; + h.resume(); + // Delete .paused file + QFile::remove(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+fileName+".paused"); + // update DL Status + int row = getRowFromName(fileName); + if(row == -1){ + std::cout << "Error: Filename could not be found in download list...\n"; + continue; + } + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Connecting..."))); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/connecting.png")), Qt::DecorationRole); + setRowColor(row, "grey"); + } + } + //Set Info Bar + if(changes){ + setInfoBar(tr("All Downloads Resumed.")); + } +} + +// start selected items in the list +void GUI::startSelection(){ + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + // Get the file name + QString fileName = index.data().toString(); + // Get handle and pause the torrent + torrent_handle h = handles.value(fileName); + if(h.is_paused()){ + h.resume(); + // Delete .paused file + QFile::remove(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+fileName+".paused"); + // Update DL status + int row = index.row(); + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Connecting..."))); + setInfoBar("'"+ fileName +"' "+tr("resumed.", " resumed.")); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/connecting.png")), Qt::DecorationRole); + setRowColor(row, "grey"); + } + } + } +} + +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::propertiesSelection(){ + QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + showProperties(index); + } + } +} + +// Check connection status and display right icon +void GUI::checkConnectionStatus(){ + qDebug("Checking connection status"); + char tmp[MAX_CHAR_TMP]; + session_status sessionStatus = s->status(); + // Update ratio info + float ratio = 1.; + if(sessionStatus.total_payload_download != 0){ + ratio = (float)sessionStatus.total_payload_upload/(float)sessionStatus.total_payload_download; + } + if(ratio > 10.){ + ratio = 10.; + } + snprintf(tmp, MAX_CHAR_TMP, "%.1f", ratio); + LCD_Ratio->display(tmp); + if(ratio < 0.5){ + lbl_ratio_icon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/unhappy.png"))); + }else{ + if(ratio > 1.0){ + lbl_ratio_icon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/smile.png"))); + }else{ + lbl_ratio_icon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/stare.png"))); + } + } + if(sessionStatus.has_incoming_connections){ + // Connection OK + actionConnexion_Status->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/connected.png"))); + actionConnexion_Status->setText(tr("Connection Status:
Online")); + }else{ + if(sessionStatus.num_peers){ + // Firewalled ? + actionConnexion_Status->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + actionConnexion_Status->setText(tr("Connection Status:
Firewalled?
No incoming connections...")); + }else{ + // Disconnected + actionConnexion_Status->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/disconnected.png"))); + actionConnexion_Status->setText(tr("Connection Status:
Offline
No peers found...")); + } + } + // Check trackerErrors list size and clear it if it is too big + if(trackerErrors.size() > 50){ + trackerErrors.clear(); + } + // 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())){ + QString fileName = QString(p->handle.get_torrent_info().name().c_str()); + // Level: info + setInfoBar(fileName+tr(" has finished downloading.")); + if(options->getUseOSDAlways() || (options->getUseOSDWhenHiddenOnly() && (isMinimized() || isHidden()))) { + OSDWindow->display(fileName+tr(" has finished downloading.")); + } + // Update download list + int row = getRowFromName(fileName); + DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Finished"))); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.)); + DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); + DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)1.)); + setRowColor(row, "orange"); + QString scan_dir = options->getScanDir(); + bool isScanningDir = !scan_dir.isNull(); + if(isScanningDir && scan_dir.at(scan_dir.length()-1) != QDir::separator()){ + scan_dir += QDir::separator(); + } + // Remove it from torrentBackup directory + // No need to resume it + if(options->getClearFinishedOnExit()){ + QFile::remove(fileName+".torrent"); + QFile::remove(fileName+".fastresume"); + if(isScanningDir){ + QFile::remove(scan_dir+fileName+".torrent"); + } + } + } + else if (dynamic_cast(a.get())){ + // Level: fatal + setInfoBar(tr("Couldn't listen on any of the given ports."), "red"); + } + else if (tracker_alert* p = dynamic_cast(a.get())){ + // Level: fatal + QString filename = QString(p->handle.get_torrent_info().name().c_str()); + QStringList errors = trackerErrors.value(filename, QStringList()); + errors.append(""+QTime::currentTime().toString("hh:mm:ss")+" - "+QString(a->msg().c_str())+""); + trackerErrors.insert(filename, errors); + // Authentication + if(p->status_code == 401){ + if(unauthenticated_trackers.indexOf(QPair(p->handle, p->handle.status().current_tracker)) < 0){ + // Tracker login + tracker_login = new trackerLogin(this, p->handle); + } + } + } +// else if (peer_error_alert* p = dynamic_cast(a.get())) +// { +// events.push_back(identify_client(p->id) + ": " + a->msg()); +// } +// else if (invalid_request_alert* p = dynamic_cast(a.get())) +// { +// events.push_back(identify_client(p->id) + ": " + a->msg()); +// } + a = s->pop_alert(); + } + qDebug("Connection status updated"); +} + + +/***************************************************** + * * + * Search * + * * + *****************************************************/ + +// Function called when we click on search button +void GUI::on_search_button_clicked(){ + 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; + } + // Getting checked search engines + if(!mininova->isChecked() && ! piratebay->isChecked() && !reactor->isChecked() && !isohunt->isChecked() && !btjunkie->isChecked() && !meganova->isChecked()){ + QMessageBox::critical(0, tr("No seach engine selected"), tr("You must select at least one search engine.")); + return; + } + QStringList params; + QStringList engineNames; + search_stopped = false; + // Get checked search engines + if(mininova->isChecked()){ + engineNames << "mininova"; + } + if(piratebay->isChecked()){ + engineNames << "piratebay"; + } + if(reactor->isChecked()){ + engineNames << "reactor"; + } + if(isohunt->isChecked()){ + engineNames << "isohunt"; + } + if(btjunkie->isChecked()){ + engineNames << "btjunkie"; + } + if(meganova->isChecked()){ + engineNames << "meganova"; + } + params << engineNames.join(","); + params << pattern.split(" "); + // Update GUI widgets + no_search_results = true; + nb_search_results = 0; + search_result_line_truncated.clear(); + results_lbl->setText(tr("Results")+" (0):"); + // Launch search + searchProcess->start(misc::qBittorrentPath()+"nova.py", params, QIODevice::ReadOnly); +} + +void GUI::searchStarted(){ + // Update GUI widgets + search_button->setEnabled(false); + search_button->repaint(); + search_status->setText(tr("Searching...")); + search_status->repaint(); + stop_search_button->setEnabled(true); + stop_search_button->repaint(); + // clear results window + SearchListModel->removeRows(0, SearchListModel->rowCount()); + // Clear previous results urls too + searchResultsUrls.clear(); +} + +// Download the given item from search results list +void GUI::downloadSelectedItem(const QModelIndex& index){ + int row = index.row(); + // Get Item url + QString url = searchResultsUrls.value(SearchListModel->data(SearchListModel->index(row, NAME)).toString()); + // Download from url + downloadFromUrl(url); + // Set item color to RED + setRowColor(row, "red", false); +} + +// 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 GUI::readSearchOutput(){ + QByteArray output = searchProcess->readAllStandardOutput(); + QList lines_list = output.split('\n'); + QByteArray line; + 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(line, lines_list){ + appendSearchResult(QString(line)); + } + results_lbl->setText(tr("Results")+" ("+QString(misc::toString(nb_search_results).c_str())+"):"); +} + +// Returns version of nova.py search engine +float GUI::getNovaVersion(const QString& novaPath) const{ + QFile dest_nova(novaPath); + if(!dest_nova.exists()){ + return 0.0; + } + if(!dest_nova.open(QIODevice::ReadOnly | QIODevice::Text)){ + return 0.0; + } + float version = 0.0; + while (!dest_nova.atEnd()){ + QByteArray line = dest_nova.readLine(); + if(line.startsWith("# Version: ")){ + line = line.split(' ').last(); + line.chop(1); // removes '\n' + version = line.toFloat(); + qDebug("Search plugin version: %.1f", version); + break; + } + } + return version; +} + +// Returns changelog of nova.py search engine +QByteArray GUI::getNovaChangelog(const QString& novaPath) const{ + QFile dest_nova(novaPath); + if(!dest_nova.exists()){ + return QByteArray("None"); + } + if(!dest_nova.open(QIODevice::ReadOnly | QIODevice::Text)){ + return QByteArray("None"); + } + QByteArray changelog; + bool in_changelog = false; + while (!dest_nova.atEnd()){ + QByteArray line = dest_nova.readLine(); + line = line.trimmed(); + if(line.startsWith("# Changelog:")){ + in_changelog = true; + }else{ + if(in_changelog && line.isEmpty()){ + // end of changelog + return changelog; + } + if(in_changelog){ + line.remove(0,1); + changelog.append(line); + } + } + } + return changelog; +} + +// Update nova.py search plugin if necessary +void GUI::updateNova() const{ + qDebug("Updating nova"); + float provided_nova_version = getNovaVersion(":/search_engine/nova.py"); + QFile::Permissions perm=QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::ReadGroup; + QFile(misc::qBittorrentPath()+"nova.py").setPermissions(perm); + if(provided_nova_version > getNovaVersion(misc::qBittorrentPath()+"nova.py")){ + std::cout << "updating local search plugin with shipped one\n"; + // nova.py needs update + QFile::remove(misc::qBittorrentPath()+"nova.py"); + qDebug("Old nova removed"); + QFile::copy(":/search_engine/nova.py", misc::qBittorrentPath()+"nova.py"); + qDebug("New nova copied"); + QFile::Permissions perm=QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::ReadGroup; + QFile(misc::qBittorrentPath()+"nova.py").setPermissions(perm); + std::cout << "local search plugin updated\n"; + } +} + +// Download nova.py from qbittorrent.org +// Check if our nova.py is outdated and +// ask user for action. +void GUI::on_update_nova_button_clicked(){ + CURL *curl; + std::string filePath; + std::cout << "Checking for search plugin updates on qbittorrent.org\n"; + // XXX: Trick to get a unique filename + QTemporaryFile *tmpfile = new QTemporaryFile; + if (tmpfile->open()) { + filePath = tmpfile->fileName().toStdString(); + } + delete tmpfile; + FILE *file = fopen(filePath.c_str(), "w"); + if(!file){ + std::cout << "Error: could not open temporary file...\n"; + } + // Initilization required by libcurl + curl = curl_easy_init(); + if(!curl){ + std::cout << "Error: Failed to init curl...\n"; + fclose(file); + return; + } + // Set url to download + curl_easy_setopt(curl, CURLOPT_URL, "http://www.dchris.eu/nova/nova.zip"); + // Define our callback to get called when there's data to be written + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, misc::my_fwrite); + // Set destination file + curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); + // Some SSL mambo jambo + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + // Perform Download + curl_easy_perform(curl); /* ignores error */ + // Cleanup + curl_easy_cleanup(curl); + // Close tmp file + fclose(file); + std::cout << "Version on qbittorrent.org: " << getNovaVersion(QString(filePath.c_str())) << '\n'; + float version_on_server = getNovaVersion(QString(filePath.c_str())); + if(version_on_server == 0.0){ + //First server is down, try mirror + QFile::remove(filePath.c_str()); + FILE *file = fopen(filePath.c_str(), "w"); + if(!file){ + std::cout << "Error: could not open temporary file...\n"; + } + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "http://hydr0g3n.free.fr/nova/nova.py"); + // Define our callback to get called when there's data to be written + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, misc::my_fwrite); + // Set destination file + curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); + // Some SSL mambo jambo + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + // Perform Download + curl_easy_perform(curl); /* ignores error */ + // Cleanup + curl_easy_cleanup(curl); + // Close tmp file + fclose(file); + version_on_server = getNovaVersion(QString(filePath.c_str())); + } + if(version_on_server > getNovaVersion(misc::qBittorrentPath()+"nova.py")){ + if(QMessageBox::question(this, + tr("Search plugin update -- qBittorrent"), + tr("Search plugin can be updated, do you want to update it?\n\nChangelog:\n")+QString(getNovaChangelog(QString(filePath.c_str())).data()), + tr("&Yes"), tr("&No"), + QString(), 0, 1)){ + return; + }else{ + std::cout << "Updating search plugin from qbittorrent.org\n"; + QFile::remove(misc::qBittorrentPath()+"nova.py"); + QFile::copy(QString(filePath.c_str()), misc::qBittorrentPath()+"nova.py"); + QFile::Permissions perm=QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ReadGroup | QFile::ReadGroup; + QFile(misc::qBittorrentPath()+"nova.py").setPermissions(perm); + } + }else{ + if(version_on_server == 0.0){ + QMessageBox::information(this, tr("Search plugin update -- qBittorrent"), + tr("Sorry, update server is temporarily unavailable.")); + }else{ + QMessageBox::information(this, tr("Search plugin update -- qBittorrent"), + tr("Your search plugin is already up to date.")); + } + } + // Delete tmp file + QFile::remove(filePath.c_str()); +} + +// Slot called when search is Finished +// Search can be finished for 3 reasons : +// Error | Stopped by user | Finished normally +void GUI::searchFinished(int exitcode,QProcess::ExitStatus){ + if(options->getUseOSDAlways() || (options->getUseOSDWhenHiddenOnly() && (isMinimized() || isHidden()))) { + OSDWindow->display(tr("Search is finished")); + } + 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 is finished")); + } + } + } + results_lbl->setText(tr("Results")+" ("+QString(misc::toString(nb_search_results).c_str())+"):"); + search_button->setEnabled(true); + stop_search_button->setEnabled(false); +} + +// 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 GUI::appendSearchResult(const QString& line){ + QStringList parts = line.split("|"); + if(parts.size() != 6){ + return; + } + QString url = parts.takeFirst(); + QString filename = parts.first(); + // XXX: Two results can't have the same name (right?) + if(searchResultsUrls.contains(filename)){ + return; + } + // Add item to search result list + int row = SearchListModel->rowCount(); + SearchListModel->insertRow(row); + for(int i=0; i<5; ++i){ + SearchListModel->setData(SearchListModel->index(row, i), QVariant(parts.at(i))); + } + // Add url to searchResultsUrls associative array + searchResultsUrls.insert(filename, url); + no_search_results = false; + ++nb_search_results; + // Enable clear & download buttons + clear_button->setEnabled(true); + download_button->setEnabled(true); +} + +// Stop search while it is working in background +void GUI::on_stop_search_button_clicked(){ + // Kill process + searchProcess->terminate(); + search_stopped = true; +} + +// Clear search results list +void GUI::on_clear_button_clicked(){ + searchResultsUrls.clear(); + SearchListModel->removeRows(0, SearchListModel->rowCount()); + // Disable clear & download buttons + clear_button->setEnabled(false); + download_button->setEnabled(false); +} + +// Download selected items in search results list +void GUI::on_download_button_clicked(){ + QModelIndexList selectedIndexes = resultsBrowser->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + downloadFromUrl(index.data().toString()); + setRowColor(index.row(), "red", false); + } + } +} + + +/***************************************************** + * * + * Utils * + * * + *****************************************************/ + +// Set the color of a row in data model +void GUI::setRowColor(int row, const QString& color, bool inDLList){ + if(inDLList){ + for(int i=0; icolumnCount(); ++i){ + DLListModel->setData(DLListModel->index(row, i), QVariant(QColor(color)), Qt::TextColorRole); + } + }else{ + //Search list + for(int i=0; icolumnCount(); ++i){ + SearchListModel->setData(SearchListModel->index(row, i), QVariant(QColor(color)), Qt::TextColorRole); + } + } +} + +// return the row of in data model +// corresponding to the given filename +int GUI::getRowFromName(const QString& name) const{ + for(int i=0; irowCount(); ++i){ + if(DLListModel->data(DLListModel->index(i, NAME)) == name){ + return i; + } + } + return -1; +} + +/***************************************************** + * * + * Options * + * * + *****************************************************/ + +// Set locale in options, this is required +// because main() can set the locale and it +// can't access options object directly. +void GUI::setLocale(QString locale){ + options->setLocale(locale); +} + +// Display Program Options +void GUI::showOptions() const{ + options->showLoad(); +} + +// Is executed each time options are saved +void GUI::OptionsSaved(const QString& info){ + // Update info bar + setInfoBar(info); + // Update session + configureSession(); +} + +/***************************************************** + * * + * HTTP Downloader * + * * + *****************************************************/ + +void GUI::processDownloadedFile(QString url, QString file_path, int return_code, QString errorBuffer){ + if(return_code){ + // Download failed + setInfoBar(tr("Couldn't download", "Couldn't download ")+" "+url+", "+tr("reason:", "Reason why the download failed")+" "+errorBuffer, "red"); + QFile::remove(file_path); + return; + } + // Add file to torrent download list + addTorrents(QStringList(file_path), false, url); + // Delete tmp file + QFile::remove(file_path); +} + +// Take an url string to a torrent file, +// download the torrent file to a tmp location, then +// add it to download list +void GUI::downloadFromUrl(const QString& url){ + setInfoBar(tr("Downloading", "Example: Downloading www.example.com/test.torrent")+" '"+url+"', "+tr("Please wait..."), "black"); + // Launch downloader thread + downloader->downloadUrl(url); +// downloader->start(); +} + +// Display an input dialog to prompt user for +// an url +void GUI::askForTorrentUrl(){ + downloadFromURLDialog = new downloadFromURL(this); +} + +void GUI::downloadFromURLList(const QStringList& url_list){ + QString url; + foreach(url, url_list){ + downloadFromUrl(url); + } +} diff --git a/src/GUI.h b/src/GUI.h new file mode 100644 index 000000000..9dc57a26e --- /dev/null +++ b/src/GUI.h @@ -0,0 +1,195 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef GUI_H +#define GUI_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ui_MainWindow.h" +#include "options_imp.h" +#include "about_imp.h" +#include "OSD.h" +#include "previewSelect.h" +#include "trackerLogin.h" + +class createtorrent; +class QTimer; +class TrayIcon; +class DLListDelegate; +class SearchListDelegate; +class downloadThread; +class downloadFromURL; + +using namespace libtorrent; +namespace fs = boost::filesystem; + +class GUI : public QMainWindow, private Ui::MainWindow{ + Q_OBJECT + + private: + // Bittorrent + session *s; + std::pair listenPorts; + QMap handles; + QTimer *checkConnect; + QTimer *timerScan; + QMap trackerErrors; + trackerLogin *tracker_login; + QList > unauthenticated_trackers; + downloadThread *downloader; + downloadFromURL *downloadFromURLDialog; + bool DHTEnabled; + // GUI related + options_imp *options; + createtorrent *createWindow; + QTimer *refresher; + TrayIcon *myTrayIcon; + QMenu *myTrayIconMenu; + about *aboutdlg; + QStandardItemModel *DLListModel; + DLListDelegate *DLDelegate; + QStandardItemModel *SearchListModel; + SearchListDelegate *SearchDelegate; + QStringList supported_preview_extensions; + // Preview + previewSelect *previewSelection; + QProcess *previewProcess; + // Search related + QMap searchResultsUrls; + QProcess *searchProcess; + bool search_stopped; + bool no_search_results; + QByteArray search_result_line_truncated; + unsigned long nb_search_results; + OSD *OSDWindow; + QTcpServer *tcpServer; + QTcpSocket *clientConnection; + + protected slots: + // GUI related slots + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void centerWindow(); + void toggleVisibility(); + void showAbout(); + void setInfoBar(const QString& info, const QString& color="black"); + void updateDlList(); + void showCreateWindow(); + void clearLog(); + void AnotherInstanceConnected(); + void readParamsInFile(); + void saveCheckedSearchEngines(int) const; + void saveColWidthDLList() const; + void saveColWidthSearchList() const; + void loadCheckedSearchEngines(); + bool loadColWidthDLList(); + bool loadColWidthSearchList(); + void saveWindowSize() const; + void loadWindowSize(); + void sortDownloadList(int index); + void sortDownloadListFloat(int index, Qt::SortOrder sortOrder); + void sortDownloadListString(int index, Qt::SortOrder sortOrder); + void sortSearchList(int index); + void sortSearchListInt(int index, Qt::SortOrder sortOrder); + void sortSearchListString(int index, Qt::SortOrder sortOrder); + void displayDLListMenu(const QPoint& pos); + void selectGivenRow(const QModelIndex& index); + void togglePausedState(const QModelIndex& index); + void displayInfoBarMenu(const QPoint& pos); + void displayGUIMenu(const QPoint& pos); + void previewFileSelection(); + void previewFile(const QString& filePath); + void cleanTempPreviewFile(int, QProcess::ExitStatus); + // Torrent actions + void showProperties(const QModelIndex &index); + void propertiesSelection(); + void addTorrents(const QStringList& pathsList, bool fromScanDir = false, const QString& from_url = QString()); + void pauseAll(); + void startAll(); + void pauseSelection(); + void startSelection(); + void askForTorrents(); + void deleteAll(); + void deleteSelection(); + void resumeUnfinished(); + void saveFastResumeData() const; + void checkConnectionStatus(); + void scanDirectory(); + void setGlobalRatio(float ratio); + void configureSession(); + void ProcessParams(const QStringList& params); + void addUnauthenticatedTracker(QPair tracker); + void processDownloadedFile(QString url, QString file_path, int return_code, QString errorBuffer); + void downloadFromURLList(const QStringList& url_list); + // Search slots + void on_search_button_clicked(); + void on_stop_search_button_clicked(); + void on_clear_button_clicked(); + void on_download_button_clicked(); + void on_update_nova_button_clicked(); + void appendSearchResult(const QString& line); + void searchFinished(int exitcode,QProcess::ExitStatus); + void readSearchOutput(); + void searchStarted(); + void downloadSelectedItem(const QModelIndex& index); + // Utils slots + void setRowColor(int row, const QString& color, bool inDLList=true); + // Options slots + void showOptions() const; + void OptionsSaved(const QString& info); + // HTTP slots + void downloadFromUrl(const QString& url); + void askForTorrentUrl(); + + public slots: + void setLocale(QString locale); + + protected: + void closeEvent(QCloseEvent *); + void hideEvent(QHideEvent *); + + public: + // Construct / Destruct + GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList()); + ~GUI(); + // Methods + int getRowFromName(const QString& name) const; + float getNovaVersion(const QString& novaPath) const; + QByteArray getNovaChangelog(const QString& novaPath) const; + void updateNova() const; + bool isFilePreviewPossible(const torrent_handle& h) const; + +}; + +#endif diff --git a/src/Icons/button_cancel.png b/src/Icons/button_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..c6464d90a6f2c00e81f1d237c7f35ab9a5a4af8c GIT binary patch literal 1468 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 literal 0 HcmV?d00001 diff --git a/src/Icons/encrypted.png b/src/Icons/encrypted.png new file mode 100644 index 0000000000000000000000000000000000000000..04a05c1cb1fec55b1d037f11b7340d8d24f9b969 GIT binary patch literal 750 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 Zd;x>BaHcVQx48fS002ovPDHLkV1ik=wafqj literal 0 HcmV?d00001 diff --git a/src/Icons/flags/france.png b/src/Icons/flags/france.png new file mode 100644 index 0000000000000000000000000000000000000000..ef21ef89b833403010d9518f2964f2aabddafbe2 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk1yrQx>Eak-(VLtSu=@Y`2KGPuZ#MYP zdf2^0F|JZ=&!!ND#bP~C23ZGJur3x0U}j(_3Sx~?6HJx^>SXYA^>bP0l+XkK`ob+X literal 0 HcmV?d00001 diff --git a/src/Icons/flags/germany.png b/src/Icons/flags/germany.png new file mode 100644 index 0000000000000000000000000000000000000000..86668f5b759c04881897460e8326ed57fee962b1 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk#lXNQ;OXKRV$qwN;_>Itd`2#=m`KTA z$~PsI(*Gnx6u#nTHf7*eWX;jx*`FIaGymclCeJ#zYqm@0+)9ZKcyNmA`Hhvv#s)x8 z@yf{9=b zlU1kIx_;tZmQKc=6RxbjIycJyes`P|2o+`9DhO Uc;?n%U;r|By85}Sb4q9e0FvsVBme*a literal 0 HcmV?d00001 diff --git a/src/Icons/flags/italy.png b/src/Icons/flags/italy.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f45f2f76be7c96c9940da5aa16557bab95caaa GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^5K{! zx1ZRhFZdYir9~JTPFK0OdSZ#(jS|rxRRU;qFB literal 0 HcmV?d00001 diff --git a/src/Icons/flags/netherlands.png b/src/Icons/flags/netherlands.png new file mode 100644 index 0000000000000000000000000000000000000000..414824e7e4024dfc2e6688e3dea568938caa5579 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk1yp3|>Eak-(VHBjzWC$(#I*c z4k8IPdlI>Qm1lnZ|NsBul^F@T36_N)1$}iBLP}oC^*%|=V`LER;oX;6qvQ=Vgu&C* K&t;ucLK6U6s5B!0 literal 0 HcmV?d00001 diff --git a/src/Icons/flags/poland.png b/src/Icons/flags/poland.png new file mode 100644 index 0000000000000000000000000000000000000000..9a487d81fe523e4e01c73d2cd47fd67a6a7a5d6e GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk1yp3`>Eak-(fjs-BQJvi2g|{wFaLkY zUl-xP7vERoGctrl|70#^unw4e;J0{f0z(0#X(PvPHnu0V QK$93eUHx3vIVCg!0OD9PPyhe` literal 0 HcmV?d00001 diff --git a/src/Icons/flags/portugal.png b/src/Icons/flags/portugal.png new file mode 100644 index 0000000000000000000000000000000000000000..2c406d5ea8ad963ec284a8e4034858f4ffc9470c GIT binary patch literal 525 zcmV+o0`mQdP)T z(@Sd;Q53-O|6IqU1*7RC27*ec)qvf&CwZiKG7=@$rH6uL1s zcB6<3MTnHCU@?{$iJDbOqD?e54`Uw9j9*~FT*sdEx#xH9Ip-=QFtLe+r|1u#Gi8@& z6{=Ly00Fq20K&;3T*Y!-p(^{1S*RoL+<@JMw^HHRNy| z?gces^$>qH0(c^2jEx}TN}c6)hRcZ_=L>RxWs9y0`1aL>NB>B^)@Q90BlD}x$oo9~ zf}lAo{{l-uG@)exIg`qKikGE0JGWDiH7V}HdJl~M0S+m!+f?C>!Lt`f>Gj}MdJHAj zCh`StUXouw%RIvinp)&{I?8?jMMhjL;{FRXHmA|U9X8)eRv!ku8Ni8CuoCGo>Dyy9 z>E+Dv4)4xZxjF+A8F|2RivVtEaAOQ!w*=v>bNh3ZPipm=iSH2v*X4ns|KLdt^gW1r z4SqCpeWigqaTi9v%NGZmS(OcVT!Uku*$yQCy|^uK5TOEH+gq3noC1FV6Ayw{)W;>g P00000NkvXXu0mjf{XyKP literal 0 HcmV?d00001 diff --git a/src/Icons/flags/romania.png b/src/Icons/flags/romania.png new file mode 100644 index 0000000000000000000000000000000000000000..e04512157af384395cffc189bac5ab1c17a297dd GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk1yrQx>Eak-(VLuNFz54pM*biB%~W7X?o;n)e($>8bg=d#Wzp$Pz+#w-i~ literal 0 HcmV?d00001 diff --git a/src/Icons/flags/russia.png b/src/Icons/flags/russia.png new file mode 100644 index 0000000000000000000000000000000000000000..6c74f4406215099ef8cf4d3c8ab7213ca4081b16 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^5g5-u&wghk1yp3|>Eak-(VP6||NsB>Y*I{WQBrnU zjDZb?HZ`KY$}=ZU+?Zz~%DaYD=OIscMi%2^d$(g3J>;H=F)(;8;g){5#cvMK5C%_I KKbLh*2~7Z%moP;D literal 0 HcmV?d00001 diff --git a/src/Icons/flags/slovakia.png b/src/Icons/flags/slovakia.png new file mode 100644 index 0000000000000000000000000000000000000000..122b6dbc311d7c3de2138d52051a86418cbabf07 GIT binary patch literal 440 zcmV;p0Z0CcP)#mv68(X%sCNXFsnqaW*1Nccq zK~y-)jg-qy8wV7Izqy<7IJO7lVly$WakzwngH;t&b&*XUAd9N+mrXWN9w3WsQYi`* z1Vd31WNhL~7)pjPv0=tzd!`E-Xw;_azdq-DM@RpEgjTB+X_|(nX+%+k@B4V3M=TaY z*LD7{MxznK;SfbpkYyQw!C-)_sw$rVuIsY7xyjDX4y&uH+`oUHSS*Gh2wxl=MG-*| z(CKurZJR=&fMr>zs!9|^$eO01swzPcu)V#_!-o&q+uOr&97?4U3kwTqe-#sk5Jeye z2%-prKrkHA>2!Gh{5h>wi)yusVHo6cIW$c}1_;BDgM$N}Jb6N`R>L$+T-RlHcb9@? zp@bo$^K-`M=Y&CkpeV@6Byu{w8TWdKx=w6<9%FrjXtqEqm11#mk;B77T-U|6ZTkH_ z6B83x08tdVbLS2Z9z3AkZsYqtYxnN4Uacaw+nhdng!}XrJMA z{)z7@6{fOTf*_z&DzUu0Od^p$5QHm$BuOkREMQp{-ENnDzmJvAb89r>{j+DBJ$_8k z?E)~A6dWzZ`;QXZFTZhjy1;yX1}m3mV`BruFt99(cs!2p`&R$}K@czugL1h{6h(+( zNPlaK-sZ0a@7`Uz=FG^jU0mmFri2hhoYh@!b>8#!Mul`{@@i}Odh8A0lO#z3VC;E# zA6$BWI9J9221<;>>^yt7*Z2^hBtk&)&iS@Kq7X)Cn)(kL%U|@jAmS-Hb}El=7Ldas zr-`rlJ-@=ao+cDT07O|qkfo~){zabw#^W)L<8XO-$<$;9b!LYC+V{M2WTG&_F)|#d zEXLwhn-Y#Fm9u20(*%P7t#*qW18m8 zi6luP2m;Q|&X6RD)6-M3*(`JAIo8$}Db7xD(mCa0&%@9)rmQKZav4Mg+T9MdT8+uc zNs`GVsZaa|)jlVLmxkt7jCQ;}4e zAP6WHiyR#tVcRywBVg%pgI5m002ovPDHLkV1gqm`x*cM literal 0 HcmV?d00001 diff --git a/src/Icons/flags/spain.png b/src/Icons/flags/spain.png new file mode 100644 index 0000000000000000000000000000000000000000..adefcb21f5d871bc39af8054c3b8c294210e8a61 GIT binary patch literal 355 zcmV-p0i6DcP)Q(=eWkwXHrRND~K2iiA6|fXOW9p@zmR0 z3)@R^#v>4%W{P3vn}22)xdTsyrm8GH9{};bQRxo!q`>7x%5~=zYdy!Obq-t6-vPc} zK6&a48QhEz5pK2Ppjku0@)Ir0I6KeTRKix~IBF;CwogcstaNcGP~e>B{oc?I3~!5d z2K{Gh@hTr(L!K|7wM++4N(keK-f%=}a`qpt2-ApgIU)$kD<~XM&l=XYSCDuKb~ey^ z>pa>qBIUY=31{k@M+B?|??LMyuhcI9|G#MFfNx8uP1}1PZD9Za002ovPDHLkV1o6U BjfCJdmGSK7 zgU638S8pqkF{s3tLCLm{_RMx$7rV0FWMC*RF`0HJP=g=nBL+`bKbLh*2~7ZJ CvUIcn literal 0 HcmV?d00001 diff --git a/src/Icons/flags/turkey.png b/src/Icons/flags/turkey.png new file mode 100644 index 0000000000000000000000000000000000000000..41cb3fad3cc88b3b04ee89bd0baeaa66c27cc075 GIT binary patch literal 405 zcmV;G0c!qR5*>@ z)K4o!Q5eVZ?{m*|H6^-tX1YbmT1pCOk`3>{YfwVUYQ$@>U}a-PS=cBGQk162znZ)P zHHOTL3~5~MJr=htT%(y`7Cg(-)9-USPtTFZ?x6}VZVOE+qglcK2Z(%iC~+HeX%3Yf zL_d`APqVnoYv^45=YYg4qI;W&VNjV$;T>fFF#3DZz7P4^x`5CVnW-5JCqZR;@gp3- zzqmwH1nKHTI-JGk(ZhNu7Q-EKvFc&)GPtDErV?)1O?%f$ZtKmTF=GRGqy=5PCW=F?|>>0DilpBFlS pB0nCBv*+sm_}~BX|AccH49`zXF?l|@?h3Sk!PC{xWt~$(69C(@Oq>7! literal 0 HcmV?d00001 diff --git a/src/Icons/flags/united_kingdom.png b/src/Icons/flags/united_kingdom.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf47c1ee7c729c486f857a10411190b49f2d43e GIT binary patch literal 1038 zcmV+p1o8WcP)B+ zpU->m_xHWG7%hKN&3OLJNDqqT*a}^&(nOQi(oK7K;Hiki;kdA zUqQo*t10`ni){Sl?|qr1;$ptNe23O!GC#W~&`x-7GvQ4oXb9l+&r!8T$NCGMtTqqu zQn?*d_H%TcyMd6F)CftUcH>H1;c=>hK^)aZgj0?5Vdncb5AA2&^!4-uVYDts9*Uyk zyB9(>m$0eYPGF!N|FwSB9>~YJqh(pZuyWZ>M=N-c#r=? z=a(0myBok+U`3JyA|T6Z97gkCXo#`x+X1khIDyV?k7o@r>?nv4sH#d-QBlRB9cnZR zs)|MuMCOBp#>N0hvf0q+Qyw}eX(WVLinr)p3~?M;0qq~}2yrd}TBDRgzTqxg@0LE_w9#>Fzub?h9 zGlj0>6wav!$jj~Y^xX#L(3&k)id8zyjP993EB zB~?-QuH8+~55KVQ^-6Z`ewGaD2*s11QMNLb-XuNA{se~nnTXcb^Xjf$WrQwW;MSo- zXjWvL zm1}HNMHq&kIlJ4v^z3f8E$wbE+Z!pjluIlDDn(G*Pz)s!gT|mgzzdPY;5D&{A^spl zqb7#L3neBRjkf?oKp>?=4T6x08Usj>2u*DZ?Xv7{yY23obH*P{*WGFab&~lpGw=80 zoo~LG5lSg;r~R~E-yXj<>c23`*2jC4yp>+Nm0(w+u>Z0#{OODpYdeBY9&XUt^VwqI z|6kz!%Y?sWVfFFp%kEvTIh+6#IcTqO^W}jiQT3m|-77`7ac;tk)`5}e+B+_m6$(gM)*W&eZy>I8e|G&8l`EDNsVq}W+;yXT}#F4+XA0iEn4dW z9P(+YO62$i)JTCe(46`1Y^~cyS;)!9$D75bsT`4A6+gF&wN-vTaNF@AG;B2sAwK{X z-0bZo8Hr&V`TZ~M3=5-wj29OlQ?F0X*|P;De&?e;-R8?o44g*=${6f7iOy<8n-{{< zy_-VYKu*p9hh=9YkO5~L@4MUOYnd0is=FNplZ&R!%hdr3vwbVoZ4V)Yp!Z}K*83e) z6(n%PuKelRRO&>Zx^qRBbt=bkU2SE%URIfbrkp{3yF7&c^edFjnvW0yfN)a_1ECr& zz4IL5+S%ywa}$<9l$(iGAQxO%UbUQp5Fm&e0s3!@5`6Y;&hCAe6Nf&hx+YA(=VR!? zX=bimhvWI(T>j`)N&^9cjzKUbZZmNY@Ny;F}b5T^FQEqwjj zQ=IBP2qiOd`3lG{4w62147V$fRonOA%J(wx)qecHo~F7kKzyiQ9zWbwvF`BjH9NrU zB}V!z_5QBJs)oGEh-AF1v-UNioK0uPTz(%f}5Y*atz3TEz3em ziD{Y`hB0yahJmJOSeAuSDo5Mh-Th2S=jNmL^{Df9fOS3UTt`R8a5Ngl>-FY{V?%=+ zedz&=w1Kq15O&tTc`!#aX<%ezU>UBIGxT&G#a(sZnu^lkRBgrdVwUB7WmvY z24g8q)5J8*9B@1yClZN#Kgr9y72CFLlgVUKN-4?imSy30Y3ObZPoBWq*$ 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/log.png b/src/Icons/log.png new file mode 100644 index 0000000000000000000000000000000000000000..112c58ca11d1c13fafa5bb9c7bf018ad84f76a5b GIT binary patch literal 846 zcmV-U1F`&xP){HsKifI7G}hf1&I|TwuqIHfsu)^0)ePN zDng*pfq@pWl&V8oKqeCEj|!@O6>$h9m`#-F&uj8b*_rhxB{ukN#cV=Hb`y8d>ke-Jz zav!Ob4NPHroRx)1Zd}_TUitXy_Zts?URzr`NJ@odbmC-nq&7XxXgNhq83ZM$;-k{b zBfVVd`$$#*S3be&*!bD^UV7#8sfm-%IyHRox#ojNdjKJT8bpPD-zZrEW{7~L#z7nA z9#key-M_o!_q)0CQDgAA_6C7=A3_`gRAJCpe3F7ek_f)F%c*NW^6-y4hnHHd4;Q_^ z=gbJv=X#h&_C06>v!Rc2g@S>A_H*LpZ_%q8_$A+O^$UMvkf;%2@H+4T5l94FGIUfU z8U%&>`Y-5rU$eRJBDM3+ltznEH6RJ9!TVf83}mTLc2Funxc~`Jy7p!CgWwA*baKl%g-r^#=-LM4+L2F@T_ z407?2%9(Adh2~=s`KP`o48_0Dy4KBz#Zkb^-!~c;y>6{+}zs81r@HsD>0000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+ YQe|Oed2z{QJOBUy07*qoM6N<$f-(?)`v3p{ literal 0 HcmV?d00001 diff --git a/src/Icons/proxy.png b/src/Icons/proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fef42332fb774df858d5702ded7c509480ae76 GIT binary patch literal 1500 zcmV<21ta>2P)UYkg`Rq)oiP+4Slz%>DOBTzSU=i z1VLbBWd}3%?=L@}nVF`;aUm8Q9GEmXXfY)wCgwOCjslEfiS=H`bzUz(TqCR0$5`*BiIoX+d@Vl3+hub1O(HhZ4IkX|K|NdW8X z>u)89fPn1mtOMQMy&kvQ#j`969LJ&fcwMeuA6xLeI5jn4lTN4E?)7pQ%d+5hyWru& zUM?qRa~X~cB=_#!@4(vH+J3lsv%{2;k)|FWe}WGT4EwxZ4m=(f0s_Qh9LEgLi!lsK z7K=qB%d+70a$q(OElo^Jq3rC9%Inu#drhVr-{B7)+@6$5Wwmi}+N^{GE!EL+cS<7J z9*yHTxLmB?;c###Pky16O6k`Z7w0jnb)?zjVI5AVb15*86s@eRKzsWgdt#!FvfJmE zjYi{z;o*TE0RZsB!>y5E(5J;h5Px=x%Ciei#%K>@^tDKG14a2cn}@ zI~j&4wA&r_`}ez8kw_dG6hsC{Bs3|LNkvBE)fS`i=g$GaEqFQ|&oIhKwOXC4R5A*l z2UuSAuPBv_$Y4m@NKr%t$9XWne;Jd@rA$mrbgEP;At;KZNRkwhB!P{Lj83++w0t%? zI?@XOfUmvV;^N}0P$-;62*vX}4+@2xV3-hMb#)aM78aMR)=?{t<}Hva;~}{KDN@ZA^(+ERy_v5P;_q-`{VUYHt4RLQ6}_ zmyaL!H@IBx>3{$tS}qTfU>G2TFhB@_K!9Uzw|BI&v*Qr}tfIQQ`mLd%vg-Bg)kS{) zvViB|pNiR8o3pm|?E6OJFZBShvQ~5C$nkBZrF-k;a+&g(Vi1W$E4{t_*9Ha#zr{mC zC8v^;^>6t7ene3eI2=x%Bnc!E;lQ$>Z{;U)LASET$PEmn=nxC)(^wWqxN?cJG~hRtDN5(PyC(s1tF`73pG=iBz| zDLX(>!72d2006J9{&2_8(8%1>)Qs)KiR!$y+B0Xq%AT9E&6v#=cUf7*Q2-zT0MWE8 zq_VQA_~OOO#=-E`aM>JvrCng zhfZObFyKWO1^*)ERjQ~Vk|e^lTFoY*5DzvQn_3$hE}nKcY>V)JIehqNN_TfpS9|;I z;hj5+b_fIl1h0y!s$;wM?W;Hr0AhH>2%oOjOYs*#he6*TWP+;z0000_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/qbittorrent22.png b/src/Icons/qbittorrent22.png new file mode 100644 index 0000000000000000000000000000000000000000..f0aa537bb565153e42f693f230700153c879c4c4 GIT binary patch literal 2084 zcmZuyYltLQ89i0Es;jH2AJg5_y*;n&xNK&3X0ry(YBp*#ksUXi;3h$lkKKHxlJLjt(K6LhU-Ws<6r9>S5k%vSl;;ed}*ef04J$;}4uZg+zXS^UvS^ zlq2Rd_nrF=U{_>Q@bWL~95kLg^YwY-vN2gXJpSt6pLmEPe?4>R-fx~PDZew$xynB- z54Z|Y5TjtXC5XSK&r>=79w1kmY zN`(Z~)nw#QSuEIwxYg8RWORWbh*B`Z?tjxh>42)L=^DpR@a{?<_Z}@q8BOhRYKCx) zlnQyu@q+pXq2Sitz7IVI3>+8a`D5S|H-WAR6!LaD=lKCoB1n^lTZ$^)Slku&%$AI- zroKbq!~(N;!!VCc*%juas(o(Cm~#E-2X9{5M%9k7-3lS2k*5zMQo*QA(?~Z`7(^T===EJR z+C5lOr9As!=p(QB_}9h%Vs_$KF;SFttz@Z}7dAS%t1D}$%pHKp~-4OrcV=)BehO3)}5J+RY}eYz&m+Q#MpTjNks1Tex`XI#yP9pc^K_M4<16=nXu^42)GtN5{e2?=53>a~HFR>L}(d^m-01T;E2N zz}F~xtvhhxvsbBB@WHipoWHmTL5<0y+xa{fD%fiFVUZGroWAqk3f{V~{4vL36;C{T z7pBK6>E>IFE__C!dXXwx+&xh=0;pJ7YrqW>J_{N^OP_ap9&R)TXmzL*QbQG{^YRpp zJr`@+9jZfzOX+!jh%ios#?(`mB0a7Iq}$M=vxY%{PH%|gbXbqA(ea?^jF{XvcZUeL zamVq{cYJsO*AuYs(m<4;^peITJK3y}k-Is51j973z3WjCTXG)2*vpl-cl=Sw3wy#Dr5 z%GLarkEh4`&$Ue~t+o-wG)E?jRxiMZTYZdI3;6D%cc!lMNcaoCTEP1sc5(946F4-M zmr0K#6~DN9w)EoC#;Dk8uj6Nbyg(=E2!oJP>fqategWNKj77S#KAOXmKl(TJ20qGp z1I3&{?p^e~2r~yOm>esinm2s9QPZ-z`U-2r^V9WWZoBO;X$sc1x^S8CFwvoDEGIHy zy%>Xl>Y*b^Gr@c)?SK;0FJZw`x&-pKDuU&B#=Z~6$yXT5gE~^w{f(T8g zZXK$^!~08ZCeEiLvtY`>l96g$*Hj6D(UOT1b2Z%lsUq$#=8Ub~a#q)MCcktViM%B4j~5ZTBG*rcmgw#liDr|+MJWvD)j&$p7{|~SP-@oRMm^*Qjm~`PF2xE&iB_nCzTO#6ZkkM5qBNUBw`ZGUy l`L~U;-#CX+EBOTYj#uCPzWs=JP~x4LKYQvgUw!PQ{{cK|=1~9u literal 0 HcmV?d00001 diff --git a/src/Icons/qbittorrent32.png b/src/Icons/qbittorrent32.png new file mode 100644 index 0000000000000000000000000000000000000000..c831846601487ffd1258919fe865b462697005b4 GIT binary patch literal 2615 zcmV-73dr?|P)(RCwBy zSLu&kWgULbIq%u-J?Gv#cjnHWnRcc#ZDB~o)QA!=K|+Y6;1b{i0Yh+!af{m@;0I&) zpdZy>qG(Js#u(9rMPk7S*j5D!0STqG`^)p>?&g%2Ncc#?PR=t@scX{9Q{+{3S zdw$E&{&XzB_ABF+*Fuc>0;9f-EbKtfVjMnl1b5y2DLYA$ecdqq$RN({NK(w}x>n&W zW|Czcp=--|+c@gk`a#Fk-{9{{_#a;4nyXm`UDwCG^3(&TR(oGelJv%$t!ut*V1yuT zp{s3Sl9fAyWTqa(w=C6@uj!iBm@1i1l=I@3{CwzICbX+DQ1&gjdi3eVjsBzSU2|@- zBrrGb!V=mwF-J*;h0Ot$8zFqh$mS}}4~nkwJua;G({$_Ozz8Yx$R6D&$iyBeO-Of`ECjWNv7e2ck0lD!1d#9 zu(#^mt84i4dql{4w1R~nw>!N9=hphTeP5XwkRa&Aq<0H|(q;A^B9-2Hc^8gtBIx$j zrO|=}Am1HJVBe&Jzn*AG(dHS(U(Al#xA5)@mjK8kT_d|MjpHwzUg=_2C5M6)qtyvP z!pG7T*zgaDq2U)=23Z!3MY4)(T zvW)6%3C&KA-Xs_;7a3by9Udn!YV{Ue+k(yO!t$yLj}&MaC2CK%7piR8v#Sc9tjJfu z-xgNtyuVBDUA%eb0%m6>vD(r=oMiiI%@%^7OOK0?=grRUBx7({r(zw(GBhzm6=2UyMH#A; zeVkj~#M>vA6&scERErQy)h?av4+wfNAQ;ydRBCxBCJK%5 zB(nsP&_JMo*p8)g-ga%&+kHj7)WKRUP=b@;*k&N&TF%R3v(~<(i;#Qj1S$crY?0+m z*^=4AlWduW=CFiIt_{|22_i$#Pe@V1IA%)8tF^AG1r)40SguLddJ;f91khj#)|!2S zcCfnHQlgU#g{;gFstiU}__Tt9QM1(SAk!%!OGUr#3u%NFBnS&llari|*S zR?DC^(d@?bEK*mSpCtjZ%e8w6z31Vie7g?x!W8R`0jp?8t?1ZjQA5JSRK@4LA>KM$ zM^2V)7AA|fSP5G?2Miim+?M%euG9M?0?@Z=J!ldgr;I+f`IP7=VtgUCNd)= zGp1$pV8*yL6yf-YhjPisndLT?*1PoF#aHgX37%`==_6;+2omI72RYi2wsMxXAQEWL z5y02w=A!T5%!LO2@#Z4#`0y+q_{4`8%RqTO#=~pPF7*(p(p)U$6_8Vlb!^E3_uhUT z4%|A2x6f>R6KYQjlJClhLK^Hum1cx2INb_PUkD}AW^X6;z14=^#B$4hUl;)xf}sWg;L%g62r5lzbOstcvA=gNiSnWQjSeMof-wkFz~KQY{w@+0FRJ+|IDk=rL~Wh@5H+VIg7l z+s^MO)z#sxURyDeB)aO5R5k)iB4CEdis*Yej1*+Mc2OBEpgNjErC?*s6F-s_OAHUg z->J&Sszvh~ol1$tB9*_XajMCoq|fw<(pUj7wi-=L0C8p@jkRI9zBJ`(Y6jp?%T6jt zxrLFUgQCBUTG+mjpk4{(H|TyS-&-OKQBjXDZ&zCxY_8l`3%^2 zBGoIBBvYxjHHovN>YNK@Jux|WSjzJPLA-xT$28+!527ZAoJR_-{pwX8&9tE&{@8(W zU%8+?Zkzh9T+KkP)kiTWA2jmJkeIDIQq^x;kdh7Mxg%I;IDYZncgcdS;il`#a+*3u z(4S{}emUEo->>vwa`__~&z#8_*>|-p`Am~#c!MC?G~OpoG6SL{+X?|x2xL={Pfn6C zK9ZsAG5(%`bH`qJtlg-6=i~Q3u+iY~a>JCT0AKUrR2znNp%ZJLwRG`^qHlb;m^bh0 z_G2SpgXobane&nX8GBtBXSietY#n?`4hib%K@|P;`Ir9o+;!6xHH`eo002ovPDHLkV1j*85qkgt literal 0 HcmV?d00001 diff --git a/src/Icons/skin/add.png b/src/Icons/skin/add.png new file mode 100644 index 0000000000000000000000000000000000000000..2156ec62c76ec22a91f2695608f4bdcf0bc28a02 GIT binary patch literal 496 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 O0000@kZ*!mFoHJu*9V=?YL?<)r`S+af z|Ne9NR*T~p4{|+s`t`lKVLYzu#xbSqhoEV@0Ii(7jcbVG*(eOJgkf+o41y2eIQ{(e zgZS0H2*C3%zwv}=TF)xOdN8 zn0a6TwCkrbR_>>oX`NKcf~FfVGbV-yix}!JV5ql%ot$ z3UqK{2M&x4$@}_x1IH$Jcx8QqU@434!804JQBxyfgq!OrpkMk{@2IX;3&!`C0(h2dPXwnRrCQYF-zZTMkC zK_da+hOq?ayPMueEBzQL4T?`?kY%zbIo6gV;8L^l-M>>tz5)WE2<_yaohTQ(&}_AF zX#d05Q{0+7>tyeoeV^KahE}r$U00y~AVa^?M=MohLxXz{2DBBe!ozhKMnG9?%Mx)WdXIKBbCAjbV(CT#*v4&fhKfpJSj^puz zJMi>Z_TaluPU3stIu6%$@#Y`SlaB~li+68AN|}69oC?QeUwRFty=FG|OJ(Hxlu6tg zmMk8iQfs%GlsgWtUHBtBDyu@FfSH+DIxbUoJ}@wV6DLlfySp161)QIshi%(fUS7uB z=a*3)en?6<(o8I_+Y~O6MwL`cRC)I=e>-Pzd*u$NNry9~*=W$Q+NSbpt|Gj1NrJuo z`?v94-+MT4U_ZLLp1|PXAa38jEnpPogY7tIHk-6o;rjJiT)TD+hYshlx=IP%W6IwN zjWEEaNyjzDu?^|%X@}FOtTZjT*V`eK8zQt_jE|4w@ZrN)TB6#XzD7ru!Ppp80v*HR z;-Zuz_lK#eDU?bju_H&0plN$>^bisGLfS!N0+Pfsz_E>Fuqb)SJ7J^@zzsrpHX)_D z@;ncHeSH`i8Ntz`M=>!mA+&d1K^V$=gBlbwA>h_)SkpXMW<)+U3eF&Svk4HLVjIa+ zOM5%hw9)5d0ud?%PACb*JI&>Cl9V$uGvMmsoLF01L$O%I+}s@c`}^h2Ab5S<4&fU* z^$v|9s5G#Kjd%oNmy(gHr45x|YO&m6GJ~l0VhawPFSD?)upoh3trkMsaYQ9nq(pQn zQSXpGS>1O`l3CdtRIU#ZO*uB+A>S*N3MhF{ zE|p~hmWE35cdiNs#>d5G4%A zm&GA7K_^M~L>LVXB}0pIg7Ybco+e)`KADxxSnM^5XBEq+M9D-VB&1oyiMWUe5LZM< zjdCz=>`QZ&1a2s93$SfD{dv8sb25fsTg~F^hI+ zYyrRwFa^v2(p>0dK&EAz4k43GW!c8=slBs*ve5UYIJQcrn|qc8WE?O6k6zM3UL3KM zaxqt3-p&AUw+gD;8JN8_FW(Kx9|w-&g`sED8k*Y##%a}2 zUt2`8-avI}eRG$>KpZDIa1R5VCoAw zb0k*LNzPENyfBCaNQN5HJAeKN#}6;yOZ)d?d~5_mrLvUij^SbH{axKXn7MunpMExt z3!hFS(^HYaq3@)uwxBV?ad6J1SoasDR{mA0zGGZ^tc-YSwHj+^uF;NG7SL|4!>8SF ze((uizqY1FhW%|7!!-Y*5Nux;= zII$5hI8V;n_eiX|w&as(QXg^ck8gZ_<+tb0{^osF_o+ExZOf97jJH@I*zwzzC%IMeV=UG9f1d9k(wgziQV=Djw;R^_^b#BCz*sZ1N&5!=|_rLz>=Jb`T zv~-PZHPy5&GP{!j2Ep2w+ugv%ec$9`kL}#OZ?ae(*+t2iW5tyGI87!iaQC+e;-sDX zj%_d3=4NltT)lMl(uE83hU<8#RSP9@;TF*;^bM>FzD| zX1ltxR=!J+xOOvg8V#qhzOr6lS)5y#zj=w`|ASuLB)gLaY@|W`SO!9J{ZD`a0JQK6 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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 R<{|(9002ovPDHLkV1n5)vc&)Z literal 0 HcmV?d00001 diff --git a/src/Icons/skin/downloading.png b/src/Icons/skin/downloading.png new file mode 100644 index 0000000000000000000000000000000000000000..e54418cf6a591c58256111a9df9c9dbed323d9a1 GIT binary patch literal 463 zcmV;=0WkiFP)uZM2hh#T)O39`6P@JqD=xK6*mh^!DqkzB?bT zGYGH=V#OdikQ$)oO}J8G<<*xLPQL&3mVqDWTx1Lq1IdBZ;7iKC{{889;1cB8m!?ne~XMln4Y{ zAAfkzvGw7q3Q#11*g(x&iOx(=P=Dm%UMCnEmm+`w0|0Z@nvhhSy*dB@002ovPDHLk 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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 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 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 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 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 SX`1K&00006UB& literal 0 HcmV?d00001 diff --git a/src/Icons/skin/remove.png b/src/Icons/skin/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..702ec89432c4186b6dec96366c46936eae6f7706 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i(@sf{*Z9r zu4~Ww2TzVHkQ8D{Irx=4H@7cU+1Nw%+)78&qol`;+0Jko7 A5C8xG literal 0 HcmV?d00001 diff --git a/src/Icons/skin/search.png b/src/Icons/skin/search.png new file mode 100644 index 0000000000000000000000000000000000000000..985d08d69a8cd342aa5d5402655861d8ef888d8c GIT binary patch literal 1130 zcmV-w1eN=VP)zzS|6+z5b{(+M4=B}KorEj zv{kVvqSY6{hYE_Qq#{;L3ZXR7khEpjOtbfy%2`(GLy-GiQGD zKj-|>3oUYg--yxr-VkM<6o+m_jJ>h%Y2 zKEL)o>Yo%3?A&v}69_-)k9NC)u|&}A4?>&6g|wDRE0Vy-LWz~dvf=P}zZ$;xi7zqy zn@z!~kvk7Y5~=gQQCw>ZZ_!}xLM z15cg!8*T|EO2hHq1LOBRWV>%HliuDJ^>0+wnF~ef#l>PB_`FNC!1P$q zYd?DIT{Jk*&#bDtwmw8f(^eH-BYD0^40<~wZ1LiJ#@ZDWmG*~YP1fcJ3k^-HH#H7I z#8%{Xdu`eWM-MwLE$8T$-aMk#6wP2*4tRrGjJi-7vQ!L^d4o5!wZ(8;$6~RrNUCPk zBneE6q0>+DFV~1 z@nVxL)zmfurstWLkCfdV0d#2pc-QdWM{D;#{p@O`z;pYad!xjQicV1!AXaRvGO`3y zfUdRG28Soy&>`%sW5qV72Rgb2Wk6HFABpLFp$u`0V56x~<$7B)AOyr+#NYS>qID~1 zYFVxp9N3p8g6MJ$c-l0dy+ALVJ;O=mJm&~@wKM}Ev9v-20Fs9=oGcCJaFwmWra327 z@=m?otQmTnN5}+rw-Gml zKQ#Sk=xVux&H7{&zD8XZ_E#47QyfYww%mA@z~%}nXC zP@G(vIkm*B2aEZf;PwSlc!+(T&S;)xITyYyh_H$UT8 zE&Tre()836;V>3k`f#mMcpewCK>lXy;xFGFzhZ)QP#mA);BfHap5#w~XtymC@1x1m5PxGU>cllh$ zzS>>aLTzjA9mhRCOxB!iBv~Hfb7D#29x`YIjqgcMH~L8tsBzg_SK`B~&0=0xkTbFw w^xuMCwSY4J1vrgE`V0Er22Qzd@E-yU062ch|60M?&j0`b07*qoM6N<$f&@?`kpKVy 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/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/url.png b/src/Icons/skin/url.png new file mode 100644 index 0000000000000000000000000000000000000000..3995aab8ae1d88ec7ddefc35ddf0337a3134debc GIT binary patch literal 2509 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 X6F@qbbMf9M00000NkvXXu0mjfL|?;5 literal 0 HcmV?d00001 diff --git a/src/Icons/smile.png b/src/Icons/smile.png new file mode 100644 index 0000000000000000000000000000000000000000..981b7d915d23798a88c70808e08205a0075f04c2 GIT binary patch literal 770 zcmV+d1O5DoP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3D&+D3*=RHj+3VXs-??A7-vB&>sDsr3Sl9r79p(bu9|0&- zeQlis09XKA005wmSvmobDcQN(*aPgkF)LX2%YX;~_J21V%nSz?bH~BO!~NIr@bUiB z@bL)<2nh)AiHL}aiHIKjpA8EK2L}%qj|d;1h?Inggp`~N)5yvH^P&GeJovAt|8w7e zKizi&C`IgdR0PjFlk=xIsKZ1Hrt6fUHYuEj zgK|D@0U@FFx&-;^oZsh+U`TzC-@eB7h=si1F z<$#VsI$<_j&9)VfcXF6Wx-H{e%S{XHi}Gc+ObR4CuENi*(5uEK?uGiQ$ef zDjxXk)Vim$xrFJYv(8s z=b}I%LqoS+@=JZZE#w%nJicsFV>J~%HtaNCX{nAVJ*tmD_d41){)A8haJFg6$~sIN zr%gC;vWP0*4h%g;M<*4pDtZ!c6!Bt{+QD^82d16g&1bA=9PQzZnfLo7VQuPHz0ymq zZ<7@I4h#4w|*qGug&(Xj=6;q^Y?jXHL zdrk@R6>T%1@R;;RsRl??lp#Gu%_RkDzxE5V>&kd6enrVz?NpgvIqk=1O8zQOKjE$| z6v6Au#xIGqc(mBasiCduxm9G=u6TG>8dv(qIg`&R^|`Xh4E5XUL(nNdN9Sxfc`9Ti zTic8OYn7cy+O<0F2T@b~&Phm6EcV8q3W-+76bJs;x)*a2Gcup^Xt2T@9JHNZ9}Ve1 z0$Nh?w~^c&=1_#MPCg#+1^x&h*V0y`t68j{!&1MvL35eVw8Qh)M}ND-ZR-~YY<0eU zW#;vqHT;qzo00FT4{aB8*JUP+v_RFq7FQ|@$+K&yRmz3aYZqw!~AvzxwzYt>gK~?)5 z;qRTx@r!*Z5Z{3>Ay0T%3vE>(`ne;9eH!ghu_C0)n?g^WPAt0Kz6Yj1gScKbOjNyJ z@r?RI_^x==`px_XRP(?9;5CmHa0U9U6s3dGMp;5O8(IpvVprzR2DAIWt=UL=8eDc< zdYz00Xn964YY9Z;wJd#>jWuu4gt`Yyf9&k+Xf%(5r_9Xls(hTy_UN0CygOYsD;m-z z0L4tG)dg2aGa#TZ{oadWXJ4a#jWmdX)ThgQ4#@j*aizZp&b>3Gv4<=kK z$k1smoB9=6nChJRBL>~X8aKeW-xe9gPE9(~2kPNKXF4LdM!oy|9rl;kp5s1l?V5F4ymo#;;o0s9LA^*ox-@CHpzRvn)KLgD|8vn{mcxU?PJ>S*Lya1j*Y zkfR-PwnFL}-BFIYb=MP1g0e=`O_e_e;$`EFTHdqJU-gw0dbEr3|K@< zM%vX8e}g3VDGn7s7BKb8Vt4 zr=sQVb(z0&&6n-kojJqJSd>H$*dnDjkDb%d3(&W8bZjQZLUS>zKH+6KP=hfh`E~T! zBgcT>rs_L3*7;f)?2Rq3X?eA-?|dk}wXVozE(9 z(HZ<~QMS*spJi!9^2?uX^OWTQzf^Ebdep&hkt|G&--~HVD&a<1TA+N6|2C)pKblj9@30ie;cf84 z#wjJ)mx_B}gEftEbI_w_lQ#bcFXHad-#oyl%DH*g!=%AxHR^PjUhC0*Qs@bS+4{9? zO@PJ6v#-bsBV(opNqEa3=T|<(A+3rcsH%p9L^8D<{QTb>eh&bea#SW%`|{D?it^5jCrq zH?Ik5jMbTvbmHv$3fsk;0DjBF>vK+Zv4IM{5 zqd7KAu9v(O}v8FqpO;`_fLehN$* zztE1c;;QcEWjmNFsw4Zb$HFAK+F3`P{{Ve_y=>JMIQ zq!46N5m1+e48^UiOx)sGhwen0bY1=m;Cmb<`10qrQ*e0(j{C@f_NgS3TbdxJjTP2`!o4WuN8| zwZ<_1sM2gCFZRO%O&q1ZpEM&Yt&lBOgXZKqJk4^OXE!+x+ypUZ5F-awle)|SEkVun zB2?p(`4l9cP!CU7T}xG*NLnRWP4cjwk2?(+@Ss;K?Bl5(Fn#%?nV+5x_d|x`>5w7W zsNr8tO@te5Ua0h&ys}n$6}Lh;MkI6#f;(FRAL_+^6GH4dIOj2Dp6NE^fvx;dRLDa8 z>&9a<>gq$SkN1FUwWq(ox{rNn&KfUlIsMRk=NXw`Zl0-Ub9O9PrY*%+l#(WwnSMMC zW{2n%hRrRjAGa!e_cf_BEYal#w+svTC;JueXN&n|aV?ryj1_Geok>ZuE1bXh@j4?w zv5Jk#23wP^>BN6_z3$P{Y+CwLQQ}Y?+ zkQO0=seM>0_Da8+>y$I>=9`Z#-|+#S5h~X77k9Z>#WuNX34Mzc`t~)|6sN0R=$OE} zC~4u_CTv=$23}Hl9_)$xz!m>e)nfSjU7eVnHNg+?}no#p}iOHKd zn~iX!=x2*GfL!}m!84=k6BdT}rtvQ4f-5@o;j-l13wpJG@xcFw0t5Bq4Wf}Yp~IXR z7qi9v_(+zS1C&YLXH@Xwua6(=lz2J}nxUQCA0sJj>E9bc(~xBlHXz4#ia!8Q2}M3g zj?{^ZUhW)GeHRMyS!jBcqU_@CYqF5KSmK_V9q6@25z_E#epSFUS+>b)j}=_ypRsM+ zvUzuGnQCgFZrt{tnGwjiZR`D==fAagp<5HDw>E!ymQ6Vfl9&S4M{1^>_6ylsZtel; zR^M1%EoeA|RBl~vawCG9eBRnUpB%jx9l zakVSypX97m&eW3-ip#kaRhop6)WKiTPYG|FIW+smmfakXLTuqjkwl(KCp`vj%R6qe zC6JjF#EhU8x2tKZ$<%I~RCZwEmho?mWs^eXqbkp<-*+-0smGPWk1|wm%kZ4puL!7| zd2gISnuQKE>re78>HnruI(I$Xd56mH$Bsx~mm)CyGHfB39own%tb2N8rC>T z;I=Xv++Uvwa%)1{^0T~#jpV_+FslBP6gQ}u!g0;Oe0k;f!3^;YQNl;X4_r+CX3}d3 zf#j_E@+w1#V-22p0qB}R8S=U{bh84Y91hQ=KqB!-gJEG9E&H(i8FA!M0dmFMZ+2Nn zwvrg#@}U6L63s3owVzwx8`B^4lo(Vv_yxlVZb;OVXPfF(GuI)%Y zv15XefX$I~u!jZ2Da6B)T;}nhDTs`<%Am;PS%82owvZG%4=W8plq%!RjbKJS!@#eyrwu8aZRCwJv$W`)T)&F4rj zA}7X{%S7MAfZ*?w`Yt2y-EvTp0x1<9tqkyU-%Sn0T2ZP~(yB_>;-i68c3ml&IZ-6< z3t0LP?)4#%MgURsLN^01HFsjveqq|%aC;z_Smksz<#4hw*&YanzGaJ7q9I-}EQfSP zpoiS;>udVd^ucXEyEU-X33p3mGwW<{!SjvW?gDB=+s?uCfQ=sb1!Y`)z@^Q%e*x6*u?9 zYEz0uu48^K`}Rv0+Yb3Qmi1?rsqyLKmLB>_2(4HO@*J{D)=MTV4Z2;cwYF9bzfYuI z)am&>Oyp^6F!v)N?a%ET>eWtDgiXc7+fnK@!Av#Lolrp971pzt)OuvoV2PsXZHH3T zG310+S5%FwO6)f1p%(J*&U!CgjgDPE9G3fo?2e%f<%Jgk)Aq;XyV74@rD4n!?zDB~ zfP-tEuJW`h&!Wx^47h?yvf-djEj#`5<~v`ESXYR{*nHPV_&wvIL3#@nnE=N#lak z4?Vomj2f>CVU4HE-#gME2}ffjnMpjFnp+Fl-8AzzfzE$ykJQo4<2kRhr4sJ}-^HHZ z1SQrOUS8eCB$W$?9Y zdssB`db;uq4<*-#l(>4mq`Qz6_{5{zpAD)J{X6ni-NCrM%04DR&Aa1v4oPhvIOmV# zU!65lg{l(x7>}BA*xCmoeGHP!XW>&&%IoV24$x4-&n;-!`)9kw+WL!6;}c|IWJSSc zcaWJ*QqdZGm&I&bUDZ83;sR08rW0S}qeXaUm$#H$>@J&Iw;b^9Ayd53;C&{7>gFn!G|$wsGWi*Qpo*DnQ%jRzKTVY#k~cF& zPgKW;QVZ8kV@3&6=~SjFaX?5f;SYj0}bVz2u&y-(xf@h z!>eXJ$lIbu193_?uMQrO^WrH6gKC(363NnV zB=Q*C&-5v6o8~p_jdUXm%3W4bZ%CkCDOA7FX{s=a9te|cOFX4d^HT|Lsh0;UmJKL$ zgXQ@J{r9ZzN{lGOAL6Tj<_WUqW_YI{ce)HjhXGROv27{5Gob9zp4<9h2_%@hkb|F- zA_!;rDQ{&=A)_|&s;fCPuSUW?Ccc2P<2x5bv~yg?g4&KiW^M|~a6LC=q~cc@DrwhF zv)wjbS@ef+m++{}6AH73ee_j_GYT?56`^l*&t28ODyU2}0UZa+B@2B;z8Fx#<$Nnk z`$qUumh2wt8RmMBv%aryP!{}v;(90gG5|QenMO$t$WaX7ccX?xb!0>OHFQqE*V0B1 zWS-DYS8G?+MQ4{Z zcqOPPJYfB|s&$3x7-b4HM}I_Uxe97_;R!qprlaw1?u#;LeJl5hm0&2}-GsZo3^}d% zl1@ab9w*cr%xW7}!B@aw?_Ak2)ez6edW@|wZXwZK!NHF-!7`RjQv^Cf0gtmG0Qg8T z8}{{F4E~E)45wOSI2GF%ggwd{I%0QZtHEC2VrA8q2%ax{QkP(#W+rxPG(6bP=jZu* zPc6~UjgerCoHf1ad24EqwS|(v*lJOJBdT~ZeOa-dQISZKMNt6HS;|}slL?K~dp_hu zk2`dl`}!I^%Wcy7vF__ElW@f&`xsL!XG$it<1fX6^AY-^V5|Lii$@*co(1&hWK zv6fWwotE|>P+iaXW?JdG<2z+P76aB0OS|&B9y{5)2WWYJJ3THxt*fG1EvbXtG?`^w z3tEhST9P!PKbI(x5*Xt^zf&Q9ZjZGCC?!Y1w-S=SHMLAW$diY>N)uGH`|aYjr| zpWCa)zU?*07yom(-@#^l*08WO%IC_xq6}$EWOJsjDc!J(FFqCg_B%Lj zSehbzMNN<2+<`%MN5)2BagXE~mnSYRZ}5dJ@&IT~xjQ;AW>)N;Un{bPZ)?u%{!Fw% zxoQxYqy-2_rD`#`23LXIZ5ndx7)6$}B7!Shj6;{bFaZtkfWgt}`Qisur*1I{HpS%gxZ&%-Y86(9O>=%{E7KNy{8i96_?Yd?CpcI^y=|;- z<;Fl$cdu8TG@AP1gc|U%nn&g$UvL5XL~*jBqS07=;F3;Qk3|pP(Q;|zQB$-6fZ@Yf z+J$7T`=Z&Y<3~~0qus)BQwk`<-=<_5J1O}lUJ5#6HNsI^2`*B~BDBE!`Q!y^SHptG zp|f8ppVV)+2$ZC2JcpYq3E|2}_0_<~fAq~Iv0re+lw*Wxte$qg zUzuHJfUE_teK2@yUydKQdc?GTgpV$K1we}vin)eOGOYJq2Ni6nyF|e^*!hiNG95mH zgbhH>COe*4|2gx`m_mV%z5K>GI6w4>E;55-3tNZM;*2~`P3yFRomgGE{Qrnw7|H0= zztE+fLBbk_USjoSnn7RCsuJv(Q;P;ghK$rFiZ=0w?K<;5Q24r2E{e^Qtw>B-tw%zV z@`6;UQw|;zL$-y!b_-Fp5Ylcj6v&n~+p8G=+{Wk{mm}5_IA++EPPjW3aosATr#l4p zGH)JV4eqDZvpxcN;e=LqusU>xF=8e z1Lz0xO++GaamD|3xhVQv2cy@8z7%}zo~~Gzjxw`Cx3%} z6j8@t(I-iDjGo@&okX z(-nKYb7PrirshA)d%XT+hT}d65lLpjH7XEIK4;XVYnEUJpQW0YO&I#7R>(e#ur5Us zt!@&?R*}qF96oVW3|!+xr_u1$`)eCLtIwE%ZdRRWY99DLJ*xD)gN!=e9=G-XePAr` z8ROj)uQ0v_HY0-jmc^Raz^dp~MQ>C?x#f#+B+sa`U+j02E_cs2pRHJW-@h6=vZ+ff ze*W~tirCt2^2Ewo`kjNuUORflqTuP++fmb7Xd)v}BX6G=PzP}Qi;;X&2 z+RQ8Yu@G1j@4`vNA^q4$m4X^HluvIpYQ*-o6aK26J=rJ^v>&BvmK~1b0I8Xk)WWCp zjfTi&^W2}gf`+23j*max*+Y{4w7&~aBSsgVB=qYEKof7FfLeK zq_^J6L=y=Xu5=X$@jN-%)S){)J%MH3lKVlEMhs7X zER{BI^dH=NK*^{<**W){C~&O7 z4ZB4e^NdldVG^b?a)+n_g~)Jy96uFpa{trq1cze2`YPmOEzdhv305ze>+c-##Nm3f zb?j6Vp}aR%>7_$_-kI;on>nwp!H$lqlw)>_x~=Z5np_nXt7-DFehB5{F8W_aDLeg6a57U4|nm~vFJ0C=e zD-!^&lJB3RUY4vxc=>4PADMGgSt~`St$3N-14KH8z6ZRH7g1ul5&8To{zMZoa~|I< zFG;g2q#PI{nd+JoyHe-?s^QFE{3|I=(-Nm@77sS?<)Tb8eNhj?!YyA)pc(9Z<0z+# zDuEkW%B1RyzdirhqoPnCT5o;Ik0L64y5xA140h*ciR3!;z_7PsI9 zX{oEB!jTIo#YmjKhyD+h@)_dkJ3U!<9C;^f26f5I%2d-+`_z1&ub#6%4?U85!rxi{ zsiunRc9iGKsdRfg+2~jD(SEPn2jqT7M=#$dGY<9c$F=84CX<=4*GUl4YCoTKdHl>y z&`K&CyuX<>*(zU|Y0|&@$+>2*v7cANlg4VS{x#1*SgFXUb+pY>s&B<=h>xkvvuQ2S z4)7~M9i;2Lo-FNR;FI(o!GsMZ# z*q=%eu~>r`xp*aMa1$9O$)`hKy8?cl=aHKX$sgyjNKcY6z=SDeXTuKWOA(yrNi&?M zaey=3l1b38q>3+p_K@I9EtUMIz7y5?V^Krw5Cfq4_MvW*jYa|tD|I3?UW%Q7o*7zC znfdm!|9d8VO$DV8u4_C_BJdO_8P*`ayM5}YDnsWc43&P95-bRBQ0D^yRiC+b4DlEmRdXydE z!byqZJYZMhu26AS>T+=1P;-`<-g-euz?TchS|{?_5G)}j<^-t&zv^9kOBd)@a8dDB z-3>oY*EaO(yR*_81NM%gt}n%5r8(RC8N4ZV=SdmDCE~^Q!k^eRP3og-&m>+rz0t9r zG6izY3}=0RJKTl764G-VPby*UZ=oZ)$PM@%$E;m5;^Goi(5YtI(pcQGH+3raE3MMp zGbI0x=Nsjgfcue|wd|ssEKq|EuUPbi)+`$&e)HGO zHke*MqS7l?;q~PHrpO9^X>;ghSE}|hx1fQOB1-RhYp@~-(A;oWuEL3|v`0c6R-??% zr>zruR@<^tBFq; z>9>Qn*(CP~VvUk*kE?ZNx407`7(BH(kJ8K!b3z~-4E)T-n%`LeZ`~MKjloV z*a-I8xWLZmO_n1SsWxH1Ht?dYr^`()tH~)*MXMk_`Mjl4qAEL9_wb{Qvp81GQV;Fe zbV0ihRuk>dM}*`#N;gNjP1yScup{xv**lFnlxHa^L%jldG0q-9(bZ&#<%xodqP(m= z3*C~&7f+5ggrm#HdeM6AlIvQdVC>4gA@=IPlb^&VgEqlU_PB5C0#n>{zBpE3Z6O~K z%IH(eRLw*#Z#;-dU9SS_^f?0EN=ZoZ!h^C^ag3WCj78PVXT2rTZTn+%^9MYVLLRaZ zX0k79guIAQm1no@YQ*c zdYQpad+78;vE?TGRw#WEqBLj3^j#zHrK*`}X1f+*JGt#vbw&8+BHC zQ5z=YiT+?d_adfD*^4r8PUD36$JF`azOl(pzhq0V@POv*M9u=#BXyF1C?C@zKYzro1(iO zmu|OQOBGe2Z6&v(-&;o^z=*^TTvQf33^wBupbRa4`L!av_^u~KadFMI?jm*N&e7s_ zGeW9V$w<6&7H6{F;HNV0Q}pxCcyWvkpm24`rLk!RX-z-ec+@90mJH!sBS}vN!KU!< zN`5;YMHsZECLLVD`|9i1-jBSZ!p8>9enwWTEuL6qyp(mOrLhh$uMls&qWr$~lu$05 zQaNYtvpKjy4Z2lB{Y8;VYUr5#^BBG{w^vQ<+D4gSX>@ILjdX z0ji~$74gG7iBx9DV)Z5*6rlz#KyKEpD4`UvkE=&A7xqmqQW?idv6_I=RgqM;G4+RZ za>&eGn*s6>w}wkNkezrQqq!OkQJ-*UQ`Ww@W;>v}IKCJ!Y{C61x}AVL{f3hz*vb?Y&s+^Kddc8Ev zaf~LMWn8<9tqwDY9U7ALDcruCEoIk-B;Dl7%uy@`!lu~ut+T7FVuK2u>% z^gJIPoPC(vqi1k2-{+^ZJJMbe7P@nVel3tPy>rXt9au+u9EnX>pGE}2Wns$<;CEVE zdN_a#)^^)+U?^V{2{&p4Of&)xH*A{n@O}UFN7XPKG9(*q6Hxsh2KrzAD9PczqtiB? z67NtDLlo1{59ZnZ*3e%67UHK;<&d}lMwLdHzrccPE>v@l(gS9N`#zSym~@@PuOZKvIa0G?W3n(`}(q z-?8&meVukheLLz_v6Z5}SRiu!wIE+n1eVID^rdnXwW@zJ+k^pyk37rScrj_Sin)S@Pw4XZ$Q&Chh0?Xa5&b zw*xjhyv&X`U0L@4@~qk<7}ic8PklqF#fmH{x}|T21d@2lheXKbaCC`y?ten+`LeydRw7$TP)+_mAbHc^Y~oa;dFhPow4{o{qZWcp4TGvBw^GDhnE>1GBTvu&$yP)QTc8Y_K6_e zSHez7C5ebUG}(qyC}2I_AxaIH0my`pyvw7XKw-;n*T4B8E!Ug4PzJ6CDSLB8tgz!* z8h)}!v!rYWS8(tanS$kOXxXJnuXi)uDEotjjZ{bo?A!Ed0Ox!6v0mjiIxgPh;! zoa@q`o4=__uWoxk>S3k6-htnZAIkB1sTgwB$Y;QRq$Il%lCZrZAg*s9(~Q>+J<;OW zXCFRe(pxF(r`YG7vnQ-f;i#UjjCMqHGQ`HGM-MdGFkfZbXs z14c5dUSMIeI}@SL=0j~-^>K_rNe>R7Fh{BX*CexT!>1@_u8J!J;xxqUe%lT9_}jIz zt(v~;Smer4s(zdI%GBW6Ia1-`YVrgDt8dFH+%%s#{UTe~BRYcI)yh4rj(ltMsR6Nt zA}=*lORo!brj0cHbS7&*YI;+m;a?Dhse0od)p?n*s)rMG<#+Yk%k4o9d=HXzKBBEY zys=EkB^hyPLXs=^J)e;}R=vH|*pN}(LW_-SB^%GImto?~PoP_&w_W=Vir-QY@?d=( zqV<+tO>%?uw^8+`{M?dVM4c!(bA$Glo%MWO09jwKh;bk_f2R@%`)ZP6yZre0u*`8H zTA1Hc+7cGcBqWf6;#1#F?Mu;ZYTfuL{9U2K)?ThE2H%V6WYvDDDEP4RV*+_shcjN-IyfuKmB3N1`A=mA8BG zkRQud!G_-`DvuJsS-otRf0F7Xci>s-=nTZdUC)y)SRQ6kex;X{v$Pe^lr8JfvM~|$ z`PiA&^zCbUm*)6^u^}$pyQR-E%%2q&2Urxr=ZoD6kfk%0Unx6}lWTT67n;YJ`Zt2k zCM-E*D>DSD3Z6h*iV`(zR9fTd`_P98nWtfb6)%ppGb4Z=-rOK2?s@H&QD2oE5i0Yl z`k9cp*xzD)cal!O#q@`U@oLjFq=iNCWF>Jg$_-#5JR>EA8Wf7E&8A>A=j7q=5w#^!DJuK+<%1C8p_@7uprq9Y_Io7N zg3pf=$=P;Hrwj7qL^%`CiCNY1Z(=HdP>`}0qEXp(N6u-4qlk{#^Cht<+u4p0B!Yqr z$%_F|*svS(09DTHio`pria_rQ0A>VKV6YaND)S@)2v+QLUY>-rF@OdIz;ia@qL>dQ zZp_2Qa5#&v7Zx+GK4rN+Cf_RpNN8gFFV@FrcG{qy55@HV!Ta|A%J%<*vc-;-cJKtc zg!CJk(k3`8EEL`YA~HP^M|W!O0cT!aDRZCi0ei_SiFdf3B{4(t+iTTCS`*0c-M*B; z@cHG(apE;%hq#UwmlMwxM((_EQ+g)v0pB!qJAx&4_K0;#zU=zt%l1nQU1!9O^=Z!! zC^aec972}Cb*;GAUfI4+7D1DsS z=rE4=50jelGq-Zf0{4kD8Q6|dUQymkl0UhGj~u6!>E#>RdO5y9X@6cR7emLr)Xa<0R=*vH&t66sS1l27$0mP<> zS3wz5XTwHYN7wJ~0fTD>6n>Y3gD9iqG$gS0abIKj$XxFPpyV|0Rf$v&@SO7tk0xqt zR}X(W|9$W4`P`c(^e#ct`v^(&uVan4?LbT0;yU?VL1B<>K|wC7^#u0&@K%*z^v?*1=Q!J%d~LA z15kXd(wAqIQdh#wZ~D)~mKyjrYtvlUg>EQG37hxzDUj4pRNHYtf1?SlU z=-{E6F=$8;kJSP|fQ3TlL$Nzy7*@CA{f8yOTjt&Zs$Kvp;{U>V0dVsqr+ExG z4sf^)bn3_AhhWRhS87Ul7XWA!NfDFSa)(3MMo4a9$c`crVy*y-ACdInyCQL@z4-&# zNu2+5QdwB2FHoKN#eaj$Z)K=y`hCb-B~0xQGMP_%HB`SmKt3d4Qb4%aTYc~;FyS12 zIdmTT%^cx=nZ5iNp3|Ft3mwRf9hNlgf$+1~#~!)n27IKe*Kqr-)JnhdiTOCj$t1uE zu;N(8#VFf-VhIU7EBblF(UQ3=w7Mu%qT=dRs{uIq+raPeBkN>6m-%x#lkcr)=#`!D zH&8-RW?Z;5e+j1c#<|9^B7OFK&92k1^l-7W%=Mt%NWfM4lm1d93lU40nMj?Qs?AHM ziKaX1+UswbVjThmt%K|I21nA})IhXfa<7Sq6oPB*fwn7av`~h2DmVtl5 zdK%Xn`<$jC;6nKt~Iu>GmUp#Am266#HBtxI;tsHug`VWV|Uw9e}WuU zgIzXD^B!c{_=?iBQ{_3sQI+yWN;~No8G_LcV2+2|2W+=_KjHh087$doGy_~uvT|O zXG$K)|M^QZx&T^F-Tw6Wr_@V#owU}juyQk8@vsHFS8B<<*2ZNOG=B0oX--?Gsm{I7~Ngq%R_fpI}JCYtOpmWB%(vm2=# ziX5rNVt#>@{Q|230r2&Bu$~R*tpfBrDw3L)D~@0?ij4#qK zOC{UQT~g1Jq4)gpt3My-rC6v6hqKp(@V~5o@IPa=Vfhw*1NqIA^;|aX;l@>a*@IF( zsa?waof`2DEvWOOrrw{j7w_i0CAO{b)*I)8LSH4okn|>5B@OJth&@ZV@cb(Z=D#j4Mq8%qerkU!KUt7Yc zX8_eB%T}suepdAb)VRVu=kcPyy`@P_EdHfSq-}m(v|ZK2hV)S+*2&8R0HG4W8UV=g zhbqt<(QYJo_$s5&&j+Tl8l2rGIU&|dT5xA3hV|i8vXS7q!{R|!1@)ix=^+52ZiV820w}>+NIC@8;(~UICl&|w(&RKu2PRA|IUBEu?cv_2aO*x zx1*6D8KoAqoY^99+Ao z^v%15j~~iJri)IA1&Smim%i5bus{Z1U(=o(&cGS&kQ&F2-ADX>`W6OP_IJIt+8llE z4}X(^MsqEgMTfKu$0f#)g1u;kfBixY&aO`R4N^Cfo)EyJ+AZ~NUtOL#?aXeuOPTL1 zE|2x>vbeju(>)U3nE@{UQh>Rdq}I36otYA>W+x2|nP<$f0Ci>0%lQ$rg?(kJDbD-G zY1S!_7!YuZMVWL2?pBq3x^aRB4i+Vr7N1nsX|0U=6B!WvcTD%w5}t9KjOy+!*it^y zw{OW~X&{_*+Da-!xg(PQWjp5&xh5-6^Qu>nRV%r04oEIpQLXX`-b;#Mj#j7&2R{S@ zeAESF5J+`n;(A_})w=flTSk+k)Xz_*LS19{uj3T2^C8=c-v$wTZhrN%J2bHI8@f5( z-*f>F?pQdTe2?OAu{_dv1vQ2!GgD32ZM=L8986bY2a2OtT2XtVpyX+@gz3PRDt=fI zu( z(mWxVo|rtog1%C<-}H}P9TUZyH2qA#Pw3vaW<9Q^FSz)lNfKTU z)$nxn9a3i%N$M9qZ6E)fa^z7Mtmz8IZ>ydavf0c$OclQctKcs2p53I%zgIR$pRg0H zlDb{u9(komx78ygsA#0=TF6xJ-bV9DeE@nQ=k5XP;VGjR$vxoY&+pe)Q5Erfmj@1y zZ`Zlq1AM+qE!cGpte_+^ejcIJK)>nxFdimi)#gr~)F9XC@vdP};lhMQSf_=}qcDXh zro8*K3DJLsowiGV@qxg422vcC7hl~1#dqLg14sAMtl^v+yF6r)%2LBu%Fl^ka$@I0h3D*VrkmQIhEhVN zgC&~Ko$YKtH>g)PKd_&stsxHtMeep%PoSEcVD&vr<3fK&6r>wo%haN$ti?H6=$whz z=PuSyD)scr8;$NRoUP!bgAL6P{i)Vltq*^tY| zYzaQ4ij+-d0J1bihNd!HU#~pQieY0lEdKf;Y~%DwMLe$pzP$wf^6 z@*d;23omB_M*jV=;t$+X`hYkzOjOpc9z82W$dO-OU|1-24 zbmH}*H>6)!`X1o#Qes=?tYzU^zC(u9eM6qo$-V6HQHIV{e4H`0yKMw%N3lyY*DO9R z!yP|!E9N%d@NMmC!v1B5g|vB4hiJiI3OdJ!Z~DfG=)j(YGn9K9(Yoe~Zf$9Jv>cB> z`rB)aEiG8aw>C?uDfj-aTwi|LCzn3@+F_3()0u|SEC3HZbNtfDw~vqQ>KLulEo)h} zZN}ejFX1O%0UOf;JF;=<{d9_}_cUp>bA0>i0R1rN z+~FdQG9BE|AjuQ$Me}p4nk0Fn=ndZ>CDbVSFM}Hv$Y3K7?-se!(fcZgXmetI#${fR z0TVEeFRlHa80h|H4!O)(^tG6cN<&IWTH}!@xVUCMPX9T-=>ooV{0OF2tlb5qB4K8hG75<5-MA^Sztr`*W}o%U8w!(Q}ik;ypS7SWSgR-{8pCaSMrz@Vj(65=`1DTqr%A#Ny0dI-S4VEkT?Gdlr7sL{zY4O z8egH95kNd0irs{v^24osz-kI0KIiw@eDE2157>L{z2DFKKJOElaO!Fh=l`|&#!-&>3HFQvHcR*cK16I_ zf@HdFRZq{-ep4K8Cr%~S{5~JV@IHrPxDpf7fY(BLv8Xa!xP0aLi@@&Hdg^y$8S5wa zf3O#XN9uy{fHN9+vo^k5f#A@^#TdV-rt^xsE`ny~L-+oai;$OEzK6b&W$|`VP3@Vc zdMzeMKc>}1_)V#c_2Q|M9Q+}LY1)b~e=wS$4@&{~=@)-Ix618RGxvJ(*7{-DGc+|V znBXW?SRU$vargT`4KYp>R{tJI%JCAJ|0+UZ%(efQqm)}}*Km#XZSflkiviUD*Sds8 zHcv%h6z?q_H%6!%3NoJ0vz2?EeV!K3*O(JLa;;HpKHb_Lzu}Nn?0fWqd=93aX>l^! z^OjEgZXtVnb%oilN-~uA^r3yiZ4AN4rnYE5p{?|9X@ z1*kF`=(pN~wR%boy6M~K)$U#DOshwed_&`pZ!9HInR~X+>)Td_n;R2lthE^;Ch|+l zv**u`kfl>Q7ig#CcXF{`_gT8Y7+-!ySM{sx!xxwVtCsc+Xl&bY^X(L=2 z(F;A@G!M=zac^nVYMB;NOZrj1 zy79P8&1j0<}645I4(hhIMax0N&1~J)1p9ndiC-_S|p~~@253Mv((GSi&>J_6pQ`R z7H=Lj(@n5xS6KoZ9_lMx{R5=8njGm|Wfqy+-|Xsq;PjdvTx`LrV?0E(7hb)j=II8% zd$2{ua8;GQp1fgP0t8Q6va;g`oK+_^m4BDJ++4iLs=@MOQ67hP4+s;C_rjfVDA4r( zpVzggC>n0tPL8MXf{6{n^$aV*7lrQU5-&m(!lc0IN`#NpzOXnWno7z?x^e&K{B!TV zq6Ma&n;2I2LUzgiA2y%R;nEM|9iHs}1HkbAVC1wtPh8P%Gi*JzPJxX4x(iMXKl26T zDH&g~4BqnU5-g3yZa_gtAU^J1?|ZSkrt58@PG~$v zny9Z_or&)@ih!6!__^rPb(hM?e%-GwcSmfv$QN%ZGgH#9Q_>&(U>hE}UIvFYD^G9_ z>T#kI0)^b`1ZbK&wW=}iHzl78Y0vM-Fip09f{x_`t2}#8?RGf$8qp#uxS8uq*cXfE zrPUT*T3mWy+R|(kp){=sO?DWYI<}!Tc31ATNz8lj&_CcqtACBC@WkS%JXTVW`=uQ% z*%L>lqWq{3m!#BuR76oJ!Y3!cXqU_Ywhhy=9JN3D5w~>v&hz_&C!JM&uQsv<8mS@y z>SgaGR+7zbikvG6Dhg&P`3s$5I1$Z~4azc@!aB{_mC~ zl{Tjr)tHF)jbz)&tfL&_dFMeK<5<(jzOsSZ_NFxUoYm0(h6c)+DnR83#E=9xF_2DF z{dZvSPn6)vohYhH*y}M>{D(l`pzF#<8n_0{dbhJxL+_E z=H50*PEp2YsscOWXUE$UcT+Pu<=}7Q6z%O@(AE|aiwpJmHd#2DzzX*0K;|b$cYnhN zhqIk=FS$UrY9&k|Ew66$~*;FpnAi;P21XE9jgkfN>BX@Rgs%pSK zHMdU7=Ht|v$B?iv`ikq?PcU$ z)G|4rSJ^NS&PzngH*lX2qh)@04@q``X(qCz(Ml!>p~q0lJWsC-Ych9Fp%AlRQ=szM zHO)*}qO?GzWORRPL`surn)so^19&N?J(OB#Q=E1lEwyrGd-}kBadL0E2=EJSWLNNd z-b!-w%L!)RGXcR8V*;2VnjmuYVgw4HNWZ4I+x>BzLc;TB$ZMNK#FyVMV?4Ctt1)DZ zoJ7owVr)gGIHH3nxAguOeu!a%EM!iv4T85Gd|Dm+EKDpN0Xtpmd@Lru)ghh>aY>TE@Y=EY`DlM{LuSb^3G4R3r{4Zy3f|N;IWa0+k>WEj(!w*2DEXPeX%XecY3Sky6Z5N~pcgWYd-iNIw zT3B9&UCx_HkFWGST1nx3D4H*lQh{BWI3JptvuM{9*G}1h_oTbdEPh3Yq&BS;A8IQU znr=IvkG6F>E3KTdF+0vxBRDqU6xvzL_1k_6Zr?Qih!`4|3C=qOi44(D`^UsG8fFx~ zV0P=*t5+AvkJ04JImXQ5v6e$z#3kc4&P2ZY+`O_AJSrVI*3LgblzysdrTU=nIZImz z$tVJ+AaiD}+C}2OFd4LSpFRB!kWBj)S>V-0L7OL@C?u&8if#%$`}{*4l_4aWg5MeP zb;yiTUBw&cNJ4H;!8Jz?sw|4KIRBQeEPv(qr}ozYm)&TwgV;F6abHR-&RU`zPJW# zTi&=pkiZ^M5Ftzhd8h|sad$Dg)0{!|rcfAGlOk$zbuubZqAwkXzdDZgd+LWtS}Dk) zwIgTEmte?n!)8(lBs}MA|H;w;(eie?p_h;LcLn#t3})CkhQG05R)sPU-LSFXOVn(k zuaZ=5rlj(gkj=lkWYS2TxctZ9KpwQ5)~i7N2IS%Z(Px}i*Z7+HsOask9vxeDlBW*J zh)2u0@pE{^Fd*LtfEq3+;0$$MOS{MXf{#PQ^UQ?rDwQe{uOcbDwQfT@3gXX6WG4IM zEVASWN^whMvOc9k{AMKa7l??o2_wn=NOMgsDe0xKI_{*WA_{GxaHOYyQcz< z=s%b%^6wFH5k@Gs@)HbI3v2h;SoC@nW}Xh?tt++;N@dp$4`a%n&^dCm$=m6R-o-`Aw4 zUk~c64BeHie}m5>M`Q4XVSV$nClAVr*Fof`dJvQk@!o-`>Wv={7b=Xa%{6=@LhCix zX#w11#Nv}`O0vJR0F_oGk{b}y zQ7Gtuj(4OrvGL1h4OBFWtm*?0MF74oe?le=t(izd#{H3!Bl1bCD8-UZrfxTyKbxTnCj zZmfm%CtZ9WxsEks&2A$Bz6yrLR&KRl5Om<-3*=1qyJxLM*roVskH|_VN+
K91Ln zpnvvQG3;^BR4JaPb0};d*2sfl=SrtSKPn=>@v06^-ZYAO7N`KVMn9<2s|G?l??|H` zacX^Fq$u0ai!qD*)2$JJ!t*HpOv}Yf5UN=<;T!K}^Ui_uol6Phx~ihNh>#($3$T zkw(u*?CyNx6wNwY%*I#sBgor>k+iOv^xw%XInPw9X+c0nvlPO}+B%)hN%a*5yDyHK zNgupO&mZ=V$o4`jAYRfwKt(w{<%xw)-(&Z2Jvq8x4ygPbSCDNkS{x( z(hMOc`fN~>B@GMLj)j?&Hn1VdV_sUU_%>Z8&8vhGgy@5yk2i_&4LH9!Nfs^^gw`I+ zt+m|O1VBV^0)&R3BEo0~_p+}%uNZA=sH&{12E?c+1vof%rdU9GARm1EsYpW9+~V#d zqw|?y{Yjel@tc*d@7OperV3`kkhy)|?Q-CKolHndxwG?mwi!y_{YejBQ$toML+UT8 z(h|}44=@}sewb?b24v$A7%nu0N1HseA;qjEzIU+wHgFyZaZlz}oUssMQ&5(a!GX%Q zTZR*#MEY~Adz!wtK{5@6=LsUx@AGedp1J2tUdF#~)Ll#W%kzh$LAo|SEF>_L++XBn zg&|s9SJhYcBkMg}5!X{ta$b#q@$ae_Ya2~IA(^QmPYPcWbnV!u|4qT>EKVca+alWC zX6*~&g-n$^s`W^R;MFy|GwrU{T}$p^N`Fj3=}R5QDu+k^0r+7aAs_~*f>bZ`vPHFT zQJ0~?QPmfYY|vwh(uVIr_QinXK2cjE`GFg;!lpJ2~fZ^IPkAs@*H|6Zxs|`M~gvv4)qay;!tP3r3 zf;77MIuI59KyK?^jIaP^iXxrP1VdzB_IC4l`Vd{&ehVqnRfV`svMgef`ZF$h+INE7 zCrX4!@jwtm!4eG5+k1bcXL^fD%12=>ZH1FwI-_n)!KKB|7UCy**wON;01!XFz9fsV zcB`Q>sc=gZQ1Wze*l*@B{5i5mamg!^cmB!3xr_!uJX}C0yaXeJ<5NFMrvVwY?3phn zG#lCz(E>n-4lV{CSZou8=Z-!L(;`RfT?VL&6KsNGW2k~{9rhI#y zvHSHCR~8ln0_G(c!DmN%laFo07SXaiMwh=b9#J9(5L-+=o7wjy@&3H4GWVE~) zWt1R5j`6HxvSof>)$seBgGRB3)!9A7vwIb2J zR0)tM#5MFhy*8ssNUfhljI}?vjx|1qH4+>LbcjaN&Aey#^%1J6$uE#brhW|euEz>1 zHD&jI5Ft*7ok>BPYU*v?g9?B!}wA_T%+<<&q&U&~PVx})izYg6~-o)}e z0HP<8<+ah$m2tWZ(gl9?NNLm0VQ{>4 z4tRQT&wzZF-ngNLH6O|6dCQQHKqnUme#?)a(yhe-b}s}An_15BgTO=V;qGC^o7o=e zZfL^`tCP3MqS{=`Ox!!7aJX3nzazgrrj}8L1rd(sH_$HUL38hO+~=2)1IhYrV%^M= zV5%spqdTqfFiy1diV%u|-UH_LQhG*#cICW}PNm(6=sunG-c-KDDwHv$APV z^=UMT1sqa^7~0mE1Uaquy?sBV9K9RN#ChOALG1x1N8-1JD*-N8T&f+tkWW_Jm`osv z*-%ouY6p@0|JgaP`RP3P)!|?%-|6OCZhFSfzl!cf=38%dMn0zFU z-ggcVhl+lGvIJ9{HA{pr95L$hlRul$?RDG}cT-+nc^y~oD4JZL zjxIi%p#u=?=X&$CaLpdI3fL(0{)}gWMXT{*RgHskDs`z0C>xR*Be@~w_aDa- zacIGJwt%Ws$vj8es*TOY5y*73<~`!G&DFAPP*pykCCB*7?7YGP z@{s`}JHj)IaY;8}$u=~r$-7^F3XWrf{=K5;n0G6cU1(AAFGq!g2*VS|k_lHWj6us) z>6f2N>{RE|oHma}^99&uSiX7-XC=sRX+xkNkJwvhdcyIk3P{059>M~~J)Lm3uR7W5 zI=T-`6iWMM;dm*eioY(q(p@1@UrL>8$T({Fsa73m<~ zzi0=$6}B8<#D4F>j?D%hZ@Aa;>T7L_Q)MyG56vS*OfD^gKV86p1SFE4J1V zQUQ*{b0Tejl&|*2wn|pUTN6;HBxmq6OwL`eYQZ@m3@{@5W)CBHsxRQI`aRU#LYtGt zcG1*u(EB5l!6tFA{!vHIus751*Cc5U7%6bnTV*OdJbu8kQLQ7HRe7^|{r1hLQkRCH z*L#y6ZWv~m;aeBycD)0lbaw-huVdv^TlO23slw4h(6DLl>HMD?k_fK=pviY%5sSuS z@k|!7kYm0%DrEobze7V!MN@VAECw!~?LduXkU8x&2%^Cz%QRrSk92up*YotWjN9s{ znI80NSlr(8W*e>l?t-g?c?kSF62B0hnx9^j!^XWQ@xI%@^t-Uxui#N<{bVEeImP(7 z(Jd>#;0hHR;OuW?L_=h1e#S&VaKT-;QOTWjNo@Sge*dnBzRh;nLrRV%q#2#zJy!R& zK#)EMhg(Dt2zwNIADz?SSv8^U)E5kDB}8ksm8Awg7nAGfbxeG9Nr7hnG^fw1Nv{Wv zS2mfD&POpDYWTa2sJ;FpF9JN;Dz3<42x_cGQ2MQ?lZ`%`QFa_KkSj^|Eg^2PQ0ofjyEp7FF_7gkoPe{*UZ&|a!qmY~jX=Q41vA1ZpXoA+a(K-5F z6>fdP3daj1W98pVa>DYWNtkHf*YLGeWrFV+M4Itww$MZ3@Sf~KT)YhQ`?B|iwwzS# z6|E=@qHVDD3cMu2DrUDLhq#xG&O)q7NxaW-Nr zB7lsYXK7Cw=(WpHRyJ5k`#wF@^ew!|-K$8a6nlKkVM~=KK${SnUpk*nmp892Q5^Ub z%<%Ka!mTz2iHaX8xVIs}OM){bXb_(3$-njVrROgbK~}nWS>Lm0^Gd+)d?n=QTf#n_IyC`f(|NZ@0q7B8O7DQiY zJ-xl0Tv&#LTr#6d*?6AtiWw0mfi5<@+V76f^4vHWI+tV}R?*3INpX5;L;vETn_{05 zB3U(#5vv^bGW^i5xSsK+Yz8ww%$Xu$0WOTpuUUCgI$A3u!OuG_xag)Jy`AzpyQwI< z5+#7*o$dWbA*53cm&W>hFBAEGq(w3iYq zFEJ}GULNk^-+AVYS}u~%3Vd=7>eVW#u5g8!#5($|44fa_xD^B7Jv|i z1LmOViuhX;;z*>C+3UUz%8cy+Pu9H77Ytd{qXngTzQTn&79MDMQc`(V-i9iOFdQU- zcIo8t60L$wr0gC^)~q2}ULVX9CvqsFtt_H#dut1I^xKr4IWwpi+Z+jd$?en;O^TcZd8!c+N|UtFzAE&^ ze<&PK1!o=L9T(zS7?6AZAk($dSy)JNA|MP%`f3371(@|3t|t#7HM8K8jmQ{QS_=qA zQ*Koq4Xv%P;r1pG7~2dklULfd1nHbDWXB36BcWVTz=l-FQ zCGCUBj?&FiKDj*6(9+S<<{nck&f}#OVI8=Y0AqXvP!0MlqKtIq__Mz0lbOx#)_j*8 z$ozaF(g5M(dnk3+ZpS*h;8v1JFsP;Q~O69 zMgDFAZRuu{Y!6Sx`$Nq_dLM*Q{&-1mdsRVQC7Rl-Rk?p)fT1^)S_4TEw?Fs2FD1Sr zGrg^oOX0A~2PAIT`!My;th+a`%Exr$rC+yIYC?J2TAlvBz8(qxV`rj1v+97MHU*aW zG7Z(Vj%NS2?I&E_)?aLpS?X&~ixtEUMj9 zvG7K$_RTQdqG4y7324p<+TyNcl~sBCk<-4YsptDfFVdI^?`J&Z<_9|pU-_-n=2p!T z$A+4`wruIb*L#^x1jyYYZG8!_{?&%dpqP^_Pxno~i6o~k(2+;K;WH;f9O(0bNb@}bxCx_7*zK2Rsf2~t<7+iYG!;mz{P#7)^0Cn0~v9`eS zSdAWYo3( zmnm?dq0~Ni;mpcis;4QMsedFYH8ag2W}2})Z5eU)RAEv(Qd}4kzDCqtY01}S1ZUB9 z)AHx#ZK^bRNga4ms?Ix?m;;)KZ>?3gsaiY#z_9;>4Z)~V`dVK(05_MC&c@<=2Q73C zq0Tp_&tR}Mi_M=u^*iE$;7~LwhN>C4fh@^nhTsoz#(_Ajfp&RwE#IGf(={^7;QagQ z%jc(rm#9j3W8Hz?%%>)EOPuI5Tx|@ubn)CYuX!E_oyiRTz}D|*(8&OEZ$G}Goj*^E z){l8*ljBV0+JHE#fNSM#KvK`!rouJN-?H;@PX|+aBeSwihQ)z zC)$4GlNp9T9ugU1_FL#72dd!Gg@%j+o3A0!6ULBqJbI%lIqbLA)P6%5m8V-X1}NYc2hBVTyp6F6a_W3Xg`xX%@)~#Br64UX8A(%T8o4P z$fM_>HT7~D<56|0mF7`-PBe{^;lWK}5mK*o)kc08nK7s@h|!3nYo%HK2dHJ0&9yKa zD8@M^^`gow`OsgkOoK_Ceje*6i_XVziTB3Ms`8MMM=a^_{~%-|amPpzL=7;{1T4o- z62+VS^2^FbRDEFSd`>#I!ce(>LGcnvSH+?mKgd_M;8M0ia=f7OnQt1u&?CqD5R?B8 z!0$rW8e~xNHfR!g~)s(CS2&Q7RiLzV6BxC`O$Gx}NGh*dF+Ogk1d>q3lrMjP8D$lqu zALuYP))`a`o@Dt`ngM;_CnbIN;KGYSq%6-?FSa0)Rha}&6OyimRD7~_hn+V-jexqd zvnw#89!c#;)awrfswbfhe`QSv)!!{Cr4F-(HuCa{7iqSo1Ng`Q0^xQ0Sl_11EA^!5 zvb{_3lkQ}Uqszx?c-H?>r2J=li0eCE6AR2LK1i4zBCKG4_VcG6fvg^ZG0K}k0=NE# zmjB1P7cd{x#JNS{cvQsI&b@e?`Z#KBxuM*v%!MF4^Y>oh1wq+VqmzOhppwE>(#dBw zc8`j$#OPu4W-`lYtw$$f36pr1o?Ch2$eaMY^p8xAL^n;&K&S%P@lK#Qr`6hRQSlY} zQbw6BH#sItHQ#3%4MmJMKV|{I0RtJ`DTY|?^{G6nbxr<#!jJ>zB%jTu#pd*i5QS*0 z;m6U@I#ZTt*zB`84FvF#>)rFhxGB`86LBCJhP6JDA z+`sD#y>r_H%QN7O(DPdB;k%0KEZrV#ip+}<+P%H^jdlSl$y)MaQWWZ{2(L0Ta?uoE z+C+O8ZAivHz+F#^cXf56VIWw$%NZ10w;vq*=8ItYgug|mYWi&&^*UDu)VvtJ%cxzo zfFeOx^k0MjoIZRi@BZ{QdNI-0jX9IHmI4{%a%{LW`uHy;M%D`CalCmja2Lds$u*-z zn>uQGIagzf)!mooM6Re*w|cwTDShfMn5V! zv0$B-$-jp%0;9@QaQZUx6#wTRJu7~GVokd}gPv@8R+s++c;B!-<_fa^t>9pNMwGL1 ze`S2&^YLBsN^BP85?|s)tZUWMBdSb2Ja((2AwaDT3eqM@u0 zkvZ+XEsL{wBo-TC+X=GXZua#J#?9%Rh@0*FGFB2kwXwtd*jwY-?8By-(fr74Q;BFf zX<_b%PnTEyZF6(9Hw_Bj#J#VxoD1l;=i@g2ST`;sB_H}qW(tDW8P3IK!kJeYbLU46 zXEuZRUbDWC$+bl02calfv+`ReV>CU8S>*{+AA&*k?C(a>YTV5(beo9M_>3qSW<4y2@<|4za&2JZh!Le=Z;2y};+&cQK}|2>c5@ zNOmgBUpQafKXcHQD3vh~93zhzc#$@I1QnF}o?>hVyvOjKALR2aW>8m8Id*@KKsn&& zYElr{wNblQj!}ulwmFNIWQSH-63jU5vJB=n3TR7q4KNfcSvq~9zI zv9|JENjWFXv#j{E`gvPxSOB@Vf2R{Nm&4?ExH5h?d-0%G^=Z;gRk&Sk*P~@}9MvT? zzcYZ1&HUKCdAKjiR~=hQJ6yi)CYcZ1CEf#X&V`aKW!b~!^PW5MJ9(bznI>*wB@I)l zG&-m~$bUTqR3_ZkuKm2WtlU2mP+yjRu504QzugS)pd1avi7a=ZERs5JZpX!^Ha1=W zv%YQ;CrO%oV^R5`M?5pN*wD$Eq5#P?j;@&KhW^sqSUyJw_H}8MpM>@ALa0upH~ouWE_kpp_9_74qaI^ zkKU7l=)rja4xx&H7<~0e(u>6|Ijp0OWO0R7LO{?*%>3f5VU7An6g@xV*6MmTwPzlK z(1n6HiY!tmxwrg)J-ASl9dF>MO7pOq_YDUk^f#;~snkttXd}~4TcM)t=}A(Gn5$!M z?{WANqbS4@{9ZXXMTk8W-LD7m#QrjxFqrS|FC!I08smPWPaB>umSRmQFQJ{lUwkJmFjZ9NZ% z`{0eopuV3A4D~6hK2?JAV1vSGAE0cys~mRM^$lm_Hb@0r8dP~)xX`{eE>eNA<_`ll zao$)jDMbzrx|e6Q9^9)Cmwux18VBqeZ+tV_CZyc0@_&=|rA@%CrsjhIunPz?8shnG zxGTR(=HVtcv%Ltn=d|Zq+rlzpUMDWPwy)Bdg${re*`L;((XK2kHHR(1^(!iN4q~9= z+P@)K&u(n-_POjm&wl_4=GwA*R&*M}e)(~YfV`SShc^Eh?+d82diTam}zGwTMt2*m26GqGd3*waGB`>y*h7&aEA zSZ*k{(W_f^)tqkF>B)VeTLCmQJ(O0PpuO(=C;V`U8SXi-g?_d4>hGcoQR-S~!8PQ) zfKW*Zo5C@6d445%V-zj~0=F2q$~wItUN-lGOTSv!)Xh+LU+;?e-PNm_csuwHfbtM7 z&$`Xb5!OP&m60Q=Wy@U@XqsCRDFTgAxsCD37ThNkL$okf{UJl=A0V_%IK=D|*FON6 zG@}sPMd(g$&IADY!=ZPzu^?RY+&2W3o(kgP-lD+2+Wv4Z0N;dQRdf2W*Lo*Uxzm#j&$huK zqay@&PYbh3cCWWuMVGIaQmDj$(Nh|1`F{lX{{dd3d77|Kac;Co^ios${&MKlZ4O;W zKA(Td;$hE*|Qt zU{+Ds`^_&A(%*F;Wn%lQQNKY7Om2RD!wqk+hOH@@H@(lyNDVNgdVHj&x}$QSW+69g zkqg$56-$5dNkWYIpNHO!jZLR|)t=aJ==L{(1ISC4vCYFZB5Wa6AP{K^cCgA6xI z%Hm`xE!*D=(m-^U-|V}rCA;308PwEz_CNm$*IHz*^*&0>0Lk=iI1tmP3lS&mdDb-; zE>GPfaDmR&%)@Dai?pElD|Iw-m*-Dwz~nP2VhFA#rc~U`9_aA#9o2C?thb7jt;pTY zB2E7vKWXxEVm$%{^Zz`~AN*>?byhw&dnTNAp8w^m>ESAS2A{%2oTBMJ>4njM2+z7A zPWco|?2A#P+{N+QQKV7P8%)S3>6#;ct=JRouS%Xo9MGp1pspdKmYigwwTXaC2D8N& z5(25%*LMm}<)X7c2!V-GGjb`23XM6`*DT6XO6#m}MDSv%#A0({=?cap9lxofx`eM8 zgnr8!s`J&&_SL#WTA^>bQa>2k!%7f8615m5lVj!&`xY&5@iuZsjAkqeYo6x0x-R6-!)pU)KY)9!NS&wX38xynTq{<=UJ89%k~Z6aEg3(Fcq4YBLI=OSPa62- zeV%v;k2w`t0qT3!D_2FwT?ZjiMO!Hx7qiPDl{fy#LqYY4#qLcl#&Hp3$xU11pZGWr zjd7{fLI3uInlP^P8d9N>OiV4NT~1=eVS622ERt@lqbj2ospVk?215|OPy}YD*qY%V z0MStlt6wqy?V{g=rdxl%*{qo2XwUV9!V%1nHX;`ksf6| z+)1-`{>vJJbbE89u@>_CmH<}-{C~f147vAa{aQHC1bgP1GLA6oIG2cg(|ULR90PN& zTV_tzjiDHWH0$@g|3k8WbJavY>Fysfxb7y9V*4ER`0~mCt&=xz?%oByVt)Je#x6Oy zeet8;9q4IrSJ87;VgB8nD+2GGPVEC`OvM{#HJ!GEKt8$Ea8hr+LCEO0!+E<%SW72vc$Y zdok?@p0v{*#xP>UD*TR?bOnDE_O3x)VPYWd!|zKn>%?N zB+rVazXCTN#@G7F4a6c|X?Rc}QNnxl?3QY_oes6a3zN*CkMI271hs&W0q<{JU#=n#~cE=rglU=@AILEbzp#C-v=mzb*%b zOO?Id=6m1PSbYkjhzKTpd>y5vatx z43(78p(lSfUrK%9Abg~x-}Ojojp$I@#k7ohWgDy zps|{9@=(CeDE((geY>az^11%Bntt%6ep$~`WF&8_x98&+xK zr6-v*js$}c7cYOrYyT!If70oTo0Wb){(O<~Ec-~~Thdh*#rUGPHzwXm_6wLXX?lWm zNuF>EQ5r=8iHFC{K!j4#K%9Cc+{xQcX~MEIXy%uFaVlWLV~ zlHhVlU&)v#nMIZJDnUeaqO;otKH^Y!g_IM^Q_1A{q21ppiO=-%WB*vPW1R1658eys zzFKR_dBJvQV{Ulm->kp_ZDldYIQ!i%BgPg)q5C-2z5MzaWYPtUw{B}V+1!i**IK#{ zHpTNvH_z1WCllT+Tm**feZp7tANW z$Hknpl;`qY=kJ#uZBCu9pSRSRQT)@tb;_1tZ~ShoGX~(iHXVthDy4?LZ*BOH7)?`> z&Mt=Vf_uWWyRJYxUq+?1lFpP<*;$Kr2aKTk^#>V?*2HvONCJ6OdCpP<-U~k36Li}4 z6Ab4bJlOw5lO#>zmLbRPS-?yltnBH8CYbsJptK%*V6E^GYf@V-M~#s8IcfLXZ{dvE z4QSoS(7@$`p74o~m_S6%NOK%};`Ja4sp5dgK6ltdo9*YO-PzRp7jlOk!whk06nBGa<9-M&pSez-X^g!Z z5*%<7u;6!76y2v$PAxT7rb!pN&?Np8k!Q@4p7D_2hyUB(l~1$hsXGN|3&NP<7HRc*4uq7pMF3ys6v>7}A9k|NKDu9AfRz z)HYK@0H;~`qtei+zBnRT!`BXLaHk)Qvi*lyp-}+hX2dmVBAy`F*h20HI374;%JB!0REW#+dWWQf8SMHyXjXflFb25 zOCXmN76jRIJ=6}f?gV20YVj?75gI|%5*{0W8ZbE2vwDi+9iThX_uE6umnNye`Ledy zm&wuCQ!H|Bk8?uc^3Wdl(6Tt1*EN~+Vag-O;dV7C;iCe*w;meVpC0}L2nt!WKc2&h zkrfbkVr29$T0_W#Ta9M(#s!*8Uu3I=THi#JA&IR%?@d(@rex;#0e^`JTLp49G6jJ8!9Ky`;Bo)={Ce+#!Qp zZ5x?#E^TUJlkMrczolBR+NE_uL|_O15E2oLNBjphg_@TD&rT&Vs7)Pe$ED`3eCw7# znr8wjhYia}_=T?6k}Lmg$7FZpA1_(XOK%%=I=iXyydQ%58hs^*k#+gJ{{VS#W7Tr~53u|*&0UP-@sJh#5$-{(FG9wr%KoBcLy}*)+}`|k z{QJ39_YV)zj?Zk2L2ws&-66ri+7{rRbFR-nfKXuGmOu+)|C2^g?;cDzhHoUc^;!B? z8ejbMc4}Kx&S}ezkX8OvdhfcW(W~P6)4G`<6BFey-|FBhR^ec0xa@{n2jgtc4D3zM zQagzhe}4%;E>B_jyxkOXXMLOeXK!ZFl0qei*1ft&m_SRV;H^giarQ+g?pWmt+^f#SPCT*!^vf#7q<~lx-O$Ir=ZI{x0)E><}r_5ji3QP z17}?fWzglUiRVwT1laW~Z0gf9os*xEN_Fo3n~zm6wKCgHdqGc|*Zicsr`?L9{c|xQ zknT-|P12_V<%Mco30D2RR-GC1e2y(_ew&4%3Fb@vJ)XEEo&I%GQ=(R5O=H%}MH|dz6K4butD+ z!AHv17LZOJ+p=yo0!LH_via>iSO{a&hErTGq{!AphB#-F$@9Eh#MOK~^m}1(dBt+Q<7GY3Des`*bd$D9t`;P)_=cX* ziy1kzmR7(cLtD zK|#rx6!9IoucP;RV)F9pWcycgvBWEvc+KW4&Uq^p7(6HTQ(4&M0qzCSHva=8x&JA= zLmm7Blw5ojYq;b7upHpf%(UP9(&UeO+nbDz%&f(l9m~qK6s4v-AvGWAR%@BsUjr{r zjI0`7WKO1iX?;JZaDSZgrzmCc;{~d(Xxomi>>i_^zc^bz=I6jzl3LcQ_uiLRf@1c|m7dDeG{TnSZToS4#p*aqGHD+ z>$Ll1YH0R<8-$EcpKShS{^-wy_Vn?w%0mjSk3=#XJPNKG^?C&PhR43}lWraQROaIj zg=god>52_Em+`pszbITroSI5ueQT4xM}65#D_O5vcluds11F>D%#q5g)HmYsf0*yo z42GLle{G&BnC;f$V#kghR{Dn3W3mUE4t~H~B8N21BitP-wbCptkD4~JcgD0krktGu zr5E1_?*^y-2({;e${BoyT^K%h(V_4dA#l{z5;v)j!PVGO2uF{bo9Bs@Px(W>12eWX z6Xfv-@w{PCz2<RTEHLVqD z!NZnI-}N0`h@v+>r-#EADcP=*OD=ga8si{|$*&9Ell{0b%@+2&$i_Q6RTf#QM|Am> z*NWz|op-2#q_}`q&)YmHU)U9s1BIu}_cG=Cm!yZlC<=>!9F3l&MaIM+zm5UKV~#|A zO1%a^XjC~yK#3=XD&S4cQs?n}tBctSZ&}Hw{;2XBkEUxl$AfNv6fIe5MpvFv?I2)qa-~fkYW42-1pKmu~NG?wmTx@^iG?Q zOg$RVNva|R`-e~XtG`?@ehV#Vdc-x8@oo{QxUgvV=gL1oPxO>N5F1`rh%pX~xkoNR z$QH!3@tj`reCscdR&V00I2j|hX@v^xrP%iS`=1@Ftdjty=0)x`Jou!6*VRaTig1)| zF})(Xq!=~ibFtd(NrL29wDmbk_ z@=<2DUD>z1{L z(6c*^jXx%3t$VBPfQKDzs{O`LazdamP)(y#J)BMA^ZZ|gh*MrXd)x-%PG;Wz&d1e z=Ni!lDvzj`&{D2fXciUR5Yxy)uI2v2K>&wKOsYr`x}Id59`-U8finYppWBv{jA zL>6U0+QKxBKNqh3qG4Hc?YdGzx0Ca4E>W5Gb&GvXx%#(#ApC2EplNJtyPLjT8>15g zXu3GtJ5@w_>`M!~&3zq7!IJw`F=TJ)U1_=a)HE#iT{>+c$S1ow8nTymjN%P4LAJ^c z!@St9$sjO_bhd@sHGoZmn2 zJ76MwbiRN*uo zA;4JyslpPXBDfGbZ-W%ho@>tM|F)XIbNwj#9vKzYcZCyvM|fl(heROywYoOEkm5jQ31on znUgcXd-eY97&yE8YUiGovAazzKwvH_h8*0nnD5+=uWPxM4_m*dclK*klyAsqRX_RN z^lS{M0ld{R?!_VRK6;-tYso6G`=ssOwGmV8JGugTj0ls;4;nhBC#x0AGU6{p>QzoS zs~jj>kh+R(EDZ2smU5p0ZXm0D@Y0$&vxAwk*1OV*0jh$|nge%=GBZ1ytyv`2p2oxy zly9l)mVJuNSP|HRbBNpt)#xj^j3amHU?p)pLCZajzj2hC^<^CyTxHhC-V4o{>)OV5u_Qhl{rWZ%2WK1TfG>){^zhq)% z*dDdVAi)}!bT^y!-dVHKd1JS!hl}0SR5ydCS`Bq$%~{ghZmUT|8AXN4$2fFEP$OLs z)I7^tQRh=%#SS*98o&Se*6V%e?D#Fam#c5aaQQqqnNxyrGVhm@NWH=~ladG}3nONs z($)*cWcOnj_q9Dl>26Tu=P>4XTKSgh#yaD4g$$a+&nY(x;9NhhKMJHv?#_SJ}0v z>;JT98Z&)re~w{LTo9tTFhfQ{yk;Hh)R?8g<2EJ zgZ+{$!(M?l7RY}yU#_imeXPsL>o>%oyDa?ZTea}zUlH24^7GEhbhVGB+jIi?KP&&F zhIP5Y3eLV85sSDyBtB4+znM z=~Q!85ca(0B~c0U2L9J#y++lsL+_2^u_-PLI=7Ja_o7nMtf;7WPEj~ZGeslb)(eSQ zs=44x{zWc?$1HwpLq5GHy`1dqPD!4lqkfZ*=rG6RQ66JrrK?4Kt-Qfr8AK~?;c)Ia zj9hwH1kXstB^M@(b52B!HD+;|(cOtC6%APUCA!?|t8_)Tx%=O5ShNngm&c`4y;?M6 zpZ@lK@|{WRj)v!!NbHSF?&+sH$S=fb-HFaG_#%U-6P_e78*4%{VJ?k^V!jW*Wh!#fnL>QgHWQ5fe>QFEL=)SG?$6~}LdwR4%l zu1zXtIi40>su9}{zv4NBjrkyKGI805HF^Y{lks)A!{{1A#?%#t8K3&k_cdr_KK(5D zw`hpG<*Tq%brnviivE@Uon)|=;se!VGW&1WdHr2&1Ck9nbu|Rkp!hFmQhY&)7GzF> zLkw%`G6>U&qXW}c!k`9Nj^I>7%E5?}9+ZoNz;acU@)0p72^a_vsA!e-&26hawuZ*NTf~`KdK^;tS(?jHA}A-PN$6^c zhO^Z2eN3yYRt0~UQkoR&$s9DKYbK8K2 zh1bB}9{7{&e*kpM2^H@cV*$>H05V31644h5DHQmFyC_oP^`1Y)B=9)>OjME%9`+B8FOowF!sL>E z%*F6$a!mz=WKYmEfTjy1UmF0;fA5eKCU)vHF?0N<|`lWY}y5B{NlN=`Xt={h?*T;kf4-JIkhdY*w z0~)6WTnyrUN(GyCo|Ixl?h9(@z8^m&6*sf^EPYNo)|mNr_3RDP*wKWnp_#C2Pbz|H z1Rh9qf4mgX;Men_v7XwXqu@Yc{zoE>jtPI<#iK1OG2)|)__k!yG^5rG<% z6d9>*H(2AG8cfgZ5V8b}w6|Ys@o1iC0L6`q&$y8c=&4%;<?PWz_%gAg!2+YJ8-bn5==1kp)` z`ol>a3;9EE`VH=vtc}*4+vu!Xq*QxC`so5i`Tg1+i*lS)2kgT-3&6otKm(}8+((nS&lZizZc63O9%$$JDnb#?ri zoD>zz!!ne%hJwA3jzQh$RjBQf7`^1B&z7@mX@@Zuz9sA>h~z1=E_Y2{ zdMcJCbfyYc*e$2}&3^AYVY~a{O8pKGZ=tR=wWWEiZ*C%f=BLOqudvJg*_3$Wy*R~< zbOnY1Q;x@;m;=%Ak{jm5^d5|NQ&vVK$AD+5vE;X)<3t7(!NM(w|MR(=P0FBC&CPxF z8-7cN%|l){+7AUPzX;RbH>xn(?UBS{Dr3a|5hoF3yf(8;aKy zNPAzuwaW(&U-IDzcI94-$dkTfq*twv)A%Qdp}n{t_cV+owclA~ z7$V%I(w=#g`$W=LXsG6`A}60_Dg^%aje9gT3qAeNXNO^`GAmh4NARZbEebP+8*E#y zfsb;pCJ~%7_?ZpnpYgx?RnQrXqFmyjS@-h#xYH6^pZsf*K9Q?`BsAjmZim;(#iF;d zJ7I7##y2Pm9rfvi{=Fr?0*wEY5biGAzw0-t{3bH zJyz%bSWKgHRy6vn!2)-VrMq9ip&}xQUN>kfLIt$!*q+Dt58OO6q{XAtz~vXvzm%KC zbo!wz^1{60U=q#yN1Dl@n;b|1q54F}^JVbVeS5c8@9$V+U9h*d`%2SKB^E^a6 zzcM+xoQ5~(_bx&yEzDDBy)nJ@!mio}VH_`ti;Y%!dhH)X%%wn6Bf-sVDbf(M zv#6F6r-&@1AV2R&vYYC?b@^`7P#%s|!!5!nxLi)VTouA+O(LtQhCgS|ba;UId`;z! zHHwB*tw6QKHX!-=nnl#>U18!D)QLUAl)?k0xlUh8i8jZXMCwTe$T#rsQH{N*ErwUz zSMRM)o_fR4rFy`0=v^_?k^}lPu?K+`^%nivC*6E68z>j^s`1vs_78%TIKQ{enN4~$ zFqXZP@hy5%+}3+WYMC2Fjx{gbUd&lzX>xi}yyJ=Wp9A_TZ`pY$JZen$OW}2{i#NT;Et4Lla^Nj+Y9eKCpaBFG6B= zX_rmy=T<*wkPDA*n4%o?*Ggp1+%wUkVZNdvT@vF-r><~TYhS$9(P%cGl@Dvp*Y^vN z6zgo)=N%q!a}u>btjK+yiSN-}t@+`c?#YK%oLv8k3NZw$AlWkmc?HNbU%YAFq4-&i z75(6V+-{SqxRbNnFIVGtcSk1P)~DGebJhKKUCmgE%t|etbJ5apVx#41$@&?Q_~$R0 z)mr$uZiM;X{nB>J-P-ic_u1)xEPr|3e2wd5kb4)?{VsC`=VI8(Dx+xq?7&U#>WH(3 z;fC9{1k&6Z)Exx#er=s2kvY_GOg*p?*X?*1Y{-1MraYR9`C~j^`_g4$>7n+5f!ANZ zmHg{gTcomvWxXQr#r;vA$j19UaigYrkCWeZ6bi=?^t%T21{sDP zBgtRr1zv?f<32tqkK2yRupi9S4SQOdGCB2b&8df6@Z0W>Nj@hJ0k}eKVXKJAN+|@D173h+=-XlS_4qSIbA^ z5imhsZT0xts;8qQu8B7lE}@MR?}fkO6Ov!nTPHMs6yu!d(!-rr62)6N8o=54UmM#@ zZ%e;fCc<>#AGFL<0EjqFUgUwcI~)Tk7O@g0-4`{=V)l$-j$y^5z>Dyx!sm<}yi z$UihMQon{g-m08@fM?*CHGf>CQU{{2$i>+y2LZ?w+C@E(dDrU?`|qTO4Y&>bY4WCz zeF$e@vB#jt946N^P9`TLjFYA`|KxHNhLfQzm8YnXPECQJd%}8Tcegs`Tr+I|f-mOb z)l=R6R$$veF$SxoC=`GQBR+5f3M6p<0zHc3Z39@r3mp@#&B#DO2@oj;=)B+XhIN2? z|F`5{F7O)vzs0`{$h}n|VGj<=Am4vKOCtY1b2BR`RAJZc8P-sWUZsJF!_Cj2S3q+7 z$BtT`evZz@_}hc@YV$UGMz#ksd#c{m7`Z08o`}as5cOi?lB9vup74jDT?^X37%%M$ zV%x;}erJ^nT%Tk;$U8J|t9aRT`kmw%<9A#7jaC8L46>xePUDgkVYWN(7#-oVgl+vM zYxS}9O{aGGO+SpHBv@EgSaU3l5Ea`zJ6`jLARFasc7AN@H~WTm2OmM=xH*>2`*GO7 zBfB26k_>~_SXv6v+ls*P&K@O)7@ADr+82#yW-h^l+4 zTdp=Rpc`!t&*$pzbWeu_Uf;bRA~((FZAy&YUvN?R!sh#L19puS`<94-`iZJXQqzKP z)*G%Q9?1=~9u`PE)$LZXwCKhxqA3`H{v(K|ac|W+80*a*YmZ@PUeI2 ziX`wDQ9a|N3nYH|?*87~!!JN!EZHzV3oO6V+AP}=+z;I28cz$UucGf4gr1CP2H#D* zM0Wi=Yb@9hjrb2ZM?`DJ)K2P5{^1C6uu|sxylTT z$BjWJe;p6Q;^CXcUhEWJ;fhqq4U)(o`)$7QRi5;-p1$XX<_=7`790o$s5xkN^;Df% zGnV|>!V!e|D-l7AJ^YTw`Ly`sfnzP&$Acsm4Q3HSyI~i=%%Zj-b;(ue=4*;^H8}XP z2NbpwJ+78Gckps3#H?AZyMO-^YR+}D*mISqV}qoE?A&eE?Cv}ko=g-ekzIGc5~!QU zp+|a2bBdayilYhxJ>z^s&?#B5jw8tD?B$Qs)l*CT66miYz!A#Y>J7^Nc)&+&TYXxF zimc)O@(v`)m;+!la>NmZS>bTRe?V^@LCTLHQ?gJ^=rRHAj&JoLWi0hei;=L~V+XeU z3$}+N(EmxDl4cT{l!T69+n^vW*xLa-@c);NLKelVgj4zup$C*Jdp8YlFg2R*jP^b- z0e^cSVm_GS^&W`K*t+3+;g_JA53e{&*x0)Msh5#n?b-czPxE76?~mOF!nInT#Vm4q zl;n!t2ulh|X2s8Kc?*b-AYR%lx-V<5?4*41@D7JVuk6(PX>k0JsP2M)&|5v9d#${P z@GaEwHPycjI9h{L+<&64Ny`7zfRXYS^ucJE&00bYM!xzE_n{cE7zYN0u7J!=;=%|) z;u6tm3kpjf&7emm9>Tk`U2_^Ove5dQc|OTtxC}8eTX&csp>W*7>7TTqprt(r?h{VR zSkTA!T8Z@>L2`%&%kJP|Ru3&sWZvkVD6b#j$4S+=@jX zR91V=!nx6+8f|beBcJToK#$rw)Zd6*cHg0eLw!)Wdu<+a`yrkd)p%e2IlKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3?Kc3Uk7a)=! zFXV@sd|Q>Tcjfc--k`4H=NtK@k({l|1kyN?>s#{Kvb;C*6Vg@u+LYh!lao72?vCZF z9l5qDAC%=vz8mrlpfklGmHSg&Zl1K?4rk?!G$1^Of=KRE5O1Mieyk1o1mG3V{mfu( zQl1-40hl()bVPR67OD&K_LRIbA(wI~07-O0E}l8LNAc;BykAP>FOJK_kraR=WKuvd zb?#A&_sxP_&LvS8>;S|T@W`sNzQPE+PY?B2BLkunYhq9lNTw@=#bG%=kO2q?9syLo wAPlS%kS^}|FR*9iGHnJHo`3xp{`xn*1NdD)iy?>eQKUhtx0ctR!$MLWC=0L}!N? z?Ycz%iG)2>!Gl_bB>2L~S6$8eaeq}%>cP-~^quQ#49^^a#}xjnn`o>x`ij4)?KSK% zgx}Gl$4_+PrYSC5XJ&fwbk`+T9vMaaef-gust+ojK6c92@NB)PFeUaFxE7RFV6Bhj zz|58TA@|CoG8O>E0(L%S4cW3nX2v_@0ac%VzytkK#`9=xmM_JT!sKf$BAPi2CrNk0;!6Xz4kxVA> z8AfAOAkZM&x?X(i&*>01hg<1re+kW~U~u9GH2DS>9(+ns1W*JRcMbwCBds;|2@S(A zP_9A~Mf&>s7#tj=ySsY>i7tQcUp?1XbGm0LE4guNicH3$rs^a5jYG6G1krVkoC694 zKz7N-%H>gN8RaTUB_H+m^)xj#VObVJtn-#D&wuq+g=m_F zl#+NnzB73lE5qd7Ns6W7w%-(>Q7o3QvJQsfD?8P7oj@S4GkF>ygkXGhjP~{pd_MoK z9najGWobD@I2e9o?N)jQo^=E7n zTo*3niByG9O1WjAl+v~&S(Tvx@OlkO%0-pRJJ$Y*D?)DANt7)dA+`=tD?_1_A`*!p zTz6Zy>$SFKVPy(^S{kqUPvTNO%rUx_pl;!KjA55$|k>?cq)}5m&;{0uJHq2{=drq4Wg={EF~^a Q0RR9107*qoM6N<$f@y2~5&!@I literal 0 HcmV?d00001 diff --git a/src/Icons/systemtray.png b/src/Icons/systemtray.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d5f555804fe3654dc9b5ccc05eb5c24e77f996 GIT binary patch literal 1235 zcmV;^1T6cBP)p21{->bVNh*~}y3uHyCZd!1WQ-Z~ zdc8ySI>KvfYoD#Ht$pg8^Z!1VQi`3Oo!#r#uYaM05Ga?+fe=D@?_ViOL~>sJ>BTmxwFuRkM!6Cp3?-O7%+MkkWEc!m z#65#jI>fi1zXK@*(lmt-0?Z8O+yobtAOev@p)~p#-~$3HAO}Nb1oj>_^%$nWASDbk zLMS5)1_{_R!Z3uCa*AW(lM+J0GcY(d5TS-3z%#>UIiwWh1c%h*FhdJtECw#aa5zLD z7(@i`J(w8)AcU9*6Nm{fUmU~agwwM%SnCi35<-p`7lnh(3M5H}y+4oPl!J2)I*=%r z%TvD2Ih0DJkuYdv6nl?@{RFOHRBIYhq#(u>7dgWii?}z$(a{hyvwF;vrtMY~1+2Bm z^L)gZK#)qJT-ES0Ko}_y5!eG@56>QM{LC;?s8l1UU}V-{kYHzL2i|)aVI0M%-BY9av0Mx(j3{N}>SeBGfT z`{}9B@KS@+sW78fkfNy!W&(qT9B^p=N*bzf=bI#y65`?RL-h80kV4|oqeqi!^Ucl8 zExEnDy?y)k4?k~w_x(=~9z1+rsZtt@U%~&X+D; zytuS~xDRVA1PK^pP^;D8z0bF{wzecQXZ?PEcX@d^x_R^FSC=neeoF{JN-0#URcNh| z=Q-N#wzzWT%9&25Q;VWVbvm8-cB_p_xdH%KSXh8k3Q3aWckkZa5|f`R48w*}YSvnd zD2gDZM3!Yp(-c~3XswZD83jRbo|zZ(JcrFK!Z1X=UZ3_cGZO%k6X9;R`~3d>`!A1< zj@rhUa+;#(KS8@6XTAUx?$__xpWLlEfQhytNj4 zdwYXBckcXnaRsoSU2b5J36F x5I`Kqy=Tv!ZN6&e(Rlg){QCdgoeU4a{|!hhTKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3;Gxp zFaO84KK&nB`{2J<@lBitp=i#Y@aBKX^p9YLAR5F683N+F=3o17k$fJ*5V&TLjWEs4 zOMm^ZTlgK!2Z@K*KLm?gr(OK76L|u~5V!##XTvo2to;wB%V&KCi$^v*f_pLjWG zAP&d|WEX%ivI}5hFc--B9Do}FHXx|#9@wuSKf@HGhXDwK!ay_Z*neryeW(V2oCgYR zkYbRH*kZvx^YVYAxHJD%f{y$bbK8SzfMfO*up*F4K;8lQ8AOBlAaRhqdD6N6TH(jR z&KGptiE02y5@Z7?syvGjagK~ZepmEA^k2+%_kV7itq22Pu>f)&ES_!CFM$IL#0QCk zYzB#o1D(!iw;g*lg8T*wAdpR>?$&1~kIFb#ki0t#J_VmaRfU>d{+ z1sKTBAZMd%#+erc9Cm;)$VM*ft^e6AHWSVZDEP~0|IUhdKs+#XoRGWO zZ%8SMQwjMH6N2C^9=7iNHRTm;r4Ixc5D{;rwPT`66Swby*9u<13p2_w&Rh|P@__OH z9tfVJlz`gTjY}hriYfhB3efFBtBFznY#l|7m@yPelCD5_l{H4?j@T5;w3dam~to zhQyr~NaLT}i=F~T!FwT41%4NE=Tedq&$oR(hR3g{6g;`m#ucIeh*}Wy8b283mCPsk z$iMlO(Wg5MuG~Nq1f1X>03YCk-s^mAdxNcmBE$a;7eN7Sh`Z9yH(uZQ0^_X0yqGz; z78Sb?jM<=G0Obd{4M7J4u0aq8gu(H{oO!IhaT>Q$s!~Ke(GYlS8!Dv?fH?u;s@9WP zu$%NDFw zYZ+hz6fh_vF2Ducl}JZzvrp5>eZ|F2ZKS`v}u!MWMo{>zuGdX z&1ls7c9E)GKpUv#+!%Rd&z?OyP+wm!#l^*9G#X3wckz=>Ktvch#M*8})ayr-Xo>&Uj$P*fFQm+1uRQEEN?MVltW5=p+)NSug4$98)ts z5g8gg=5RQ+=j7y&mzT%l#fuNO}4N+kNoz<;(7_ zt}d1>TecZUCal7^Yv7a-5Rtyl&d#c~wl<7LV;3OsTTjq0!2vzk)Ml$4aT&1f|C j4h{~U0W=W_j*a;nNf=4vr))`B00000NkvXXu0mjf{m*Xg literal 0 HcmV?d00001 diff --git a/src/MainWindow.ui b/src/MainWindow.ui new file mode 100644 index 000000000..9cb986a72 --- /dev/null +++ b/src/MainWindow.ui @@ -0,0 +1,930 @@ + + + + + MainWindow + + + + 0 + 0 + 849 + 526 + + + + Qt::CustomContextMenu + + + + + + + + 9 + + + 6 + + + + + QTabWidget::North + + + 0 + + + + Transfers + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Total DL Speed: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + true + + + QFrame::Raised + + + false + + + 6 + + + QLCDNumber::Flat + + + 0 + + + 0 + + + + + + + KiB/s + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Session ratio: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + true + + + 4 + + + QLCDNumber::Flat + + + 1 + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Total UP Speed: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + true + + + false + + + 6 + + + QLCDNumber::Flat + + + 0 + + + + + + + KiB/s + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::CustomContextMenu + + + true + + + QAbstractItemView::ExtendedSelection + + + 1 + + + false + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + + Sans Serif + 9 + 75 + false + true + true + false + + + + Log: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + Qt::Horizontal + + + + 661 + 20 + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + + 16777215 + 123 + + + + Qt::CustomContextMenu + + + + + + + + + + + Search + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 131 + 132 + + + + + 125 + 132 + + + + Search Engines + + + + 9 + + + 6 + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 16777215 + 35 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Search Pattern: + + + + + + + + 16777215 + 22 + + + + + + + + + 16777215 + 29 + + + + Search + + + + + + + false + + + + 16777215 + 29 + + + + Stop + + + + + + + + + 0 + + + 6 + + + + + + 16777215 + 35 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Status: + + + + + + + + 400 + 0 + + + + + 16777215 + 35 + + + + + Sans Serif + 9 + 50 + true + false + false + false + + + + Stopped + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 16777215 + 20 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Results: + + + + + + + Qt::Horizontal + + + + 721 + 20 + + + + + + + + + + + 0 + 200 + + + + true + + + QAbstractItemView::ExtendedSelection + + + 1 + + + false + + + + + + + 0 + + + 6 + + + + + false + + + Download + + + + + + + false + + + Clear + + + + + + + Qt::Horizontal + + + + 601 + 20 + + + + + + + + Update search plugin + + + + + + + + + + + + + + + + + 0 + 0 + 849 + 29 + + + + + &Help + + + + + + &Options + + + + + + &Edit + + + + + + + + + + + + + + + &File + + + + + + + + + + + + + + + true + + + false + + + Qt::Horizontal + + + + 32 + 32 + + + + 4 + + + + + + + + + + + + + + + + + + + + + + + Open + + + + + Exit + + + + + Preferences + + + + + About + + + + + Start + + + + + Pause + + + + + Delete + + + + + Pause All + + + + + Start All + + + + + Documentation + + + + + Connection Status + + + + + Delete All + + + + + Torrent Properties + + + + + Download from URL + + + + + Create torrent + + + + + Preview file + + + + + Clear log + + + + + + + + search_pattern + returnPressed() + search_button + click() + + + 405 + 125 + + + 543 + 123 + + + + + diff --git a/src/OSD.cpp b/src/OSD.cpp new file mode 100644 index 000000000..13d3a317e --- /dev/null +++ b/src/OSD.cpp @@ -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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include "OSD.h" + +OSD::OSD(QWidget *parent) : QDialog(parent){ + // Hide OSD Timer + hideOSDTimer = new QTimer(this); + hideOSDTimer->setSingleShot(true); + connect(hideOSDTimer, SIGNAL(timeout()), this, SLOT(hide())); + // Window settings + setWindowFlags(Qt::SplashScreen); + setPalette(QPalette(QColor("darkBlue"))); + hboxLayout = new QHBoxLayout(this); + icon = new QLabel(this); + icon->setPixmap(QPixmap(":/Icons/qbittorrent16.png")); + icon->adjustSize(); + msg = new QLabel(this); + msg->setPalette(QPalette(QColor(88, 75, 255, 200))); + icon->setPalette(QPalette(QColor(88, 75, 255, 200))); + msg->setAutoFillBackground(true); + icon->setAutoFillBackground(true); + hboxLayout->addWidget(icon); + hboxLayout->addWidget(msg); + hboxLayout->setSpacing(0); + hboxLayout->setMargin(1); +} + +OSD::~OSD(){ + delete hideOSDTimer; + delete icon; + delete msg; + delete hboxLayout; +} + +void OSD::display(const QString& message){ + if(hideOSDTimer->isActive()){ + hideOSDTimer->stop(); + hide(); + } + msg->setText(""+message+""); + msg->adjustSize(); + adjustSize(); + show(); + hideOSDTimer->start(3000); +} diff --git a/src/OSD.h b/src/OSD.h new file mode 100644 index 000000000..52f6d2597 --- /dev/null +++ b/src/OSD.h @@ -0,0 +1,47 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef OSD_H +#define OSD_H + +#include +#include +#include +#include + +class OSD : public QDialog { + Q_OBJECT + +private: + QTimer *hideOSDTimer; + QHBoxLayout *hboxLayout; + QLabel *icon; + QLabel *msg; + +public: + OSD(QWidget *parent=0); + ~OSD(); + +public slots: + void display(const QString& message); +}; + +#endif diff --git a/src/PreviewListDelegate.h b/src/PreviewListDelegate.h new file mode 100644 index 000000000..7d880baa8 --- /dev/null +++ b/src/PreviewListDelegate.h @@ -0,0 +1,115 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PREVIEWLISTDELEGATE_H +#define PREVIEWLISTDELEGATE_H + +#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 QAbstractItemDelegate { + Q_OBJECT + + public: + PreviewListDelegate(QObject *parent=0) : QAbstractItemDelegate(parent){} + + ~PreviewListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QItemDelegate delegate; + QStyleOptionViewItem opt = option; + QStyleOptionProgressBarV2 newopt; + char tmp[MAX_CHAR_TMP]; + float progress; + // set text color + QVariant value = index.data(Qt::TextColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + }else{ + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + // draw the background color + if(index.column() != PROGRESS){ + if (option.showDecorationSelected && (option.state & QStyle::State_Selected)){ + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)){ + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + }else{ + value = index.data(Qt::BackgroundColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + } + switch(index.column()){ + case SIZE: + painter->drawText(option.rect, Qt::AlignCenter, misc::friendlyUnit(index.data().toLongLong())); + break; + case NAME: + painter->drawText(option.rect, Qt::AlignLeft, index.data().toString()); + break; + case PROGRESS: + progress = index.data().toDouble()*100.; + snprintf(tmp, MAX_CHAR_TMP, "%.1f", progress); + newopt.rect = opt.rect; + newopt.text = QString(tmp)+"%"; + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = false; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + //We prefer to display text manually to control color/font/boldness + if (option.state & QStyle::State_Selected){ + opt.palette.setColor(QPalette::Text, QColor("grey")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + painter->drawText(option.rect, Qt::AlignCenter, newopt.text); + break; + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } + } + + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QItemDelegate delegate; + return delegate.sizeHint(option, index); + } +}; + +#endif diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h new file mode 100644 index 000000000..5355ee6ea --- /dev/null +++ b/src/PropListDelegate.h @@ -0,0 +1,126 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PROPLISTDELEGATE_H +#define PROPLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for properties list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 +#define SELECTED 3 + +class PropListDelegate: public QAbstractItemDelegate { + Q_OBJECT + + public: + PropListDelegate(QObject *parent=0) : QAbstractItemDelegate(parent){} + + ~PropListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItem opt = option; + char tmp[MAX_CHAR_TMP]; + // set text color + QVariant value = index.data(Qt::TextColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + }else{ + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + // draw the background color + if(index.column() != PROGRESS){ + if (option.showDecorationSelected && (option.state & QStyle::State_Selected)){ + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)){ + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + }else{ + value = index.data(Qt::BackgroundColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + } + switch(index.column()){ + case SIZE: + painter->drawText(option.rect, Qt::AlignCenter, misc::friendlyUnit(index.data().toLongLong())); + break; + case NAME: + painter->drawText(option.rect, Qt::AlignLeft, index.data().toString()); + break; + case PROGRESS:{ + QStyleOptionProgressBarV2 newopt; + float progress = index.data().toDouble()*100.; + snprintf(tmp, MAX_CHAR_TMP, "%.1f", progress); + newopt.rect = opt.rect; + newopt.text = QString(tmp)+"%"; + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = false; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + //We prefer to display text manually to control color/font/boldness + if (option.state & QStyle::State_Selected){ + opt.palette.setColor(QPalette::Text, QColor("grey")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + painter->drawText(option.rect, Qt::AlignCenter, newopt.text); + break; + } + case SELECTED: + if(index.data().toBool()){ + painter->drawText(option.rect, Qt::AlignCenter, tr("True")); + }else{ + painter->drawText(option.rect, Qt::AlignCenter, tr("False")); + } + break; + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } + } + + 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(); + } +}; + +#endif diff --git a/src/SearchListDelegate.h b/src/SearchListDelegate.h new file mode 100644 index 000000000..69532758f --- /dev/null +++ b/src/SearchListDelegate.h @@ -0,0 +1,95 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCHLISTDELEGATE_H +#define SEARCHLISTDELEGATE_H + +#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 QAbstractItemDelegate { + Q_OBJECT + + public: + SearchListDelegate(QObject *parent=0) : QAbstractItemDelegate(parent){} + + ~SearchListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItem opt = option; + // set text color + QVariant value = index.data(Qt::TextColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + }else{ + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + // draw the background color + if (option.showDecorationSelected && (option.state & QStyle::State_Selected)){ + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)){ + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + }else{ + value = index.data(Qt::BackgroundColorRole); + if (value.isValid() && qvariant_cast(value).isValid()){ + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + switch(index.column()){ + case SIZE: + painter->drawText(option.rect, Qt::AlignCenter, misc::friendlyUnit(index.data().toLongLong())); + break; + case NAME: + painter->drawText(option.rect, Qt::AlignLeft, index.data().toString()); + break; + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } + } + + 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(); + } +}; + +#endif diff --git a/src/about.ui b/src/about.ui new file mode 100644 index 000000000..6a7ab252d --- /dev/null +++ b/src/about.ui @@ -0,0 +1,427 @@ + + Christophe Dumez + + + AboutDlg + + + + 0 + 0 + 504 + 320 + + + + About qBittorrent + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + + + + + 7 + 5 + 0 + 0 + + + + <h3><b>qBittorrent</b></h3> + + + Qt::RichText + + + + + + + + + 0 + + + + About + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + 7 + 7 + 0 + 0 + + + + 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> + + + Qt::RichText + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + + + + Author + + + + 9 + + + 6 + + + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + + 0 + + + 6 + + + + + 0 + + + 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: + + + + + + + + + 0 + + + 6 + + + + + Christophe Dumez + + + + + + + France + + + + + + + 03/05/1985 + + + + + + + Student in computer science + + + + + + + chris@qbittorrent.org + + + + + + + http://www.dchris.eu + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Thanks To + + + + 9 + + + 6 + + + + + + + + + Translation + + + + 9 + + + 6 + + + + + + + + + License + + + + 9 + + + 6 + + + + + + + + + + + + + + + diff --git a/src/about_imp.h b/src/about_imp.h new file mode 100644 index 000000000..33cf64648 --- /dev/null +++ b/src/about_imp.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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef ABOUT_H +#define ABOUT_H + +#include "ui_about.h" +#define VERSION "v0.7.0rc2" + +class about : public QDialog, private Ui::AboutDlg{ + Q_OBJECT + + public: + about(QWidget *parent = 0): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + // Set icons + logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/yinyang32.png"))); + //Title + lb_name->setText("

"+tr("qBittorrent ")+VERSION"

"); + // Thanks + te_thanks->append("
  • I would like to thank sourceforge.net for hosting qBittorrent project.
  • "); + te_thanks->append("
  • I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, webdevelopper and RPM packager, for his help.
  • "); + te_thanks->append("
  • I am gratefull to Peter Koeleman (peter@qbittorrent.org) and Johnny Mast (rave@qbittorrent.org) who helped me port qBittorrent to Windows.
  • "); + te_thanks->append("
  • Thanks a lot to our graphist Mateusz Toboła (tobejodok@qbittorrent.org) for his great work.
"); + // Translation + te_translation->append(tr("I would like to thank the following people who volunteered to translate qBittorrent:")+"
"); + te_translation->append(QString::fromUtf8( + "- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
\ + - Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
\ + - Chinese (Simplified): Chen Wuyang (wuyang@gmail.com)
\ + - Chinese (Traditional): Jeff Chen (jeff.cn.chen@gmail.com)
\ + - Dutch: Luke Niesink (luke@lukeniesink.net)
\ + - German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
\ + - Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net)
\ + - Italian: Maffo (maffo999@users.sourceforge.net)
\ + - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
\ + - Polish: Adam Babol (a-b@users.sourceforge.net)
\ + - Portuguese: Bruno Nunes (brunopatriarca@users.sourceforge.net)
\ + - 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)

")); + te_translation->append(tr("Please contact me if you would like to translate qBittorrent to your own language.")); + // License + te_license->append("
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.
"); + show(); + } +}; + +#endif diff --git a/src/createtorrent.ui b/src/createtorrent.ui new file mode 100644 index 000000000..52c8e5a92 --- /dev/null +++ b/src/createtorrent.ui @@ -0,0 +1,275 @@ + + + + + createTorrentDialog + + + + 0 + 0 + 560 + 307 + + + + Torrent Creation Tool + + + + 9 + + + 6 + + + + + + 0 + 27 + + + + + 16777215 + 27 + + + + + Sans Serif + 14 + 75 + false + true + false + false + + + + Create Torrent file + + + Qt::AlignCenter + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 16777215 + 26 + + + + <center>Destination torrent file:</center> + + + txt_destination + + + + + + + + 16777215 + 26 + + + + <center>Input file or directory:</center> + + + txt_input + + + + + + + + 16777215 + 70 + + + + <center>Announce url:<br>(One per line)</center> + + + + + + + + + + <center>Comment:</center> + + + txt_comment + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + + + ... + + + + + + + + + 0 + + + 6 + + + + + + + + Directory + + + + + + + ... + + + + + + + + + + + + false + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + Create + + + + + + + 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..682887c55 --- /dev/null +++ b/src/createtorrent_imp.cpp @@ -0,0 +1,136 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include + +#include +#include +#include + +#include "libtorrent/entry.hpp" +#include "libtorrent/bencode.hpp" +#include "libtorrent/torrent_info.hpp" +#include "libtorrent/file.hpp" +#include "libtorrent/storage.hpp" +#include "libtorrent/hasher.hpp" + +#include "createtorrent_imp.h" + +using namespace libtorrent; +using namespace boost::filesystem; + +createtorrent::createtorrent(QWidget *parent): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + show(); +} + +void createtorrent::on_browse_destination_clicked(){ + QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+" (*.torrent)"); + if(!destination.isEmpty()){ + txt_destination->setText(destination); + } +} + +void createtorrent::on_browse_input_clicked(){ + // Can't use QFileDialog static functions for this because + // user can select a file or a directory + QFileDialog *fd = new QFileDialog(this, tr("Select input directory or file"), QDir::homePath()); + if(checkDirectory->isChecked()){ + fd->setFileMode(QFileDialog::DirectoryOnly); + }else{ + fd->setFileMode(QFileDialog::ExistingFile); + } + QStringList fileNames; + if (fd->exec()){ + fileNames = fd->selectedFiles(); + txt_input->setText(fileNames.first()); + } +} + +// Subfunction to add files to a torrent_info structure +// Written by Arvid Norberg (libtorrent Author) +void add_files(torrent_info& t, path const& p, path const& l){ + path f(p / l); + if (is_directory(f)){ + for (directory_iterator i(f), end; i != end; ++i) + add_files(t, p, l / i->leaf()); + }else{ + t.add_file(l, file_size(f)); + } +} + +// Main function that create a .torrent file +void createtorrent::on_createButton_clicked(){ + QString destination = txt_destination->text(); + if(destination.isEmpty()){ + QMessageBox::critical(0, tr("No destination path set"), tr("Please type a destination path first")); + return; + } + QString input = txt_input->text(); + if(input.isEmpty()){ + QMessageBox::critical(0, tr("No input path set"), tr("Please type an input path first")); + return; + } + if(!QFile::exists(input)){ + QMessageBox::critical(0, tr("Input path does not exist"), tr("Please type a correct input path first")); + return; + } + char const* creator_str = "qBittorrent"; + int piece_size = 256 * 1024; + try { + torrent_info t; + path full_path = complete(path(input.toStdString().c_str())); + ofstream out(complete(path(destination.toStdString().c_str())), std::ios_base::binary); + + add_files(t, full_path.branch_path(), full_path.leaf()); + t.set_piece_size(piece_size); + + storage st(t, full_path.branch_path()); + QStringList trackers = txt_announce->toPlainText().split('\n'); + for(int i=0; i buf(piece_size); + for (int i = 0; i < num; ++i) + { + st.read(&buf[0], i, 0, t.piece_size(i)); + hasher h(&buf[0], t.piece_size(i)); + t.set_hash(i, h.final()); + } + // Set qBittorrent as creator and add user comment to + // torrent_info structure + t.set_creator(creator_str); + t.set_comment(txt_comment->toPlainText().toStdString().c_str()); + // create the torrent and print it to out + entry e = t.create_torrent(); + libtorrent::bencode(std::ostream_iterator(out), e); + } + catch (std::exception& e){ + std::cerr << e.what() << "\n"; + } + QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+destination); + hide(); +} diff --git a/src/createtorrent_imp.h b/src/createtorrent_imp.h new file mode 100644 index 000000000..81b44700b --- /dev/null +++ b/src/createtorrent_imp.h @@ -0,0 +1,40 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef CREATE_TORRENT_IMP_H +#define CREATE_TORRENT_IMP_H + +#include +#include "ui_createtorrent.h" + +class createtorrent : public QDialog, private Ui::createTorrentDialog{ + Q_OBJECT + + public: + createtorrent(QWidget *parent = 0); + + protected slots: + void on_browse_destination_clicked(); + void on_browse_input_clicked(); + void on_createButton_clicked(); +}; + +#endif diff --git a/src/doc/qbittorrent.1.gz b/src/doc/qbittorrent.1.gz new file mode 100644 index 0000000000000000000000000000000000000000..4158bdd6f82e8944ea2181d05a93bba6c854a0fe GIT binary patch literal 485 zcmV1al z^9Z6hd?xSVQ*RNjCzE$DX%?w~7JlPl2G z63&~Xbn8W+VWbLbBA%%U=qxYH0eRwV8X(qiaE5wL$OH9Z(09nB$-l7R{P)U-5%{1A zgCo!ZeBX8C7}Hx_QpIw-KkV-uadPNiv=1)N$Q& b-p?nvEeFqsv$7<)`cC`-#Jwr;6axSN?O5_= literal 0 HcmV?d00001 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..aceef2473 --- /dev/null +++ b/src/downloadFromURLImp.h @@ -0,0 +1,76 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADFROMURL_H +#define DOWNLOADFROMURL_H + +#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"))); + connect(this, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), parent, SLOT(downloadFromURLList(const QStringList&))); + show(); + } + + ~downloadFromURL(){} + + signals: + void urlsReadyToBeDownloaded(const QStringList& torrent_urls); + + public slots: + void on_downloadButton_clicked(){ + QString urls = textUrls->toPlainText(); + QStringList url_list = urls.split("\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); + close(); + } + + void on_cancelButton_clicked(){ + close(); + } +}; + +#endif diff --git a/src/downloadThread.h b/src/downloadThread.h new file mode 100644 index 000000000..94a644e6c --- /dev/null +++ b/src/downloadThread.h @@ -0,0 +1,119 @@ +/* + * 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. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADTHREAD_H +#define DOWNLOADTHREAD_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "misc.h" + +class downloadThread : public QThread { + Q_OBJECT + + private: + QStringList url_list; + QMutex mutex; + QWaitCondition condition; + + signals: + void downloadFinished(QString url, QString file_path, int return_code, QString errorBuffer); + + public: + downloadThread(QObject* parent) : QThread(parent){} + + void downloadUrl(const QString& url){ + mutex.lock(); + url_list << url; + mutex.unlock(); + if(!isRunning()){ + start(); + } + } + + void run(){ + forever{ + mutex.lock(); + if(url_list.size() != 0){ + QString url = url_list.takeFirst(); + mutex.unlock(); + CURL *curl; + std::string filePath; + int return_code; + // XXX: Trick to get a unique filename + QTemporaryFile *tmpfile = new QTemporaryFile; + if (tmpfile->open()) { + filePath = tmpfile->fileName().toStdString(); + } + delete tmpfile; + FILE *file = fopen(filePath.c_str(), "w"); + if(!file){ + std::cout << "Error: could not open temporary file...\n"; + return; + } + // Initilization required by libcurl + curl = curl_easy_init(); + if(!curl){ + std::cout << "Error: Failed to init curl...\n"; + fclose(file); + return; + } + // Set url to download + curl_easy_setopt(curl, CURLOPT_URL, (void*) url.toStdString().c_str()); + // Define our callback to get called when there's data to be written + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, misc::my_fwrite); + // Set destination file + curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); + // Some SSL mambo jambo + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + // We want error message: + char errorBuffer[CURL_ERROR_SIZE]; + return_code = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); + if(return_code){ + std::cout << "Error: failed to set error buffer in curl\n"; + fclose(file); + QFile::remove(filePath.c_str()); + return; + } + // Perform Download + return_code = curl_easy_perform(curl); + // Cleanup + curl_easy_cleanup(curl); + // Close tmp file + fclose(file); + emit downloadFinished(url, QString(filePath.c_str()), return_code, QString(errorBuffer)); + }else{ + mutex.unlock(); + break; + } + } + } +}; + +#endif diff --git a/src/icons.qrc b/src/icons.qrc new file mode 100644 index 000000000..0be651625 --- /dev/null +++ b/src/icons.qrc @@ -0,0 +1,67 @@ + + + Icons/home.png + Icons/log.png + Icons/style.png + Icons/wizard.png + Icons/button_cancel.png + Icons/smile.png + Icons/qbittorrent16.png + Icons/stare.png + Icons/filter.png + Icons/encrypted.png + Icons/locale.png + Icons/proxy.png + Icons/systemtray.png + Icons/button_ok.png + Icons/unhappy.png + Icons/qbittorrent22.png + Icons/splash.jpg + Icons/qbittorrent32.png + Icons/skin/url.png + Icons/skin/pause_all.png + Icons/skin/play_all.png + Icons/skin/remove.png + Icons/skin/settings.png + Icons/skin/open.png + Icons/skin/disconnected.png + Icons/skin/delete.png + Icons/skin/connected.png + Icons/skin/play.png + Icons/skin/properties.png + Icons/skin/downloading.png + Icons/skin/search.png + Icons/skin/exit.png + Icons/skin/pause.png + Icons/skin/firewalled.png + Icons/skin/seeding.png + Icons/skin/paused.png + Icons/skin/connecting.png + Icons/skin/add.png + Icons/skin/stalled.png + Icons/skin/new.png + Icons/skin/delete_all.png + Icons/skin/info.png + Icons/skin/preview.png + Icons/flags/netherlands.png + Icons/flags/china.png + Icons/flags/bulgaria.png + Icons/flags/china_hong_kong.png + Icons/flags/france.png + Icons/flags/germany.png + Icons/flags/greece.png + Icons/flags/south_korea.png + Icons/flags/poland.png + Icons/flags/portugal.png + Icons/flags/slovakia.png + Icons/flags/sweden.png + Icons/flags/turkey.png + Icons/flags/italy.png + Icons/flags/united_kingdom.png + Icons/flags/romania.png + Icons/flags/russia.png + Icons/flags/spain.png + Icons/flags/ukraine.png + Icons/flags/spain_catalunya.png + + \ No newline at end of file diff --git a/src/lang.qrc b/src/lang.qrc new file mode 100644 index 000000000..955b986f8 --- /dev/null +++ b/src/lang.qrc @@ -0,0 +1,24 @@ + + + lang/qbittorrent_fr.qm + lang/qbittorrent_zh.qm + lang/qbittorrent_en.qm + lang/qbittorrent_es.qm + lang/qbittorrent_pl.qm + lang/qbittorrent_ko.qm + lang/qbittorrent_de.qm + lang/qbittorrent_ru.qm + lang/qbittorrent_ca.qm + lang/qbittorrent_nl.qm + lang/qbittorrent_uk.qm + lang/qbittorrent_tr.qm + lang/qbittorrent_sv.qm + lang/qbittorrent_el.qm + lang/qbittorrent_bg.qm + lang/qbittorrent_sk.qm + lang/qbittorrent_ro.qm + lang/qbittorrent_it.qm + lang/qbittorrent_zh_HK.qm + lang/qbittorrent_pt.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..f1e4d368768edc1e3685d6b49e189f370831c0b5 GIT binary patch literal 15174 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 + + @default + + b + bytes + b + + + KB + КB + + + MB + MB + + + GB + GB + + + + AboutDlg + + About qBittorrent + Относно qBittorrent + + + About + Относно + + + 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 + + + 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>WEB-страница:</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 + + + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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/с + + + 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... + Грешка при търсене... + + + 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... + + + + + 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 + + + + + PropListDelegate + + False + Грешка + + + True + Вярно + + + + QTextEdit + + Clear + Изтрий + + + + 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 + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Парола: + + + Log in + + + + Cancel + Прекъсни + + + + 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> + + + + 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: + Торента бе създаден успешно: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Свали + + + Cancel + Прекъсни + + + Download from urls + + + + + 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) + Неизвестен + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Прекъсни + + + + 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: + Общо качени: + + + Total downloaded: + Общо свалени: + + + Total failed: + Общо неуспешни: + + + Torrent content + Съдържание на Торента + + + Options + Опции + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_ca.qm b/src/lang/qbittorrent_ca.qm new file mode 100644 index 0000000000000000000000000000000000000000..44264f59f01a9c43370ca6c8e971e273f9ed38ae GIT binary patch literal 15391 zcmcIr33%1jl|NbT%gf8lOAIkYOfeux2oOL8HB#2FNCOB4oT7tf176MM%Zq@tF4a0! zGmaltT&kT?ZB_JBTeag>ciI_dR9qOXQ!Os7)j>L+*6CnJI=|mJ|Nq+)Y`<^F$2)oV zp1YlU_Ionx;g0IvzrW@B=f~7MdG3y%y*XbbI88(V^Qhfg>k!3Ff{9(= zA_awV;=AtyPLf5JzW~@Gi?=@qxW$9F$dXN`;QNnd>7;K0?w01ut_OTuPQSSW@DBzH zYh>l#c9FtUJ=o#FZ+Y-GX}Rnw^gk?X1~InpM$V%MRNZGOf0ARB`xNj|BuRQV^<_X*^`*#9A z@T7e9WFzh}oHy^a2Eg{b=84yW4+443d&dG!%8Spye8DAoPrtAS@Q((IkImb)b%aQ9 zQ{MA~_X76jeK4vO@Y=i&?q~u0Wqws1)(b`Q>;KdTcuM}9pVtGf&tKb93HW0EKnd+X9MaBD&99fg3uD!BAQ(66+lU@#x^l-3u#H1Tr4e<&=!_j`a379RQP za*@c0!j-$10zO{2^(UA=@@C=SeQhFTg@res_Bh~C9-QmJUJu^p!B-0JeE5gJJ5YGf zWWe%*!sj~n0oD}miN6DQQsL{DV;|)$h5tD<1bCjCumtofzruCAfc=*L+HL%o2Stu( za2r1dza6pA4Y(G-v)y;UeIwuwcT1!L@L_k$B<%l)U%OkTY!ayuxAW>}0mry|3LtY8 zGu=bgn7?AR+uKqA_(q`eUGT{W7Z|l1_dH^a2X760`DEPZh*tv(o_+)HkAVd*d?Hd= z6wg%tD_tyenUvWF&$AQ7`juts`V&LZAHUQ2K z-1XsVz>5P9ZhH=JPvF6Wgntg~`q|e+s@ej(Z<`IcDe#-=Xs_Ds!GlHlCxFf)tBa~u z;~qw?EUJrK0=T*8j0*7S$eW5{S3e5)Owo03<2)nx7G3u#?yY)s(T;5&iX1gi^wK!O zZAJfn2>f`|BSr761^!X*1Sfye3$;}mockl3chrr+1s9`z)SJPtJa7%*e+O5UL2n%$ z4YqT>qpt{Fw*3I$r@`%&H;dGq9Na#75b&$PM?b#_@S@<;Z(j)b-QezLL5G^%#eu8O z0eru>Y|L*&zBI15?t-@fw-!$v{2JiC;uC)WdW_lpL=J)s%PAg5zCgihK}33y}Zq(hM7F?&O^4}wp|&J3NkrvmUB zp|jq42=M+;+wVF7-wt)m0{*eVP|uOq0*(*$*F^xAgf{O#1lSq6Y|2G|SB0)@#lDVx zC3NNB3xEegx7J)EGOi?a=i`ll>q7U={tR%ygSUr%dck}6{)>|0Em&vVuS&i#3v?X! zr;>{&eoth4UCH0=*ao<`-bN@NAJE)fYAxHY`!-wpsi z8eX*q`1D;Y13q5*#53T7$pw+=7lZF7*F|R5 z9Rl1HSz3RY$ds{>wY?_-o)OuyZ~|aoWb31I0AGp>z7P{>SRT1!Df%1EkNkM>a=@1( z58S;@Wa<%-kGlw0MLwS~3UHuoWVj#j&a#>_!4FgSmfi6b)|n<{J1=$E9AB1t!?Qn+~aX`nkCsMMa+hE=vzxK!SBE2Isp zbpmJo6DccnNNehZJ6v{O!Rjd2%Ir!ug>Vq?1plM)?sL5<7GMh?4w@c$NSh)c;X>)a zxs-<-9k)csB5mHxG3eMcUOU1VF;BiG0~iHj!m-ol(`5-3>z7(IcjB`jpI!J*7L9^N zJ-VG*4C_H}H(KKOA4}l3p{HNY$7d%emIg;(QKznf@0{LQt5*Zk@$TSCD%xmS0JK)j z*oO|zd;z|7VRg=j6TsJ0#8Kc8Fb#g9@(Iu=M{ymB%Z4MWNFik;y&qmi@w~R)fp}9F zMGHP^CQ7m~g6aBn)plDI9;{-A!780trxUaT-Qdt_b5IuPF2Td_ZMCTqO=Lmad|WQX zZ}Ak4fbTmro}){w-62s4ld00r!DUU&&C&jNQ)gG_hSqo|&HHUT(2 z_(mS*1#>jfat&?yUKxg1&sk%kT#g>8_tDZRB&qTD>c zK{xr`&{e5BhBJy%tJh}a zCqYd@O;16g@;VXmc>6pZhw0au(qxE82!|ADzDGLlFqL#YnAsf7kcfSgl{kY~X zoj6Y2j+ja(YldjWaA(F7?U;fGrlf38z90vYPW!&W{E$suIe@nj3JKPo<9HU2%)~ocs zHeiv{z&y1{4dEDCDpCcyrpgL*F4WauzLrt1g zgAAD!w<-CI}RDEDp^} zfwA$Bjjw&P*9g~-Sp-F1=cyBFv^ESQ0Zh-DBylaCi7QjzQSEf-8BG&s3PL(3U{^>} z=t5Pp22*u`s?>o4x;yA8$NYtdpbnL8c|ua&9TOXhFcaKOrL#}vkCMs@h{+rbnS!4o z*wHZ~q7#f(8j|OHS)z*OnaGn}jwusGtN{YoYV$7B6f(^X20La{6m4vZ*&xkmgY2FX zYdEG|6uAQWki;ePnU9IHBNwBc5d;Vg$^VYY8SSVZO4}!;fr*>paW%K2C^euf?Wo!m zY{tJ)HBOGHA4OZ^QQEw^B&BodxqhXQI^Bo83Fee^fpIFAyi5|6nuLpVL%yggYawZL z|CxGH^h%KC1ZcQvG6SE}GbVy)+;)+TtIy5Y;vPRt!D zTFB#98Z;&nwXqyxM@gh4@kHt2FY|~)qm{J|#5Z>K#G~!4@n~<4xZ%+&+hd*Zm|J>d zF%0q}?BU0hcl2)R>FRCmSQP8+UcIV$xHXc?hj1uzACBXg0@Wi#(zTFdPSiV_`2qjmq8OhzL(PA$1&8)9?vP6ghZ<$G8uXzQw z7=_Bm>CpVS#g&Z-=XAKJ!dz7oD(WgdpJPJVn|lG8EF_3I=9jgZ#-j-x)M!~pa!fxf zT9pzu7s4ddB~{pCui9I)$&3XdjF@4{CY>Ra)B}#$Yi+Dd2onX=OeDr2sjb}?Vhp_u zhFb%m3RR@9LwJEn*N8ZDolG@TMW;H^bP_Z;mB~Z&&@PAY<0V=o8_}Y^o;G;E47#J-Zx>O?bg)o7W9}NG{U#1c-^W*9kcg3;baZKdU3cY zj!VsKjz5QUffm)@oE)^Kku6!)8tpkV+5@Q;P5%Go(t)6;oLetoOnyobZd42 z$HqqSlA;~QV2%}{&xQ!}Hvx^>ue7a*MytFA|P|m~*ZJZpBZrWtNTc$o^aFwdh7)JQcBLgmS zAEUXL^qr& z`2b@Au0VQE!cRlORSc#4MnUP5Ef__uzEM}Z3uBIl+dfTZ;!;?pR)9x%>~<7lP>m{Q;AK=VuO=maG)}WLna4nQI90UKh;-943B1ijw#e~iRS^$M z3&+P-MZLtc^_j7+Z}+nEPn7-i_?7HT#mB9uXQnLBFiW55kr?(I$M;{|3S_uop_;{?7(6gPQ%*B*LqvLC`c5F=3*{Ou{W2t>u+1J|xxOe(xw0pJS zP=4AW?Xe+A_RO3h_JW6NU9tl5YzDr_j>uQ|TA>l9U9 zp71p6Es@(GiSZDx2#jP?vfbDu1(C<=2h!+4MXG>AW+)}cr+e)jr!!D1F#~FmAYF%j z`ki7-x#0`HHy5{>p4#QJzjhuEavIf{!C?x>zi5(=nvvFyYfxE{JLfpo3h3bGoKAE) z*KopI3O4HGKluYpnK#CiFam^s8oFgDz5?W{&)nSR907$%CTI&UrlZ z#eIE}$=JSp!|prQOz1?Tz_B0Ug2+&5={K&1f(k{7c&;%O|L^SO$liNcS}_!cK1U9P z;1V6j4fBvk!@z_xvw^JM(53#`6qFr*h*Th12W26;z+4s9*|{^wDx%D^_yXOeB7cU8 zGhZp`5U{dDrz!{GXfia5Xk92a@hHadnIqJiI98u%2NR5&aT`=TN&9Un8fM&MK)v7c zdP|4p#&q+Ya{IZt57jQZ{#ehTn00T$_R>uPw3%Z`j3PIt$R%}=#f5yN^B=1$c*>TF zM#p*@on#Qt#FRzG#q>0K)z`3rY|G3su!WMGtq$4F{W2A7FAU5a(u<+l^)v3iJ;pVNG5NZ4+%0<-IPWjZ4Nr zJI27o@hLXZv8YL>sY_^hd&WqmiZQL{AvxAR>5$_vB*_p%T3!rz>meOb1DT>DZx2E= zR~KMYG?df?tfNx2iWGBY)Q&n9S7~Q;?pFmcFYB(n@#fMo2W%w?pEwp{Y3C@-LAHS) zrhpri`mGR6um~!(6lpd#%59P3%qR_)uT4>BN?lBZQZJpT+%wH~YA6iH>Mw7X7LocE zn}IA#!nAWqPWfY~PiNc2fiaEGuO=RuF``b1>N1@&oFe}q7K+WZ*?%auJ2p|>ffxcFgtcuQ?xwcaD?!Me}VN982tUs&Tl5K6QtwL#VhK62i9%Y)7_fbgaZv z^l}`JMxk9}9|ReW#d+FQk){jOvvRE1^Om9G#-f7syqUFn$$!VfK1I(iTcDCMrKB|i zj)$UY-##N2~bTmy6$LyyExWS z4vm=XK09ZmKqrJ2Bv-t^Vb~Nr-+Nqt4;z%y?6g_^{dTK|N zYL_Gh5+hLr>P?$zra&T8hH7V}7ZRkDf^c#ajB0nadd2DP0&fE-s3rAKPS;yx%9GBl zMQOMd$1+nznXKZUD6j!Ne1C@0YGn`~XgougoK>khj4!CZ>rFmx(ZlmFkQORQbD3GS zdU$-7Kuc$NdLPNkAu@b}WBsenn5s}&46BV}K@+nFWY(Nz8IBdRihLuCCLL~iEtcgm zBSN|I^&nOM2Kiq*mrATfvh-@`s_^XgmPt&j@UTh|#>6BcJr6(nHFH7>Y%As5Ajr&O zUfp8TU#OhZxye`1rKkzk>1JlR(A1f}-$R+l>!dpU>A@O{iFJZ;-hRw4^es}VvLKhR z=2+2ZfrG!u%TjhCml}*E%R0@dlu(}f!nl6J!IGWA`50@-($_z8?jgK_khwV@kr}~jBvewP5!sf_mmN4R{>N~Vpf`;O0 z`h#1vrv~#ijk(fwmR01ia$6@i*WKqe)6+JLx0`UN9ZS4*Kt+nT=-r`X-M4mTyXHQJ z`*w!3NnM2=Kex|zV~lKT6>}^o*9Bsp%e7C1#{`Tg_9xBG;U(f?#j>L@MEs(z=p4r? zc3s>YJ3me`6{kAOvB2FU!2eG{CM)N4ffLiD!t6aCCz5%)OqZ3?z=C@nP9ffiIuMJ> z4WdSjGRivZ{dI^{0cCq-i*QYz zyW#jp0g8P1f;9f!fTFGkyHF14P+E~cdX@zdjD#enoEObJX>WqO_PH)}uZ!&a($tjA07M}9LyYP3P>Lr6L_!ABtHg1Sv zesYhNoam1>=1s*L&H=dr4#VO9<>f#L=4i`oIwG?n@%^a8Z^>WAB!BgOt538XkM|pa z=kvw>;qQO&Z;^gB>*w$v_`Aws{b*pAorAf22^I^nCmcMku8&pr|j_c|o)je + + @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> + + + 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 usant Qt4 i libtorrent, programat en C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br><u>Web:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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 + + + + 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 + Descarregant + + + Please wait... + + + + + 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 + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Fals + + + True + Cert + + + + QTextEdit + + Clear + Neteja + + + + 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 + + + + Sorry, we can't preview this file + + + + Name + Nom + + + Size + Mida + + + Progress + Progrès + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Contrasenya: + + + Log in + + + + Cancel + Cancelar + + + + 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> + + + + 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: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Descàrrega + + + Cancel + Cancelar + + + Download from urls + + + + + 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 + + + h + hours + + + + d + days + + + + Unknown + Unknown (size) + Desconegut + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Cancelar + + + + 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: + + + Total downloaded: + Total Descarregat: + + + Total failed: + Total fallats: + + + Torrent content + Contingut del torrent + + + Options + Opcions + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_de.qm b/src/lang/qbittorrent_de.qm new file mode 100644 index 0000000000000000000000000000000000000000..ba5ef0dd9d066eed510196bf2c3c87e9b0ee7d60 GIT binary patch literal 15006 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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..84456e0cc --- /dev/null +++ b/src/lang/qbittorrent_de.ts @@ -0,0 +1,1621 @@ + + + AboutDlg + + About qBittorrent + Über qBittorrent + + + About + Info + + + 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> + 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://qbittorrent.sourceforge.net</i><br> + + + 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: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + 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: + + + Start IP + + + + End IP + + + + Origin + Ursprung + + + Comment + Kommentar + + + Apply + Anwenden + + + IP Filter + + + + Add Range + Bereich hinzufügen + + + Remove Range + Bereich entfernen + + + ipfilter.dat Path: + ipfilter.dat Path: + + + 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 + + + OSD + + + + 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/s + + + + 1 KiB DL = + + + + KiB UP max. + KiB UP max. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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: + + + KiB/s + + + + 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 + + + + 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 + Lade + + + Please wait... + + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: Von Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Gesamte DL Geschwindigkeit: + + + Kb/s + Kb/s + + + Total UP Speed: + Gesamte UP Geschwindigkeit: + + + 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: + + + Stop + + + + Leechers + Leecher + + + Search Engine + Such-Maschine + + + Download from URL + Download von URL + + + Download + + + + Clear + Leeren + + + KiB/s + + + + Create torrent + Erstelle Torrent + + + Ratio: + Verhältnis: + + + Update search plugin + "Such"-Plugin updaten + + + Session ratio: + Sitzungs Verhältniss: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Falsch + + + True + Wahr + + + + QTextEdit + + Clear + Leeren + + + + 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 + + + + Sorry, we can't preview this file + + + + Name + Name + + + Size + Grösse + + + Progress + Fortschritt + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Kennwort: + + + Log in + + + + Cancel + Abbrechen + + + + 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> + + + + 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: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + + + + Cancel + Abbrechen + + + Download from urls + + + + + misc + + B + bytes + + + + KiB + kibibytes (1024 bytes) + + + + MiB + mebibytes (1024 kibibytes) + + + + GiB + gibibytes (1024 mibibytes) + + + + TiB + tebibytes (1024 gibibytes) + + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + Unknown + Unbekannt + + + h + hours + + + + d + days + + + + Unknown + Unknown (size) + Unbekannt + + + + 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 + + + I/O Error + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Abbrechen + + + + 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: + + + Total downloaded: + Gesamter Download: + + + Total failed: + Insgesamt fehlgeschlagen: + + + Torrent content + Torrent Inhalt + + + Options + Optionen + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_el.qm b/src/lang/qbittorrent_el.qm new file mode 100644 index 0000000000000000000000000000000000000000..86f7f48fe4fee098ab43f6e0aceca8f1180332a9 GIT binary patch literal 16128 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 + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + About qBittorrent + Σχετικά με το qBittorrent + + + About + Σχετικά + + + 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 Δημιουργός + + + 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://qbittorrent.sourceforge.net</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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... + + + + + 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 + + + + + PropListDelegate + + False + Λανθασμένο + + + True + Σωστό + + + + QTextEdit + + Clear + Καθάρισε + + + + 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 + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Κωδικός: + + + Log in + + + + Cancel + + + + + 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> + + + + 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: + Τόρεντ δημιουργήθηκε επιτυχώς: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Κατέβασμα + + + Cancel + + + + Download from urls + + + + + 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) + Άγνωστο + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + + + + + 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: + Σύνολο ανεβασμένων: + + + Total downloaded: + Σύνολο κατεβασμένων: + + + Total failed: + Σύνολο αποτυχημένων: + + + Torrent content + Περιεχόμενο τορεντ + + + Options + Ρυθμίσεις + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_en.qm b/src/lang/qbittorrent_en.qm new file mode 100644 index 0000000000000000000000000000000000000000..6bd22c41dfd987e516ede9d5e79a545715d2ad8c GIT binary patch literal 337 rcmcE7ks@*G{hX<16=n7(EZlq7i2(>QL4-a71EUecbP#hC5FY{nJdg@w literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_en.ts b/src/lang/qbittorrent_en.ts new file mode 100644 index 000000000..a38812eb8 --- /dev/null +++ b/src/lang/qbittorrent_en.ts @@ -0,0 +1,1273 @@ + + + AboutDlg + + About qBittorrent + + + + About + + + + Author + + + + 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://www.qbittorrent.org</i><br> + + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + + + + Student in computer science + + + + + DLListDelegate + + KiB/s + + + + + Dialog + + Options -- qBittorrent + + + + Options + + + + Main + + + + Save Path: + + + + Download Limit: + + + + Upload Limit: + + + + Max Connects: + + + + Port range: + + + + ... + + + + Disable + + + + connections + + + + Proxy + + + + Proxy Settings + + + + Server IP: + + + + 0.0.0.0 + + + + Port: + + + + Proxy server requires authentication + + + + Authentication + + + + User Name: + + + + Password: + + + + Enable connection through a proxy server + + + + OK + + + + Cancel + + + + Scanned Dir: + + + + Enable directory scan (auto add torrent files inside) + + + + Connection Settings + + + + Share ratio: + + + + Activate IP Filtering + + + + Filter Settings + + + + Start IP + + + + End IP + + + + Origin + + + + Comment + + + + Apply + + + + IP Filter + + + + Add Range + + + + Remove Range + + + + ipfilter.dat Path: + + + + Ask for confirmation on exit + + + + Go to systray when minimizing window + + + + Misc + + + + Localization + + + + Language: + + + + Behaviour + + + + OSD + + + + Always display OSD + + + + Display OSD only if window is minimized or iconified + + + + Never display OSD + + + + KiB/s + + + + 1 KiB DL = + + + + KiB UP max. + + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + + + + 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? + + + + Finished + + + + Checking... + + + + Connecting... + + + + Downloading... + + + + Download list cleared. + + + + All Downloads Paused. + + + + All Downloads Resumed. + + + + 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. + + + + Listening on port: + + + + qBittorrent + + + + Are you sure? -- qBittorrent + + + + <b>qBittorrent</b><br>DL Speed: + + + + <b>Connection Status:</b><br>Online + + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</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... + + + + Are you sure you want to quit? -- qBittorrent + + + + Are you sure you want to quit qbittorrent? + + + + KiB/s + + + + Search is finished + + + + An error occured during search... + + + + Search aborted + + + + Search returned no results + + + + 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... + + + + + MainWindow + + Log: + + + + Total DL Speed: + + + + Total UP Speed: + + + + &Options + + + + &Edit + + + + &File + + + + &Help + + + + Open + + + + Exit + + + + Preferences + + + + About + + + + Start + + + + Pause + + + + Delete + + + + Pause All + + + + Start All + + + + Documentation + + + + Delete All + + + + Torrent Properties + + + + Connection Status + + + + Search + + + + Search Pattern: + + + + Status: + + + + Stopped + + + + Search Engines + + + + Results: + + + + Stop + + + + Download from URL + + + + Download + + + + Clear + + + + KiB/s + + + + Create torrent + + + + Update search plugin + + + + Session ratio: + + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + + + + True + + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + + + + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + + + + Size + + + + Progress + + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + + + + Log in + + + + Cancel + + + + + createTorrentDialog + + Create Torrent file + + + + ... + + + + Create + + + + Cancel + + + + Directory + + + + Torrent Creation Tool + + + + <center>Destination torrent file:</center> + + + + <center>Input file or directory:</center> + + + + <center>Announce url:<br>(One per line)</center> + + + + <center>Comment:</center> + + + + + 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: + + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + + + + Cancel + + + + Download from urls + + + + + misc + + B + bytes + + + + KiB + kibibytes (1024 bytes) + + + + MiB + mebibytes (1024 kibibytes) + + + + GiB + gibibytes (1024 mibibytes) + + + + TiB + tebibytes (1024 gibibytes) + + + + m + minutes + + + + h + hours + + + + Unknown + + + + h + hours + + + + d + days + + + + Unknown + Unknown (size) + + + + + options_imp + + Options saved successfully! + + + + Choose Scan Directory + + + + Choose save Directory + + + + Choose ipfilter.dat file + + + + I/O Error + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + + + + + properties + + Torrent Properties + + + + File Name + + + + Current Session + + + + Download state: + + + + OK + + + + Finished + + + + Queued for checking + + + + Checking files + + + + Connecting to tracker + + + + Downloading 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. + + + + Tracker + + + + Trackers: + + + + None - Unreachable? + + + + Errors: + + + + Progress + + + + Main infos + + + + Number of peers: + + + + Current tracker: + + + + Total uploaded: + + + + Total downloaded: + + + + Total failed: + + + + Torrent content + + + + Options + + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_es.qm b/src/lang/qbittorrent_es.qm new file mode 100644 index 0000000000000000000000000000000000000000..4484d13ff09b4424b20a5abe9dac58e9b008fd23 GIT binary patch literal 16494 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_es.ts b/src/lang/qbittorrent_es.ts new file mode 100644 index 000000000..fce97c5ff --- /dev/null +++ b/src/lang/qbittorrent_es.ts @@ -0,0 +1,1645 @@ + + + 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 + + + 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 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://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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 + + + 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 + Descargando + + + Please wait... + + + + + 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: + Media en sesión: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Falso + + + True + Verdadero + + + + QTextEdit + + Clear + Limpiar + + + + 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 + + + + Sorry, we can't preview this file + + + + Name + Nombre + + + Size + Tamaño + + + Progress + Progreso + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Contraseña: + + + Log in + + + + Cancel + Cancelar + + + + 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> + + + + 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: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Descargar + + + Cancel + Cancelar + + + Download from urls + + + + + 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 + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Cancelar + + + + 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: + + + Total downloaded: + Descarga Total: + + + Total failed: + Fallos Totales: + + + Torrent content + Contenido del torrent + + + Options + Opciones + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_fr.qm b/src/lang/qbittorrent_fr.qm new file mode 100644 index 0000000000000000000000000000000000000000..5c4c67a5658f4817c8352bafdb5bc5191ae7e388 GIT binary patch literal 18929 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_fr.ts b/src/lang/qbittorrent_fr.ts new file mode 100644 index 000000000..55c249033 --- /dev/null +++ b/src/lang/qbittorrent_fr.ts @@ -0,0 +1,1753 @@ + + + @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> + + + + 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> + + + qBittorrent Author + Auteur de qBittorrent + + + 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 utilisant 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> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + Date de naissance : + + + Occupation: + Emploi : + + + 03/05/1985 + + + + Student in computer science + Elève-ingénieur en génie informatique + + + + DLListDelegate + + KiB/s + Ko/s + + + + Dialog + + Options -- qBittorrent + Options -- qBittorrent + + + Options + Options + + + 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 + + + + Proxy Settings + Paramètres Proxy + + + Server IP: + IP du serveur : + + + 0.0.0.0 + + + + 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 : + + + OK + + + + 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 + + + OSD + + + + 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 : + + + + 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 + + + qBittorrent + + + + <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... + + + + 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 + &Options + + + &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 + + + Documentation + + + + 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 plugin de recherche + + + Session ratio: + Ratio dession : + + + Transfers + Transferts + + + Preview file + Prévisualiser fichier + + + Clear log + Effacer historique + + + + PropListDelegate + + False + Non + + + True + Oui + + + + QTextEdit + + Clear + Vider + + + + 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. + + + 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. + + + + authentication + + Tracker authentication + Authentification Tracker + + + Tracker: + Tracker : + + + Login + Identification + + + Username: + Nom d'utilisateur : + + + Password: + Mot de passe : + + + Log in + S'identifier + + + Cancel + Annuler + + + + 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> + + + + 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 : + + + + 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 + + + + 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 + + + + 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é + + + + 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 + + + + 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 + + + Tracker + + + + 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é : + + + 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) + + + diff --git a/src/lang/qbittorrent_it.qm b/src/lang/qbittorrent_it.qm new file mode 100644 index 0000000000000000000000000000000000000000..1044ff9afb4198c74469b83eac3faa01cc19cac4 GIT binary patch literal 15804 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

k%}b+2th3rM9bN|- znBt0Mvd7GtSM&i8kaR~l&EGLhtykogYP`w4+&5Co-O;rp2<+@DBiJ_I&3XS;T4*)t z$@}8s_lpfHz?=e@UP-p}H}p)UBg9yUC{pG>Ml+0fdb6 zX@>6@Xyts^UaQytpE6htUt7?w=cdHPoJO%?k?a6=dsCrHqE)dwKuP0!5ZdwiP!X$< zN@HW;3~Y3xQGw&KLxx*y!xt#DgMO+g7=?C{;w$Q?;rkVeR;7-2x)53q#TQm`K6MLU z$IxaxM`yZP=E0uk(08EXhVO4^!{iJ=%9>R{DY9eul7}MKd4~10@l|w0apj?(*UV0X zP&v6f^=iX+Mzq^9Y?>ttW!}w!>XBShWB5{uB5nnN|L>_f^FV=>pagd}sy#70-8D_e za*btBOLBXom7b2ncU*K@PD2L`d@Ve_7q21iL9qFFGT=An|-w;+OxUzyH(w zRhcLm#n*_TSH9UFUeChc^lyd?th!TT;^ja8uOQyq5sSC9UmjbFm#vEDx5Zmi-V%tU zy){tS*cQdx10C_UwrEQS-YP&=MN4zMp=o+seC^_e7&+3=*|8dRvBn1WECKJerXIFs ny>00gO0FI(vhf;BC@D=Nhi~af(7kgJYQ?moZ5^>FUex*@$DW6Y literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_it.ts b/src/lang/qbittorrent_it.ts new file mode 100644 index 000000000..85fde0674 --- /dev/null +++ b/src/lang/qbittorrent_it.ts @@ -0,0 +1,1485 @@ + + + AboutDlg + + About qBittorrent + Informazioni su qbittorrent + + + About + Informazioni + + + Author + Autore + + + Name: + Nome: + + + Country: + Paese: + + + E-mail: + E-Mail: + + + Home page: + Home page: + + + Christophe Dumez + Christophe dumez + + + France + Francia + + + Thanks To + Grazie a + + + 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 in Qt4 e libtorrent. Scritto in c++.<br><br>Copyright © 2006 di Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + 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 in Qt4 e libtorrent. Scritto in C++.<br> +<br> +Copyright © 2006 di Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + KB/s + + + + Dialog + + Options -- qBittorrent + Opzioni -- qbittorrent + + + Options + opzioni + + + Main + principale + + + Save Path: + Percorso di salvataggio + + + Download Limit: + Limite download: + + + Upload Limit: + Limite upload: + + + Max Connects: + Connessioni massime + + + Port range: + Intervallo di porte: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Disabilitare + + + 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 necessita di 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 controllate: + + + Enable directory scan (auto add torrent files inside) + Abilita controllo directory (aggiunge automaticamente i file torrent presenti) + + + Connection Settings + Impostazioni di connessione + + + Share ratio: + Percentuale di condivisione: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Attivare filtraggio IP + + + Filter Settings + Impostazioni del filtro + + + Start IP + IP d'inizio + + + End IP + IP di fine + + + Origin + Origine + + + Comment + Commento + + + Apply + Applica + + + IP Filter + Filtro IP + + + Add Range + Aggiungi serie + + + Remove Range + Rimuovi serie + + + ipfilter.dat Path: + Percorso di Ipfilter.dat: + + + Misc + Varie + + + Localization + Localizzazione + + + Language: + Lingua: + + + Behaviour + Apparenza + + + Ask for confirmation on exit + Chiedi conferma ed esci + + + Clear finished downloads on exit + Cancella i download finiti 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + Apri file torrent + + + Unknown + Sconosciuto + + + 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? + + + paused + In pausa + + + started + Iniziato + + + Finished + Finito + + + Checking... + Controllando... + + + Connecting... + Connettendo... + + + Downloading... + Scariciando... + + + Download list cleared. + Lista download vuota. + + + All Downloads Paused. + Tutti i download in pausa. + + + All Downloads Resumed. + Tutti i download ripresi. + + + DL Speed: + Velocità Download: + + + started. + Iniziato. + + + UP Speed: + Velocità upload: + + + Couldn't create the directory: + Impossibile creare la directory: + + + Torrent Files + Files torrent + + + already in download list. + <file> already in download list. + già nella lista dei download. + + + added to download list. + aggiunto alla lista download. + + + resumed. (fast resume) + ripreso. + + + Unable to decode torrent file: + Impossibile decodificare il file torrent: + + + removed. + <file> removed. + rimosso. + + + paused. + <file> paused. + in pausa. + + + resumed. + <file> resumed. + ripreso. + + + Listening on port: + In ascolto sulla porta: + + + qBittorrent + qBittorrent + + + 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 download. + + + 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 rierca. + + + Searching... + Ricerca... + + + Could not create search plugin. + Impossibile creare il plugin di ricerca + + + Stopped + Fermato + + + Torrent file URL + URL del file Torrent + + + Torrent file URL: + URL del file Torrent + + + 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? + + + Timed out + Time out + + + Error during search... + Errore nella ricerca... + + + KiB/s + Kb/s + + + KiB/s + Kb/s + + + Stalled + In stallo + + + 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 is Finished + Ricerca finita + + + Search plugin update -- qBittorrent + Aggiornamento del plugin di ricerca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Il plugin di ricerca può essere aggiornato, wuoi aggiornarlo? + +Changelog: + + + Sorry, update server is temporarily unavailable. + Spiacenti, il server degli aggiornamenti è 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 + + + + 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 + Scaricando + + + Please wait... + + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Velocità totale download: + + + Total UP Speed: + Velocità totale upload: + + + Name + Nome + + + Size + Dimensione + + + % DL + % scaricato + + + DL Speed + Velocità download + + + UP Speed + velocità upload + + + Status + Status + + + ETA + ETA + + + &Options + &Opzioni + + + &Edit + &Modifica + + + &File + &FIle + + + &Help + &Help + + + Open + Apri + + + Exit + Esci + + + Preferences + Preferenze + + + About + Informazioni + + + Start + Start + + + Pause + Pausa + + + Delete + Cancella + + + Pause All + Pausa tutti + + + Start All + Inizia tutti + + + Documentation + Documentazione + + + Delete All + Cancella tutti + + + Torrent Properties + Propietà del torrent + + + Connection Status + Status connessione + + + Downloads + Downloads + + + Search + Ricerca + + + Search Pattern: + Pattern di ricerca: + + + Status: + Status: + + + Stopped + Fermato + + + Search Engines + Motori di ricerca + + + Results: + Risultati: + + + Stop + Stop + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Motore di ricerca + + + Download from URL + Download da URL + + + Download + Download + + + Clear + Pulisci + + + KiB/s + Kb/s + + + Create torrent + Crea torrent + + + Ratio: + Percentuale: + + + Update search plugin + Aggiorna plugin di ricerca + + + Session ratio: + Percentuale di sessione: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Falso + + + True + Vero + + + + QTextEdit + + Clear + Pulisci + + + + 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: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Voglio inoltre ringraziare Sourceforge.Net per ospitare i files relativi al progetto.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Voglio anche ringraziare Jeffery Fernandez (developer@jefferyfernandez.id.au), il nostro creatore di RPM, per il suo grande lavoro.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Nome + + + Size + Dimensione + + + Progress + Progresso + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Password: + + + Log in + + + + Cancel + + + + + createTorrentDialog + + Torrent Creation Tool + Tool di creazione torrent + + + Create Torrent file + Crea file torrent + + + Destination torrent file: + Torrent file di destinazione: + + + Input file or directory: + File o directory di input: + + + Announce url (Tracker): + URL del tracker: + + + Comment: + Commento: + + + ... + ... + + + Directory + Directory + + + Create + Crea + + + Cancel + Annulla + + + <center>Destination torrent file:</center> + <center>Torrent file di destinazione:</center> + + + <center>Input file or directory:</center> + <center>File o directory di input:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>URL di annuncio:<br>(Una per riga)</center> + + + <center>Comment:</center> + <center>Comment</center> + + + + createtorrent + + Select destination torrent file + Scegliere il file torrent di destinazione + + + Torrent Files + Files torrent + + + Select input directory or file + Seleziona la directory o il file di input + + + No destination path set + Nessun percorso di salvataggio definita + + + Please type a destination path first + Per favore inserire un percorso di destinazione + + + No input path set + Nessun percorso di input specificata + + + Please type an input path first + Per favore inserire un percorso di input + + + Input path does not exist + Il percorso in ingresso non esiste + + + Please type a correct input path first + Per favore inserire un percorso di input corretto + + + Torrent creation + Creazione di torrent + + + Torrent was created successfully: + Il torrent è stato creato correttamente: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Download + + + Cancel + + + + Download from urls + + + + + 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 + gg + + + h + +hours + h + + + Unknown + Sconosciuto + + + m + minutes + m + + + h + hours + h + + + Unknown + Unknown (size) + Sconosciuta + + + + options_imp + + Options saved successfully! + Opzioni salvate correttamente! + + + Choose Scan Directory + Scegliere la directory da scansire: + + + Choose save Directory + Scegliere la cartella dei download + + + 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 range IP: + + + Start IP: + IP di partenza: + + + Incorrect IP + IP non corretto + + + This IP is incorrect. + Questo IP non è corretto + + + Range End IP + Fine range IP: + + + End IP: + IP di conclusione: + + + IP Range Comment + Commento range IP + + + Comment: + Commento: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + + + + + properties + + Torrent Properties + Proprietà del torrent + + + Main Infos + Informazioni principali + + + File Name + Nome del file + + + Current Session + Sessione corrente + + + Total Uploaded: + Totale Upload: + + + Total Downloaded: + Totale Download: + + + Download state: + Stato download: + + + Current Tracker: + Tracker corrente: + + + Number of Peers: + Numero di peer: + + + Torrent Content + Contenuto del torrent + + + OK + OK + + + Total Failed: + Totale fallito: + + + Finished + Finito + + + Queued for checking + In coda per controllo + + + Checking files + Controllo files + + + Connecting to tracker + Connettendo al tracker + + + Downloading Metadata + Scaricando i metadata + + + Downloading + Scaricando + + + Seeding + Seeding + + + Allocating + Allocando + + + Unknown + Sconosciuto + + + Complete: + Completo: + + + Partial: + Parziale: + + + Files contained in current torrent: + Files 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. + Qua puoi scegliere quali file del torrent scaricare. + + + False + Falso + + + True + Vero + + + Tracker + Tracker + + + Trackers: + Trackers: + + + None - Unreachable? + Nessuno- Irraggiungibile? + + + Errors: + Errori: + + + Progress + Progresso + + + Main infos + Informazioni principali + + + Number of peers: + Numero di peer: + + + Current tracker: + Tracker corrente: + + + Total uploaded: + Upload totale: + + + Total downloaded: + Download totale: + + + Total failed: + Fallimento totale: + + + Torrent content + Contenuto del torrent + + + Options + opzioni + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_ko.qm b/src/lang/qbittorrent_ko.qm new file mode 100644 index 0000000000000000000000000000000000000000..31307f8c2c97766d7c4096ba865ffd9207f96393 GIT binary patch literal 10459 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 literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_ko.ts b/src/lang/qbittorrent_ko.ts new file mode 100644 index 000000000..c88fcf154 --- /dev/null +++ b/src/lang/qbittorrent_ko.ts @@ -0,0 +1,1642 @@ + + + @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 + 큐비토런트 제작자 + + + 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 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + 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 + 프록시 + + + 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 표시하지 않기 + + + KiB/s + + + + 1 KiB DL = + 1 KiB 다운로드 = + + + KiB UP max. + KIB 최대 업로드. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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: + 다운로드 실패: + + + 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 + 검색 플로그인 업데이트 -- 큐비토런트 + + + 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... + + + + + 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 + 모두 지우기 + + + KiB/s + + + + Create torrent + 토렌트 파일 생성 + + + Ratio: + 비율: + + + Update search plugin + 검색 엔진 업데이트 + + + Session ratio: + 세션 비율: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + 아님 + + + True + 맞음 + + + + QTextEdit + + Clear + 모두 지우기 + + + + 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 + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + 비밀번호: + + + Log in + + + + Cancel + 취소 + + + + 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> + + + + 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: + 토렌트가 성공적으로 생성되었습니다: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + 다운로드 + + + Cancel + 취소 + + + Download from urls + + + + + 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) + 알수 없음 + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + 취소 + + + + 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: + 총 업로드양: + + + Total downloaded: + 총 다운로드양: + + + Total failed: + 총 실패수: + + + Torrent content + 토렌트 내용 + + + Options + 환경설정 + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_nl.qm b/src/lang/qbittorrent_nl.qm new file mode 100644 index 0000000000000000000000000000000000000000..bcf1d1c59a7a90cf1fdb95631f7b5df3d6d54a1f GIT binary patch literal 15295 zcmcIr3v|@gng8;*lgVT_1II7ini5qTwB+5ah2}x_uc!S|GWaYdp0@A zm$~=5-+g`W`(^Uuu|a$P{jOVI9ya8ei?{vi_tQm!(?kSNzhd}Zj-OTdsm0G){G2Lc zz706h!383Ld+_-pk&<12z!{A;xl&|&1aOOk4~fjV3ZI`7nfE&2VUhCz3o1kw6GlZ^ zdI86awDR+GDSYMyz{OJhN-Xt!xX8gCF%Mjf_RV6Rcogt%secOd6+SHWubu+5dQ4eK!bWlbOGny+QUl?mL@NVz6*KHzz>?cgVXSIh2qTLB-HC*A~| zz`JsA2k=YEw*r z1Kd}9{QmhOk@Dj6_s#*_Q+(;epda~T@#bC2MJj^Dx1ako;7Jb7c5tJEyBvJ4c>CkO z0N&x^2gd+b4k&&x_AcPW;#Yg$2b@>@*40=?K^5(C_6?i!8tANQKMYwUW!PtA@SUJ$7| z(L7jm9pFUs=pfLqT43I2DFXacp!xv#WWe!(+WENW0n;4(Vc@JYai0U849s}$ZNLu$ zGxmKZQXLGm&gcW28t8is=UKfvaA^Q^s&97i*}$d21NeL(aM^;N1AZ0Q{F9*~$Db9r z^A8Px7X|MBcnRRmf!(*f2>5R?q$FqHpgCCU?o`!QC zSX@%G1otp-K}lWYO27>zi>tt=18*)#-tZ*g?vgF-OSawevB(LV zN?sd5cu&c14}%|1c%kHjR^Zo4aLi|2fTM%ceu@3oz7w2r1=4xabOjerw_iz=YE z25$+jAicql1vhQ|L}bXx!L8MI0)8jBb?9cmjln0sz60>i;B)U?0{B31?+ZAGA)l58 zZup+ai4~<4!#)I@URt;A9l*;=M{QmW_ZG*Zl_YyAE!0 zaC_;7AMQl^OQk=3`xU@XOYeCK@^aF$(p{sb0d6mS>cJNPUnza+A@Kc42TR|bl@N&* zl^)u9J>UhQfq!@#a8s!6pBn(53{9E`IUP1CbVhqMU}xxz!;s@)Plcu&0-p@84PE$Z z72uN4h3`BHczbC1pW=Wohhmd~Km0#KiQ{h)Ir;cdPhAACDYW6>VZddfO=G_gxFK|1 z8`gF56QS!i?*rT)`st7x0sj)({&bVbh?daKDPIDvb@0y6W9vS^=cmd_H)5U<`^zq$ zjB_0EMcEajekO8CwCqRQZUH>2?55y+z@=rkR)zp?EqmglM*yEMdv+V{^^^nQ!F#ue zj0}W_nr6VM;b9MB{*j&G(Yr$y@2MYISQiOj`!~?58x_8->OsIu!gqAk1Ku6J_h17K?y@1!0uP8OW#ET#_gCEaEan-vw_?YYZ;LdZ zQ1QYq-T|Ca@zO1y1OBGst?ggJ##dIn^(59i{_GC?O5!A>P^KGz=>_&fj2~j|Lmxk^ zav#?6!&?1NEDPkk5_~La?r7`mY8P~wZ~I;8AEQDlfqS$!C<$r9cM?q{yIj*qnJ;mP zqiOU4Z3;*Ozq2M7A4%^7wriLmvoO3zR=@#jlU{tsB`Qg6gW2DTHHbdV?F{x}O_d%UB@Yu4&~S9T>rJC$Y9Jd(`Qq zx0(Jhik5V6?)(UTM-T_w3(DPSdf;NW&Sf6Q!1L3lDj5miH!kb(law`fd2k1{v(k0; zfKVIn-OxkSt`NFr1G|&-;Vx?9LRkWCS&K>I7!kz}xn(U5GJy-TyrhSMzDpEq4SL&@ z+lWJ6TLbJkdO5Pe&;wP{gQV3B=*ECvcWMdVDV$S986(^sIoHk`1GRM+)CJ@y+Pgr} z4(z0Wz?aowL$D8WQjGVlOX$Jx9(-dVhOVxn1wFRlC6%7NysNLbxs$>QA2<`iZ>o|O zT{M?Wg31o?krh9T<#zbZaG7260<3dAMyO=NgVyGdoQJd4#xyR0U!C1+=wzoFA&xRm zdN`z_dG6efp5EqoXS}_wH;$FV3(tq>>!E%S9QWtxO{eL^g*OCu-c7U+Tj=BM8v6Fy z*rF;Y4w;UkvlA!M3zX&fi;S=mpQ3=|PWITp6M!n@?$)BfryQ}JhYdzW$e`rIvJf5Q zfnF{J5kzV!9I-(*qH*gX*SHv1ICtqaj4iZrXo~a5l2N@gvZ=cb!{Eaq&eoY$>Y@@@ zI%g$+Q&VEch)xu-R@ownPEzEah~#7sp^G9lNHfN-2SO(xwxr19Xi6f7P{!C!`p}Pv zb#&lJS*oYC9FtO2^LKmt9M&Kh21Pm`3f8hmm*6^eK~Nhy9~X#IL)_$0vt@+>MWN&B zlSD;mrKl6Lj;$SNykcIPJxFU+`mjIl!zpq^WIBABY9-#dDjqk4dx`2%L?PyxQcGRu zpD9*?piW8cRIRi|32_+rNR7~q-*GIRpL_6`@(Im=7Our!PE-|Rr*4l-M$F75StE38 zi-P&aJnJzd_slW5H{4(th3dkGs4Rz)kLN{JrXSL#eIoNWv`(Wltr>cYOz@Z00$~zB(2W-_S&yU>3!%r9{soV}5NU>-WnLY9mDOq*8Vr+bI{cS185UzoUUN)ukSdW|>5(R2j#FHYNMg(^Y?neyD@0$g zQ^hxid+;zOqu1h5K&^gRgME-qJu_jsJkt?iuj)IU6EqC7fV$wJIxQDKqh+4+=PxN-IXzT6hN{Bhyfa(>=IDFlfu4EF!y!iTPqbg%v>l2+_ZLyijuC+@R%{}rw z{vtxkQr3@SO4OazQr)YsYt*wa%#|uaBxTvH&SLV^9fDOvGjSOdC7hUHM%8uB#63}$ zuK^_YtuaiqYG(){V+}Db4LMhBY=%~I9xpD7&Q8*q5jvIjIv9^wUhhw*Fmf6!zwT%PoVO=sj zeN6AWWmZz1Z8J1^$~F@4=2-VHwJOBp!NlvBP} zt77$ncwS+;`5vR6J+Cv};@Yv^IO>L}62kWk7!)!W)ivV}coz~f%&+UhhNtloH6po& zh}4625cZ8EydqmY!DF^=lXaP_8$yohHq6s2YJHa9lI~r4NvUqN1qmvSvUzPCiDexL z$g3D8_rEC-e^4|fGX3p`j|NJAkh+IC?f?`d-xCyNjH2*3NjJ^7;Iq%IR!t``Y~N=( zEZa-5%tV*d=Cpu{7Yaokq9+~2iPNdE;R~6IG#d;bFx*F}HKasu{zBv+1)DN3M5xh+dAa5H#iQG_~3D6; zp~1H#B^ZLvvG)vy!^4s`HYuA~F7fz z;aiq=P1AfD@`6r%x8q#k{o}h03-J?j8BP~^*l%qopTm^YP~8>T+B#o6-j(iC4D!bJ zGDVDFd@4W24m_Y~hn3ZIjic!yqTp>!Q7Y9rUJhQe*<^I#xy_BHhvSJC)jYGA)L49p zBTB(Fu-;bAsY-LBw}ZZU@z@_(K=4s*-s~yv-W~w6WYhYaPhkV;eNgo zZP3-UD-Diyv*JQNw@xf`uIVW$c-MySr0zofWT1W4umK@Z@Pw);6Z**!_!pC_!1?Z~ zgO7SjhEKDKy8ReqGDfHNnseL~Tn_tk)`PaptW^KfpPQ)3@>6B1;VZH`8c*k@vY(iW zw{LknLwBH+xgI_}>tMRMV^wpX#GA|0?S0@7&eNr7M63JB{Z>9Q zB?I%~iCf7t&hr*X`DMJPTG8 zDIav}xt>lLrQDf8(eQ~~Cu=yOPnYA58NSKuz$(qFq-8gFhi&Kei0GRtj4RXPSe zKp47N5ds>UbQ?b9YeSPZY=8h#qY>M)7Sy-2JN-qEm=<*aN~BtoDm^%z^dv6J1GKv? zEkrEuVW2_|5A&nYTT9r!;$#k97kIYZnyU*Yg!{P%SIw$8E{ZJue zNQ#i^au1gtdX$}!}-)y&`W|Lv%j1G%oH+GpD z)vutowW&cWhRke%)xBPBk6W=Pmp&C4JzLBh3=4F0x-&uaY~^7;`)e=XhLV~i0S+Av zdcYpvW5uZLQ4-A%2O4^2--*aK4$exoMIwBap#Q^Ot5z+)WpJ5ciI9?O$;#7Nv$75( z=(c)h#=2T~G(=nWp)mNdbrU>YYSaYCAGR+sjrv;7j0^9q0mJKnZd2&?2)sV>VnRk4 z7Av{4vKb_9g5jOFDgPdQBb@OZXIST?By!{G3`K<1q=;eAJCEw1p{lQ~N#m^iE6vOq zR!u2lwYp67@VRoUE0c!BRN7sOQF-4CAZo0%QY0!ja*Q=Tx<$kCEA6aFWg0CVE_MT) z3)W>R!s$8k;RiTgj7&b@7C6}Y+8}^}E+tTzZCnj&yxht>_ls-e3Na3aU)p&AR%RnC zU&{LDW9zS}_n}MSa>%YUaXydpGp0aInNAULrrnct7MW>B4V14}@4##i#TQXgMr6+l zv?C##6aq_8tl&`QdJSvVbmSmh9wVDv=4LsYq72P@{Jsfey_+IdWjH^YhBhpM)6Phy z=WbXPryUcaDr^EgH;`opfXA4dHefNG4j+!?cWXA?Wlu#7MB=0^<6`rJyrA{WaOG>_bzb%bni%-TOiuFbPjFb=;B z3j^J1?X6mUWM8(qp_pOKprTxx%4pE-quR2Q=j1eS(%gZKVac+Vbv=dcNf&WEr;?U} z^z4hG=ecui4^*ffNr|LZTw_?is7tDMPjL3x(mLhdiEs}c?hepqSnH^RM&z7_7qVF| zV+nlKxrQZ?ie8mUyHl$%)81rQC#jt^Zi4h+hbr=a9*?gP7BIsaeH(tfNc{xe?sSbun;Rjg9aVV=}JE zs|d31Usfy{469^yo+{P!439a4W+i4=I;)+Go+xk(HS^X?7*^LR>MdYrhPj?!ZOsld zZ?@!-GEAno_L>q(iM076>rL@gs3I9I+g>kom3L~4CR;35|I5=1)|QhCnW|&SuP$!P zQIvTmf0d&`Scft4&Ir+P9C_a4^SaS2FIFNW^!lxX!U&gllARmDQc;Dh==Evgs~?M6 zlVJz@k6SER)h1I&G=2SX^JW2u_K=+zyMC*n74nNJ99~*KL z*6gr8TgeUY#{ycuR!_#Th+C0qa_54c=MIwtSW&|2Zbi5N_dqAyuRO|QJ<#uY`Pp{K z7NBO@B&%OoIIdINbc}(lr&Ry{vu>d4nsyA%xef0QzoW(Y*#8(1?)M~E)%lXj*87*#Dq^~Ho zx>HX`Jk^CPJk$y+_!VgcOk3)i9Dn8av{>k`=rt+(OEICSaY)?oKL8Y=8D1}|+q?vb zmDJ1!SgYvC5+3jIl)T4O#tHmK0=EYn?b`5$XK&piW~cdI28wjOCNTbY1tSY!TvlQw zx{XvKB)dq&pVrpM_h9WZjKM5T?GNo{Bf-$e4 z^9b+{6?q5r7dP@hFAB!t{pAz64W8H0zY6l81oO0IHyxMVkotT=>M#F~Vg8@)uliKW z1iYsRjNh?+;s0^)HB*1j)!#?{h5vIr!dFXrUs+c-t7m$?*RdA=T~oO*+0~s<7#_(g z6fd_$G`+Tn28HC==zuN}B=s%5S7t-Q+_27egrR{l26-8DG~C$Nw!A@t-Rs T=#|)qy0O4`vbQ6S|Izs$1ScTa literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_nl.ts b/src/lang/qbittorrent_nl.ts new file mode 100644 index 000000000..64684985b --- /dev/null +++ b/src/lang/qbittorrent_nl.ts @@ -0,0 +1,1602 @@ + + + @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> + + + 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> + + + 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> + 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://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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 + + + + 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 + Downloaden + + + Please wait... + + + + + 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 + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Onwaar + + + True + Waar + + + + QTextEdit + + Clear + Wissen + + + + 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 + + + + Sorry, we can't preview this file + + + + Name + Naam + + + Size + Grootte + + + Progress + Voortgang + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Wachtwoord: + + + Log in + + + + Cancel + Annuleren + + + + 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> + + + + 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: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Download + + + Cancel + Annuleren + + + Download from urls + + + + + 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 + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Annuleren + + + + 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: + + + Total downloaded: + Totaal gedownload: + + + Total failed: + Totaal gefaald: + + + Torrent content + Torrent inhoud + + + Options + Instellingen + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_pl.qm b/src/lang/qbittorrent_pl.qm new file mode 100644 index 0000000000000000000000000000000000000000..8ba1e864bb13a1a704606f6920a41fb9cac7f342 GIT binary patch literal 15309 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 A4FCWD literal 0 HcmV?d00001 diff --git a/src/lang/qbittorrent_pl.ts b/src/lang/qbittorrent_pl.ts new file mode 100644 index 000000000..e6c5aefa5 --- /dev/null +++ b/src/lang/qbittorrent_pl.ts @@ -0,0 +1,1647 @@ + + + @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 + + + 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 + + + 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 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://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opcje -- qBittorrent + + + Options + Opcje + + + Main + Główne + + + Save Path: + Ścieżka zapisu: + + + Download Limit: + Limi sciągania: + + + 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): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + 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 usunać 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 zaðnym 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 + + + + 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 + Pobieranie + + + Please wait... + + + + + 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ść UL: + + + 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 + Wyjście + + + Preferences + Preferencje + + + About + O programie + + + Start + Start + + + Pause + Wstrzymaj + + + Delete + Skasuj + + + Pause All + Wsztrzymaj wszystko + + + Start All + Rozpocznij wszystko + + + Documentation + Dokumentacja + + + Connexion Status + Status połączenia + + + Delete All + Skasuj wszystko + + + Torrent Properties + Właściwości Torrent-a + + + 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 + + + Download + Pobierz + + + Clear + Wyczyść + + + KiB/s + KiB/s + + + Create torrent + Utwórz torrent-a + + + Ratio: + Ratio: + + + Update search plugin + Aktualizacja wtyczki wyszukiwania + + + Session ratio: + Ratio sesji: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Nie + + + True + Tak + + + + QTextEdit + + Clear + Wyczyść + + + + 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 + + + + Sorry, we can't preview this file + + + + Name + Nazwa + + + Size + Rozmiar + + + Progress + Postęp + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Hasło: + + + Log in + + + + Cancel + Anuluj + + + + 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> + + + + 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 + Ścieżka docelowy nie ustawiony + + + Please type a destination path first + Proszę podać ścieżkę docelową + + + No input path set + Ścieżka źródłowa nie zdefiniowana + + + Please type an input path first + Proszę podać ścieżkę żródłową + + + Input path does not exist + Ścieżka źródłowa nie istnieje + + + Please type a correct input path first + Proszę podać poprawną ścieżkę źródłową + + + Torrent creation + Tworzenie torrent-a + + + Torrent was created successfully: + Utworzono plik torrent: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Pobierz + + + Cancel + Anuluj + + + Download from urls + + + + + 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 + + + + 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 + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Anuluj + + + + properties + + Torrent Properties + Właściwości Torrent-a + + + 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: + Trackers: + + + 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 traker: + + + Total uploaded: + Ogółem wysłanych: + + + Total downloaded: + Ogółem pobranych: + + + Total failed: + Ogółem błędnych: + + + Torrent content + Zawartość torrent-a + + + Options + Opcje + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_pt.qm b/src/lang/qbittorrent_pt.qm new file mode 100644 index 0000000000000000000000000000000000000000..daf5e01bf494fef938291afa9b758cfad99141ca GIT binary patch literal 15237 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