commit 969a02b93e704a7cc7157780194b4ad267362bec Author: Christophe Dumez Date: Sat Sep 30 16:02:39 2006 +0000 - Moved everything to trunk to create a stable branch 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 000000000..c6464d90a Binary files /dev/null and b/src/Icons/button_cancel.png differ diff --git a/src/Icons/button_ok.png b/src/Icons/button_ok.png new file mode 100644 index 000000000..230de5302 Binary files /dev/null and b/src/Icons/button_ok.png differ diff --git a/src/Icons/encrypted.png b/src/Icons/encrypted.png new file mode 100644 index 000000000..04a05c1cb Binary files /dev/null and b/src/Icons/encrypted.png differ diff --git a/src/Icons/filter.png b/src/Icons/filter.png new file mode 100644 index 000000000..bff8da3d6 Binary files /dev/null and b/src/Icons/filter.png differ diff --git a/src/Icons/flags/bulgaria.png b/src/Icons/flags/bulgaria.png new file mode 100644 index 000000000..98396d86b Binary files /dev/null and b/src/Icons/flags/bulgaria.png differ diff --git a/src/Icons/flags/china.png b/src/Icons/flags/china.png new file mode 100644 index 000000000..2f574c1fb Binary files /dev/null and b/src/Icons/flags/china.png differ diff --git a/src/Icons/flags/china_hong_kong.png b/src/Icons/flags/china_hong_kong.png new file mode 100644 index 000000000..ffadae683 Binary files /dev/null and b/src/Icons/flags/china_hong_kong.png differ diff --git a/src/Icons/flags/france.png b/src/Icons/flags/france.png new file mode 100644 index 000000000..ef21ef89b Binary files /dev/null and b/src/Icons/flags/france.png differ diff --git a/src/Icons/flags/germany.png b/src/Icons/flags/germany.png new file mode 100644 index 000000000..86668f5b7 Binary files /dev/null and b/src/Icons/flags/germany.png differ diff --git a/src/Icons/flags/greece.png b/src/Icons/flags/greece.png new file mode 100644 index 000000000..28f1da83e Binary files /dev/null and b/src/Icons/flags/greece.png differ diff --git a/src/Icons/flags/italy.png b/src/Icons/flags/italy.png new file mode 100644 index 000000000..c5f45f2f7 Binary files /dev/null and b/src/Icons/flags/italy.png differ diff --git a/src/Icons/flags/netherlands.png b/src/Icons/flags/netherlands.png new file mode 100644 index 000000000..414824e7e Binary files /dev/null and b/src/Icons/flags/netherlands.png differ diff --git a/src/Icons/flags/poland.png b/src/Icons/flags/poland.png new file mode 100644 index 000000000..9a487d81f Binary files /dev/null and b/src/Icons/flags/poland.png differ diff --git a/src/Icons/flags/portugal.png b/src/Icons/flags/portugal.png new file mode 100644 index 000000000..2c406d5ea Binary files /dev/null and b/src/Icons/flags/portugal.png differ diff --git a/src/Icons/flags/romania.png b/src/Icons/flags/romania.png new file mode 100644 index 000000000..e04512157 Binary files /dev/null and b/src/Icons/flags/romania.png differ diff --git a/src/Icons/flags/russia.png b/src/Icons/flags/russia.png new file mode 100644 index 000000000..6c74f4406 Binary files /dev/null and b/src/Icons/flags/russia.png differ diff --git a/src/Icons/flags/slovakia.png b/src/Icons/flags/slovakia.png new file mode 100644 index 000000000..122b6dbc3 Binary files /dev/null and b/src/Icons/flags/slovakia.png differ diff --git a/src/Icons/flags/south_korea.png b/src/Icons/flags/south_korea.png new file mode 100644 index 000000000..7dc5dcd6a Binary files /dev/null and b/src/Icons/flags/south_korea.png differ diff --git a/src/Icons/flags/spain.png b/src/Icons/flags/spain.png new file mode 100644 index 000000000..adefcb21f Binary files /dev/null and b/src/Icons/flags/spain.png differ diff --git a/src/Icons/flags/spain_catalunya.png b/src/Icons/flags/spain_catalunya.png new file mode 100644 index 000000000..f9b32f232 Binary files /dev/null and b/src/Icons/flags/spain_catalunya.png differ diff --git a/src/Icons/flags/sweden.png b/src/Icons/flags/sweden.png new file mode 100644 index 000000000..3904aa8fc Binary files /dev/null and b/src/Icons/flags/sweden.png differ diff --git a/src/Icons/flags/turkey.png b/src/Icons/flags/turkey.png new file mode 100644 index 000000000..41cb3fad3 Binary files /dev/null and b/src/Icons/flags/turkey.png differ diff --git a/src/Icons/flags/ukraine.png b/src/Icons/flags/ukraine.png new file mode 100644 index 000000000..347ebb893 Binary files /dev/null and b/src/Icons/flags/ukraine.png differ diff --git a/src/Icons/flags/united_kingdom.png b/src/Icons/flags/united_kingdom.png new file mode 100644 index 000000000..8bf47c1ee Binary files /dev/null and b/src/Icons/flags/united_kingdom.png differ diff --git a/src/Icons/home.png b/src/Icons/home.png new file mode 100644 index 000000000..e9612a381 Binary files /dev/null and b/src/Icons/home.png differ diff --git a/src/Icons/locale.png b/src/Icons/locale.png new file mode 100644 index 000000000..827360a8b Binary files /dev/null and b/src/Icons/locale.png differ diff --git a/src/Icons/log.png b/src/Icons/log.png new file mode 100644 index 000000000..112c58ca1 Binary files /dev/null and b/src/Icons/log.png differ diff --git a/src/Icons/proxy.png b/src/Icons/proxy.png new file mode 100644 index 000000000..e8fef4233 Binary files /dev/null and b/src/Icons/proxy.png differ diff --git a/src/Icons/qBittorrent.desktop b/src/Icons/qBittorrent.desktop new file mode 100644 index 000000000..fd8f00ca2 --- /dev/null +++ b/src/Icons/qBittorrent.desktop @@ -0,0 +1,26 @@ +[Desktop Entry] +Categories=Qt;Application;Network;P2P +Comment=V0.6.0 +Encoding=UTF-8 +Exec=qbittorrent +GenericName=Bittorrent client +GenericName[fr]=Client Bittorrent +GenericName[nl]=Bittorrent client +GenericName[es]=Cliente Bittorrent +GenericName[sv]=Bittorrent-klient +GenericName[tr]=Bittorrent istemcisi +GenericName[de]=Bittorren Client +GenericName[pl]=Klient Bittorrent +GenericName[zh]=Bittorrent之用户 +GenericName[ko]=비토렌트 클라이언트 +GenericName[el]=Τορεντ πελάτης +GenericName[bg]=Торент клиент +GenericName[uk]=Bittorrent-клієнт +GenericName[ru]=клиент Bittorrent +Icon=qbittorrent +MimeType=application/x-bittorrent +Name=qBittorrent +Name[ko]=큐비토런트 +Terminal=false +Type=Application + diff --git a/src/Icons/qbittorrent16.png b/src/Icons/qbittorrent16.png new file mode 100644 index 000000000..436cce3bd Binary files /dev/null and b/src/Icons/qbittorrent16.png differ diff --git a/src/Icons/qbittorrent22.png b/src/Icons/qbittorrent22.png new file mode 100644 index 000000000..f0aa537bb Binary files /dev/null and b/src/Icons/qbittorrent22.png differ diff --git a/src/Icons/qbittorrent32.png b/src/Icons/qbittorrent32.png new file mode 100644 index 000000000..c83184660 Binary files /dev/null and b/src/Icons/qbittorrent32.png differ diff --git a/src/Icons/skin/add.png b/src/Icons/skin/add.png new file mode 100644 index 000000000..2156ec62c Binary files /dev/null and b/src/Icons/skin/add.png differ diff --git a/src/Icons/skin/connected.png b/src/Icons/skin/connected.png new file mode 100644 index 000000000..4343972e2 Binary files /dev/null and b/src/Icons/skin/connected.png differ diff --git a/src/Icons/skin/connecting.png b/src/Icons/skin/connecting.png new file mode 100644 index 000000000..384ac3eae Binary files /dev/null and b/src/Icons/skin/connecting.png differ diff --git a/src/Icons/skin/delete.png b/src/Icons/skin/delete.png new file mode 100644 index 000000000..70d761928 Binary files /dev/null and b/src/Icons/skin/delete.png differ diff --git a/src/Icons/skin/delete_all.png b/src/Icons/skin/delete_all.png new file mode 100644 index 000000000..513872072 Binary files /dev/null and b/src/Icons/skin/delete_all.png differ diff --git a/src/Icons/skin/disconnected.png b/src/Icons/skin/disconnected.png new file mode 100644 index 000000000..e968e05f3 Binary files /dev/null and b/src/Icons/skin/disconnected.png differ diff --git a/src/Icons/skin/downloading.png b/src/Icons/skin/downloading.png new file mode 100644 index 000000000..e54418cf6 Binary files /dev/null and b/src/Icons/skin/downloading.png differ diff --git a/src/Icons/skin/exit.png b/src/Icons/skin/exit.png new file mode 100644 index 000000000..efa39ec7e Binary files /dev/null and b/src/Icons/skin/exit.png differ diff --git a/src/Icons/skin/firewalled.png b/src/Icons/skin/firewalled.png new file mode 100644 index 000000000..b8c2dadf5 Binary files /dev/null and b/src/Icons/skin/firewalled.png differ diff --git a/src/Icons/skin/info.png b/src/Icons/skin/info.png new file mode 100644 index 000000000..cad70739c Binary files /dev/null and b/src/Icons/skin/info.png differ diff --git a/src/Icons/skin/new.png b/src/Icons/skin/new.png new file mode 100644 index 000000000..7777da597 Binary files /dev/null and b/src/Icons/skin/new.png differ diff --git a/src/Icons/skin/open.png b/src/Icons/skin/open.png new file mode 100644 index 000000000..f7fdb5d3c Binary files /dev/null and b/src/Icons/skin/open.png differ diff --git a/src/Icons/skin/pause.png b/src/Icons/skin/pause.png new file mode 100644 index 000000000..022d040fc Binary files /dev/null and b/src/Icons/skin/pause.png differ diff --git a/src/Icons/skin/pause_all.png b/src/Icons/skin/pause_all.png new file mode 100644 index 000000000..5c92e5e85 Binary files /dev/null and b/src/Icons/skin/pause_all.png differ diff --git a/src/Icons/skin/paused.png b/src/Icons/skin/paused.png new file mode 100644 index 000000000..8a0e947b8 Binary files /dev/null and b/src/Icons/skin/paused.png differ diff --git a/src/Icons/skin/play.png b/src/Icons/skin/play.png new file mode 100644 index 000000000..828d4b730 Binary files /dev/null and b/src/Icons/skin/play.png differ diff --git a/src/Icons/skin/play_all.png b/src/Icons/skin/play_all.png new file mode 100644 index 000000000..57c4ce538 Binary files /dev/null and b/src/Icons/skin/play_all.png differ diff --git a/src/Icons/skin/preview.png b/src/Icons/skin/preview.png new file mode 100644 index 000000000..d44a256f1 Binary files /dev/null and b/src/Icons/skin/preview.png differ diff --git a/src/Icons/skin/properties.png b/src/Icons/skin/properties.png new file mode 100644 index 000000000..e6236675f Binary files /dev/null and b/src/Icons/skin/properties.png differ diff --git a/src/Icons/skin/remove.png b/src/Icons/skin/remove.png new file mode 100644 index 000000000..702ec8943 Binary files /dev/null and b/src/Icons/skin/remove.png differ diff --git a/src/Icons/skin/search.png b/src/Icons/skin/search.png new file mode 100644 index 000000000..985d08d69 Binary files /dev/null and b/src/Icons/skin/search.png differ diff --git a/src/Icons/skin/seeding.png b/src/Icons/skin/seeding.png new file mode 100644 index 000000000..3689a0eb5 Binary files /dev/null and b/src/Icons/skin/seeding.png differ diff --git a/src/Icons/skin/settings.png b/src/Icons/skin/settings.png new file mode 100644 index 000000000..a5fd8bdde Binary files /dev/null and b/src/Icons/skin/settings.png differ diff --git a/src/Icons/skin/stalled.png b/src/Icons/skin/stalled.png new file mode 100644 index 000000000..396fcd7db Binary files /dev/null and b/src/Icons/skin/stalled.png differ diff --git a/src/Icons/skin/url.png b/src/Icons/skin/url.png new file mode 100644 index 000000000..3995aab8a Binary files /dev/null and b/src/Icons/skin/url.png differ diff --git a/src/Icons/smile.png b/src/Icons/smile.png new file mode 100644 index 000000000..981b7d915 Binary files /dev/null and b/src/Icons/smile.png differ diff --git a/src/Icons/splash.jpg b/src/Icons/splash.jpg new file mode 100644 index 000000000..11b25970b Binary files /dev/null and b/src/Icons/splash.jpg differ diff --git a/src/Icons/stare.png b/src/Icons/stare.png new file mode 100644 index 000000000..69b393e5d Binary files /dev/null and b/src/Icons/stare.png differ diff --git a/src/Icons/style.png b/src/Icons/style.png new file mode 100644 index 000000000..f8810f245 Binary files /dev/null and b/src/Icons/style.png differ diff --git a/src/Icons/systemtray.png b/src/Icons/systemtray.png new file mode 100644 index 000000000..e4d5f5558 Binary files /dev/null and b/src/Icons/systemtray.png differ diff --git a/src/Icons/unhappy.png b/src/Icons/unhappy.png new file mode 100644 index 000000000..464b3de42 Binary files /dev/null and b/src/Icons/unhappy.png differ diff --git a/src/Icons/wizard.png b/src/Icons/wizard.png new file mode 100644 index 000000000..686a2daab Binary files /dev/null and b/src/Icons/wizard.png differ 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 000000000..4158bdd6f Binary files /dev/null and b/src/doc/qbittorrent.1.gz differ 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 000000000..f1e4d3687 Binary files /dev/null and b/src/lang/qbittorrent_bg.qm differ diff --git a/src/lang/qbittorrent_bg.ts b/src/lang/qbittorrent_bg.ts new file mode 100644 index 000000000..2b190282e --- /dev/null +++ b/src/lang/qbittorrent_bg.ts @@ -0,0 +1,1624 @@ + + + @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 000000000..44264f59f Binary files /dev/null and b/src/lang/qbittorrent_ca.qm differ diff --git a/src/lang/qbittorrent_ca.ts b/src/lang/qbittorrent_ca.ts new file mode 100644 index 000000000..716a4be0f --- /dev/null +++ b/src/lang/qbittorrent_ca.ts @@ -0,0 +1,1672 @@ + + + @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 000000000..ba5ef0dd9 Binary files /dev/null and b/src/lang/qbittorrent_de.qm differ 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 000000000..86f7f48fe Binary files /dev/null and b/src/lang/qbittorrent_el.qm differ diff --git a/src/lang/qbittorrent_el.ts b/src/lang/qbittorrent_el.ts new file mode 100644 index 000000000..22be767c9 --- /dev/null +++ b/src/lang/qbittorrent_el.ts @@ -0,0 +1,1664 @@ + + + @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 000000000..6bd22c41d Binary files /dev/null and b/src/lang/qbittorrent_en.qm differ 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 000000000..4484d13ff Binary files /dev/null and b/src/lang/qbittorrent_es.qm differ 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 000000000..5c4c67a56 Binary files /dev/null and b/src/lang/qbittorrent_fr.qm differ 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 000000000..1044ff9af Binary files /dev/null and b/src/lang/qbittorrent_it.qm differ 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 000000000..31307f8c2 Binary files /dev/null and b/src/lang/qbittorrent_ko.qm differ 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 000000000..bcf1d1c59 Binary files /dev/null and b/src/lang/qbittorrent_nl.qm differ 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 000000000..8ba1e864b Binary files /dev/null and b/src/lang/qbittorrent_pl.qm differ 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 000000000..daf5e01bf Binary files /dev/null and b/src/lang/qbittorrent_pt.qm differ diff --git a/src/lang/qbittorrent_pt.ts b/src/lang/qbittorrent_pt.ts new file mode 100644 index 000000000..239491143 --- /dev/null +++ b/src/lang/qbittorrent_pt.ts @@ -0,0 +1,1465 @@ + + + AboutDlg + + About qBittorrent + Sobre qBittorrent + + + About + Sobre + + + Author + Autor + + + Name: + Nome: + + + Country: + País: + + + E-mail: + E-mail: + + + Home page: + Home page: + + + Christophe Dumez + Christophe Dumez + + + France + França + + + Thanks To + Agradecimentos + + + Translation + Tradução + + + License + Licença + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + 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> + Cliente bittorrent que utiliza Qt4 e libtorrent, programado em C++.<br> +<br> +Copyright ©2006 por Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + + + + http://www.dchris.eu + http://www.dcrhis.eu + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Opções -- qBittorrent + + + Options + Opções + + + Main + Principal + + + Save Path: + Salvar Destino: + + + Download Limit: + Limite de Download: + + + Upload Limit: + Limite de Upload: + + + Max Connects: + Max Connects: + + + Port range: + Range da porta: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Desabilitar + + + connections + conexões + + + Proxy + Proxy + + + Proxy Settings + Configurações Proxy + + + Server IP: + Servidor IP: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Porta: + + + Proxy server requires authentication + Servidor proxy requer autenticação + + + Authentication + Autenticação + + + User Name: + Nome do Usuário: + + + Password: + Senha: + + + Enable connection through a proxy server + Habilitar conexão por um servidor proxy + + + OK + OK + + + Cancel + Cancelar + + + Scanned Dir: + Diretório varrido: + + + Enable directory scan (auto add torrent files inside) + Habilitar varredura de diretório (adicionar arquivos torrent automaticamente) + + + Connection Settings + Configurações de Conexão + + + Share ratio: + Compartilhar ratio: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP máx. + + + Activate IP Filtering + Ativar filtragem de IP + + + Filter Settings + Configurações do Filtro + + + Start IP + Iniciar IP + + + End IP + Finalizar IP + + + Origin + Origem + + + Comment + Comentário + + + Apply + Aplicar + + + IP Filter + Filtro de IP + + + Add Range + Adicionar Range + + + Remove Range + Remover Range + + + ipfilter.dat Path: + Caminho do ipfilter.dat: + + + Clear finished downloads on exit + Limpar downloads concluídos ao sair + + + Ask for confirmation on exit + Confirmar antes de sair + + + Go to systray when minimizing window + Ir para systray quando minimizado + + + Misc + Miscelânea + + + Localization + Localização + + + Language: + Idioma: + + + Behaviour + Comportamento + + + OSD + OSD + + + Always display OSD + Sempre mostrar OSD + + + Display OSD only if window is minimized or iconified + Mostrar OSD somente se minimizado ou em ícone + + + Never display OSD + Nunca mostrar OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB UP máx. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + Abrir Arquivos Torrent + + + Unknown + Desconhecido + + + This file is either corrupted or this isn't a torrent. + Este arquivo está corrompido ou não é um arquivo torrent. + + + Are you sure you want to delete all files in download list? + Tem certeza que deseja apagar todos os arquivos na lista de downloads? + + + &Yes + &Sim + + + &No + &Não + + + Are you sure you want to delete the selected item(s) in download list? + Tem certeza que deseja apagar o(s) arquivo(s) selecionado(s) na lista de downloads? + + + paused + pausado + + + started + iniciado + + + Finished + Concluído + + + Checking... + Checando... + + + Connecting... + Conectando... + + + Downloading... + Baixando... + + + Download list cleared. + Lista de downloads está vazia. + + + All Downloads Paused. + Todos os downloads pausados. + + + All Downloads Resumed. + Todos os downloads reiniciados. + + + DL Speed: + Velocidade de download: + + + started. + inciado. + + + UP Speed: + Velocidade de Upload: + + + Couldn't create the directory: + Impossível criar diretório: + + + Torrent Files + Arquivos Torrent + + + already in download list. + <file> already in download list. + já está na lista de downloads. + + + added to download list. + adicionado à lista de downloads. + + + resumed. (fast resume) + reiniciado. (reinicialização rápida) + + + Unable to decode torrent file: + Incapaz de decodificar o arquivo torrent: + + + removed. + <file> removed. + removido. + + + paused. + <file> paused. + pausado. + + + resumed. + <file> resumed. + reiniciado. + + + Listening on port: + Porta de escuta: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Tem certeza? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Velocidade de Download: + + + <b>Connection Status:</b><br>Online + <b>Status da conexão:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Status da conexão:</b><br>Firewall ativado?<br><i>Não foi possível estabelecer uma conexão...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Status da conexão:</b><br>Offline + + + has finished downloading. + concluiu o download. + + + Couldn't listen on any of the given ports. + Não foi possível escutar pelas portas dadas. + + + None + Nenhum + + + Empty search pattern + Padrão de busca vazio + + + Please type a search pattern first + Entre primeiro com um padrão de busca + + + No seach engine selected + Nenhum mecanismo de busca selecionado + + + You must select at least one search engine. + Você deve selecionar pelo menos um mecanismo de busca. + + + Searching... + Buscando... + + + Could not create search plugin. + Não foi possível criar plugin de busca. + + + Stopped + Parado + + + Torrent file URL + URL do arquivo torrent + + + Torrent file URL: + URL do arquivo torrent: + + + Are you sure you want to quit? -- qBittorrent + Tem certeza que deseja sair? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Tem certeza que deseja fechar o qBittorrent? + + + Timed out + Tempo expirado + + + Error during search... + Erro durante busca... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Parado + + + Search is finished + Busca concluída + + + An error occured during search... + Um erro ocorreu durante a busca... + + + Search aborted + Busca abortada + + + Search returned no results + A busca não retornou resultados + + + Search is Finished + Busca concluída + + + Search plugin update -- qBittorrent + Atualização do plugin de busca -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Plugin de busca pode ser atualizado, deseja fazê-lo agora? + +Changelog: + + + Sorry, update server is temporarily unavailable. + Servidor para atualizações está temporariamente indisponível. + + + Your search plugin is already up to date. + Seu plugin de busca já está atualizado. + + + Results + Resultados + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Status + + + ETA + ETA + + + Seeders + + + + Leechers + Leechers + + + Search engine + + + + Stalled + state of a torrent whose DL Speed is 0 + Parado + + + 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 + Baixando + + + Please wait... + + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Velocidade total de Download: + + + Total UP Speed: + Velocidade total de Upload: + + + Name + Nome + + + Size + Tamanho + + + % DL + %Download + + + DL Speed + Velocidade de download + + + UP Speed + Velocidade de Upload + + + Status + Status + + + ETA + ETA + + + &Options + &Opções + + + &Edit + &Editar + + + &File + &Arquivo + + + &Help + &Ajuda + + + Open + Abrir + + + Exit + Sair + + + Preferences + Preferências + + + About + Sobre + + + Start + Iniciar + + + Pause + Pausar + + + Delete + Apagar + + + Pause All + Pausar todos + + + Start All + Iniciar todos + + + Documentation + Documentação + + + Delete All + Apagar todos + + + Torrent Properties + Propriedades do Torrent + + + Connection Status + Status da conexão + + + Downloads + Downloads + + + Search + Buscar + + + Search Pattern: + Padrão de busca: + + + Status: + Status: + + + Stopped + Parado + + + Search Engines + Mecanismos de Busca + + + Results: + Resultados: + + + Stop + Parar + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Mecanismo de Busca + + + Download from URL + Baixar da URL + + + Download + Download + + + Clear + Limpar + + + KiB/s + KiB/s + + + Create torrent + Criar torrente + + + Ratio: + Ratio: + + + Update search plugin + Atualizar plugin de busca + + + Session ratio: + + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Falso + + + True + Verdadeiro + + + + QTextEdit + + Clear + Limpar + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Contate-me se você gostaria de traduzir o qBittorrent para seu idioma. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Gostaria de agradecer às seguintes pessoas por terem voluntariamente traduzido o qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Gostaria de agradecer ao sourceforge.net pela hospedagem do projeto.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Gostaria também de agradecer a Jeffery Fernandez (developer@jefferyfernandez.id.au), nosso RPM packager, pelo seu grande trabalho.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Nome + + + Size + Tamanho + + + Progress + Progresso + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Senha: + + + Log in + + + + Cancel + Cancelar + + + + createTorrentDialog + + Create Torrent file + Criar arquivo torrent + + + Destination torrent file: + Arquivo torrent de destino: + + + Input file or directory: + Entre com arquivo ou diretório: + + + Comment: + Comentário: + + + ... + ... + + + Create + Criar + + + Cancel + Cancelar + + + Announce url (Tracker): + Anunciar url (Rastreador): + + + Directory + Diretório + + + Torrent Creation Tool + Ferramenta de Criação de Torrente + + + <center>Destination torrent file:</center> + <center>Arquivo torrent de destino:</center> + + + <center>Input file or directory:</center> + <center>Arquivo ou diretório:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Divulgar url:<br>(Um por linha)</center> + + + <center>Comment:</center> + <center>Comentário:</center> + + + + createtorrent + + Select destination torrent file + Selecione o arquivo torrent de destino + + + Torrent Files + Arquivos Torrent + + + Select input directory or file + Selecione o diretório ou arquivo de entrada + + + No destination path set + Nenhum caminho de destino selecionado + + + Please type a destination path first + Digite primeiro um caminho de destino + + + No input path set + Nenhum caminho de entrada selecionado + + + Please type an input path first + Digite primeiro um caminho de entrada + + + Input path does not exist + Caminho de entrada não existe + + + Please type a correct input path first + Digite primeiro um caminho de entrada correto + + + Torrent creation + Criação de torrente + + + Torrent was created successfully: + Torrente criada com sucesso: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Download + + + 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 + + + Unknown + Desconhecido + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Desconhecido + + + + options_imp + + Options saved successfully! + Opções salvas com sucesso! + + + Choose Scan Directory + Escolha diretório para varrer + + + Choose save Directory + Escolha diretório onde salvar + + + Choose ipfilter.dat file + Escolha arquivo ipfilter.dat + + + I/O Error + Erro de Entrada ou Saída + + + Couldn't open: + Impossível abrir: + + + in read mode. + em modo de leitura. + + + Invalid Line + Linha inválida + + + Line + Linha + + + is malformed. + está corrompido. + + + Range Start IP + Range Start IP + + + Start IP: + Iniciar IP: + + + Incorrect IP + IP incorreto + + + This IP is incorrect. + Este IP está incorreto. + + + Range End IP + Range End IP + + + End IP: + Finalizar IP: + + + IP Range Comment + Comentário Range de IP + + + Comment: + Comentário: + + + to + <min port> to <max port> + a + + + Choose your favourite preview program + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Cancelar + + + + properties + + Torrent Properties + Propriedades do Torrent + + + Main Infos + Informações principais + + + File Name + Nome do Arquivo + + + Current Session + Sessão atual + + + Total Uploaded: + Total Enviado: + + + Total Downloaded: + Total Baixado: + + + Download state: + Estado do download: + + + Current Tracker: + Rastreador atual: + + + Number of Peers: + Número de Peers: + + + Torrent Content + Conteúdo do Torrent + + + OK + OK + + + Total Failed: + Falharam: + + + Finished + Concluído + + + Queued for checking + Na fila para checagem + + + Checking files + Checando arquivos + + + Connecting to tracker + Conectando-se ao rastreador + + + Downloading Metadata + Baixando Metadados + + + Downloading + Baixando + + + Seeding + Enviando + + + Allocating + Alocando + + + Unknown + Desconhecido + + + Complete: + Completo: + + + Partial: + Parcial: + + + Files contained in current torrent: + Arquivos contidos no torrent atual: + + + Size + Tamanho + + + Selected + Selecionado + + + Unselect + Desfazer seleção + + + Select + Selecionar + + + You can select here precisely which files you want to download in current torrent. + Você pode selecionar aqui precisamente quais arquivos você quer baixar no torrent atual. + + + False + Falso + + + True + Verdadeiro + + + Tracker + Rastreador + + + Trackers: + Rastreadores: + + + None - Unreachable? + Nenhum - Inatingível? + + + Errors: + Erros: + + + Progress + Progresso + + + Main infos + + + + Number of peers: + + + + Current tracker: + + + + Total uploaded: + + + + Total downloaded: + + + + Total failed: + + + + Torrent content + + + + Options + Opções + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_ro.qm b/src/lang/qbittorrent_ro.qm new file mode 100644 index 000000000..89405014e Binary files /dev/null and b/src/lang/qbittorrent_ro.qm differ diff --git a/src/lang/qbittorrent_ro.ts b/src/lang/qbittorrent_ro.ts new file mode 100644 index 000000000..1f20a0add --- /dev/null +++ b/src/lang/qbittorrent_ro.ts @@ -0,0 +1,1466 @@ + + + AboutDlg + + About qBittorrent + Despre qBittorrent + + + About + Despre + + + Author + Autor + + + Name: + Nume: + + + Country: + Ţara: + + + E-mail: + E-Mail: + + + Home page: + Pagina de acasă: + + + Christophe Dumez + Christophe Dumez + + + France + Franţa + + + Thanks To + Mulţumim pentru + + + Translation + Translare + + + License + Licensă + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + 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 + 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/s + + + + Dialog + + Options -- qBittorrent + Opţiuni -- qBittorrent + + + Options + Opţiuni + + + Main + Principal + + + Save Path: + Calea de salvare: + + + Download Limit: + Limita de Download: + + + Upload Limit: + Limita de Upload: + + + Max Connects: + Numărul maxim de conectări: + + + Port range: + Domeniul portului: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Dezactivat + + + connections + conectări + + + Proxy + Proxy + + + Proxy Settings + Setările Proxy + + + Server IP: + IP-ul Serverului: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Portul: + + + Proxy server requires authentication + Serverul Proxy cere autentificare + + + Authentication + Autentificare + + + User Name: + Numele utilizatorului: + + + Password: + Parola: + + + Enable connection through a proxy server + Activarea conectării prin Proxy Server + + + OK + OK + + + Cancel + Anulare + + + Scanned Dir: + Directoriul Scanat: + + + Enable directory scan (auto add torrent files inside) + Activarea Scanarea Direcoriului(Automat adauga torrentele din directoriu) + + + Connection Settings + Setările conectării + + + Share ratio: + Raţia de Share: + + + 1 KB DL = + 1 KB DL= + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Activarea IP Filtrare + + + Filter Settings + Setările Filtrului + + + Start IP + IP de start + + + End IP + IP de oprire + + + Origin + Origine + + + Comment + Comentarii + + + Apply + Aplicare + + + IP Filter + Filtru IP + + + Add Range + Adaugă domeniu + + + Remove Range + Sterge domeniu + + + ipfilter.dat Path: + ipfilter.dat Cale: + + + Clear finished downloads on exit + Sgerge descarcările terminate la eşire + + + Ask for confirmation on exit + Intreabă confirmare la eşire + + + Go to systray when minimizing window + Ascunde in SysTray la minimizare + + + Misc + Diferite + + + Localization + Localizare + + + Language: + Limba: + + + Behaviour + Interfaţa + + + OSD + OSD + + + Always display OSD + Întotdeauna arata OSD + + + Display OSD only if window is minimized or iconified + Arata OSD numai cînd fereastra este minimizata sau iconificata + + + Never display OSD + Nici o data nu afiseaza OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB DL = + + + KiB UP max. + KiB Up max. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + Deschide Fişiere Torrent + + + Unknown + Necunoscut + + + This file is either corrupted or this isn't a torrent. + Acest fişier este deteriorat sau nu este torrent. + + + Are you sure you want to delete all files in download list? + Sunteţi siguri să ştergeţi toate fişierele din lista de download? + + + &Yes + &Yes + + + &No + &No + + + Are you sure you want to delete the selected item(s) in download list? + Sunteţi siguri să ştergeţi itemii selectaţi din lista download? + + + paused + pauză + + + started + început + + + Finished + Finişat + + + Checking... + Verificare... + + + Connecting... + Conectare... + + + Downloading... + Downloading... + + + Download list cleared. + Lista Download curăţită. + + + All Downloads Paused. + Toate descărcările sunt Pausate. + + + All Downloads Resumed. + Toate descărcările sunt Resumate. + + + DL Speed: + DL viteză: + + + started. + început. + + + UP Speed: + UP viteză: + + + Couldn't create the directory: + Nu pot crea directoriul: + + + Torrent Files + Fişiere Torrent + + + already in download list. + <file> already in download list. + deacum în lista download. + + + added to download list. + adăugat la download list. + + + resumed. (fast resume) + resumat.(resumare rapidă) + + + Unable to decode torrent file: + Nu pot decoda fişierul torrent: + + + removed. + <file> removed. + şters. + + + paused. + <file> paused. + pausă. + + + resumed. + <file> resumed. + resumat. + + + Listening on port: + Ascult portul: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Sunteţi siguri? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL viteză: + + + <b>Connection Status:</b><br>Online + <b>Starea conectării:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Starea conectării:</b><br>Firewalled?<br><i>Nu sunt conectări externe...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Starea conectării:</b><br>Offline<br><i>Nu sunt găsiţi peers...</i> + + + has finished downloading. + am terminat descărcarea. + + + Couldn't listen on any of the given ports. + Nu pot asculta pe orice port dat. + + + None + Nimic + + + Empty search pattern + Şablonul de căutat este vid + + + Please type a search pattern first + Vă rugăm să completaţi şablonul de căutare + + + No seach engine selected + Nu aţi selectat motorul de căutare + + + You must select at least one search engine. + Trebuie să selectaţi cel puţin un motor de căutare. + + + Searching... + Căutare... + + + Could not create search plugin. + Nu pot să creez plugin de căutare. + + + Stopped + Oprit + + + Torrent file URL + Calea URL către fişierul Torrent + + + Torrent file URL: + URL către fişierul Torrent: + + + Are you sure you want to quit? -- qBittorrent + Sunteţi siguri să ieşiţi? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Sunteţi siguri să ieşiţi din qbittorrent? + + + Timed out + Timpul a expirat + + + Error during search... + Eroare în timpul căutării... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Oprit + + + Search is finished + Cautarea este terminata + + + An error occured during search... + Eroare în timpul căutării... + + + Search aborted + Cautarea abordată + + + Search returned no results + Cautarea nu a returnat rezultate + + + Search is Finished + Cautarea terminata + + + Search plugin update -- qBittorrent + Cautarea plugin înoire -- qBittorent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Cautarea plugin pentru înoire, doriţi să înoiţi? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Ne cerem ertare, serverul este temporar inaccesibil. + + + Your search plugin is already up to date. + Plugin-ul cautat este de acum înnoit. + + + Results + Rezultate + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + DL Speed + Viteză DL + + + UP Speed + Viteză UP + + + Status + Stare + + + ETA + ETA + + + Seeders + Seederi + + + Leechers + Leecheri + + + Search engine + Motorul de căutare + + + Stalled + state of a torrent whose DL Speed is 0 + Oprit + + + Paused + Pauzat + + + Preview process already running + + + + 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 + Descărcarea + + + Please wait... + + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Viteza totală DL: + + + Total UP Speed: + Viteza totală UP: + + + Name + Nume + + + Size + Capacitate + + + % DL + % DL + + + DL Speed + Viteză DL + + + UP Speed + Viteză UP + + + Status + Stare + + + ETA + ETA + + + &Options + &Opţiuni + + + &Edit + &Editare + + + &File + &Fişier + + + &Help + &Ajutor + + + Open + Deschide + + + Exit + Esire + + + Preferences + Preferinţe + + + About + Despre + + + Start + Start + + + Pause + Pauză + + + Delete + Şterge + + + Pause All + Pauză Toţi + + + Start All + Start Toţi + + + Documentation + Documentaţie + + + Delete All + Şterge Toţi + + + Torrent Properties + Proprietăţile Torrentului + + + Connection Status + Starea Conectării + + + Downloads + Descărcări + + + Search + Caută + + + Search Pattern: + Şablonul Căutării: + + + Status: + Stare: + + + Stopped + Oprit + + + Search Engines + Motoare de Căutare + + + Results: + Rezultate: + + + Stop + Oprit + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Motor de Căutare + + + Download from URL + Descarcă din URL + + + Download + Descarcă + + + Clear + Curăţă + + + KiB/s + KiB/s + + + Create torrent + Crează torrent + + + Ratio: + Rata: + + + Update search plugin + Înnoirea plugin-ului cautat + + + Session ratio: + Rata de sessiune: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Fals + + + True + Adevărat + + + + QTextEdit + + Clear + Curăţă + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Vă rog contactaţimă dacă doriţi să traslaţi qBittorrent în limba dvs. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Eu vreau să mulţumesc voluntarilor care au translat qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Eu vreau să mulţumesc sourceforge.net pentru gazda proiectului qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Eu mulţumesc lui Jeffery Fernandez (developer@jefferyfernandez.id.au), funcţia de RPM packager, pentru lucrul lui mare.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Nume + + + Size + Capacitate + + + Progress + Progress + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Parola: + + + Log in + + + + Cancel + Anulare + + + + createTorrentDialog + + Create Torrent file + Crează fişier Torrent + + + Destination torrent file: + Destinaţia fişierului torrent: + + + Input file or directory: + Fişierul sau directoriul de intrare: + + + Comment: + Comentarii: + + + ... + ... + + + Create + Crează + + + Cancel + Anulare + + + Announce url (Tracker): + Anunţă URL(Tracker): + + + Directory + Directoriul + + + Torrent Creation Tool + Crearea Torrentului + + + <center>Destination torrent file:</center> + <center>Destinaţia fişierului torrent:</center> + + + <center>Input file or directory:</center> + <center>Fişier de intrare sau directoriu:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Anunţă url:<br>(unu pe o linie)</center> + + + <center>Comment:</center> + <center>Comentariu:</center> + + + + createtorrent + + Select destination torrent file + Selectează fişierul de destinare + + + Torrent Files + Fişiere Torrent + + + Select input directory or file + Selectează directoriul sau fişierul de intrare + + + No destination path set + Nu este setată calea de destinaţie + + + Please type a destination path first + Vă rugăm să arătaţi calea de destinaţie + + + No input path set + Nu sunt selectate fişiere de intrare + + + Please type an input path first + Vă rugăm să arătaţi calea de intrare + + + Input path does not exist + Calea de intrare nu există + + + Please type a correct input path first + Vă rugăm să introduceţi corect calea de intrare + + + Torrent creation + Crearea torentului + + + Torrent was created successfully: + Torrentul a fost creat cu success: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Descarcă + + + Cancel + Anulare + + + 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 + + + Unknown + Necunoscut + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Necunoscut + + + + options_imp + + Options saved successfully! + Opţiunile salvate! + + + Choose Scan Directory + Alegeţi Directoriul pentru Scanare + + + Choose save Directory + Selectaţi Directoriul pentru Salvare + + + Choose ipfilter.dat file + Selectaţi fişierul : ipfilter.dat + + + I/O Error + Eroare de intrare/eşire + + + Couldn't open: + Nu pot deschide: + + + in read mode. + in mod de citire. + + + Invalid Line + Linie invalidă + + + Line + Linie + + + is malformed. + este neformată. + + + Range Start IP + Domeniul de Start IP + + + Start IP: + IP-ul de start: + + + Incorrect IP + IP-ul incorrect + + + This IP is incorrect. + Acest IP este incorrect. + + + Range End IP + Domeniul de sfirşit IP + + + End IP: + IP-ul de sfirşit: + + + IP Range Comment + Comentarii la domeniul de IP + + + Comment: + Comentarii: + + + to + <min port> to <max port> + la + + + Choose your favourite preview program + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Anulare + + + + properties + + Torrent Properties + Proprietăţile Torrentului + + + Main Infos + Informaţia principală + + + File Name + Numele fişierului + + + Current Session + Sesiunea curentă + + + Total Uploaded: + Total încărcat: + + + Total Downloaded: + Total Descărcat: + + + Download state: + Starea Descărcării: + + + Current Tracker: + Tracker-ul curent: + + + Number of Peers: + Numărul de Peers: + + + Torrent Content + Conţinutul torrentului + + + OK + OK + + + Total Failed: + Total Eşuat: + + + Finished + Finişat + + + Queued for checking + In coadă pentru verificare + + + Checking files + Verificarea fişierelor + + + Connecting to tracker + Conectarea la tracker + + + Downloading Metadata + Descărcarea Metadata + + + Downloading + Descărcarea + + + Seeding + Sedarea + + + Allocating + Alocarea + + + Unknown + Necunoscut + + + Complete: + Completat: + + + Partial: + Parţial: + + + Files contained in current torrent: + Fişiere conţinute in Torrentul curent: + + + Size + Capacitate + + + Selected + Selectat + + + Unselect + Deselectare + + + Select + Selectare + + + You can select here precisely which files you want to download in current torrent. + Puteţi selecta unde precis unde fiecare fişier va fi descărcat în torrentul curent. + + + False + Fals + + + True + Adevărat + + + Tracker + Tracker + + + Trackers: + Trackere: + + + None - Unreachable? + Nimic-Neaccesibil? + + + Errors: + Erori: + + + Progress + Progress + + + Main infos + Info. principala + + + Number of peers: + Numarul de peers: + + + Current tracker: + Tracker-ul curent: + + + Total uploaded: + Total încărcat: + + + Total downloaded: + Total descărcat: + + + Total failed: + Total eronat: + + + Torrent content + Conţinutul torentului + + + Options + Opţiuni + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_ru.qm b/src/lang/qbittorrent_ru.qm new file mode 100644 index 000000000..ce9e42133 Binary files /dev/null and b/src/lang/qbittorrent_ru.qm differ diff --git a/src/lang/qbittorrent_ru.ts b/src/lang/qbittorrent_ru.ts new file mode 100644 index 000000000..b03e8ad4d --- /dev/null +++ b/src/lang/qbittorrent_ru.ts @@ -0,0 +1,1554 @@ + + + @default + + b + bytes + б + + + KB + КБ + + + MB + МБ + + + GB + ГБ + + + KB + kilobytes + КБ + + + MB + megabytes + МБ + + + GB + gigabytes + ГБ + + + + AboutDlg + + About qBittorrent + О qBittorrent + + + About + О программе + + + Author + Автор + + + Name: + Имя: + + + Country: + Страна: + + + E-mail: + Электронная почта: + + + Home page: + Домашняя страница: + + + Christophe Dumez + Кристоф Дюме (Christophe Dumez) + + + France + Франция + + + Thanks To + Благодарности + + + Translation + Перевод + + + License + Лицензия + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Клиент bittorrent, использующий пакеты QT4 и libtorrent, написанный на C++.<br> +<br> +Все права защищены © 2006 Кристоф Дюме (Christophe Dumez)<br> +<br> <u>Домашняя страница:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + КиБ/с + + + + Dialog + + Options -- qBittorrent + Опции -- qBittorrent + + + Options + Опции + + + Main + Главная + + + Save Path: + Путь для сохранения: + + + Download Limit: + Ограничение скачивания: + + + Upload Limit: + Предел загрузки: + + + Max Connects: + Максимально соединений: + + + Port range: + Диапазон портов: + + + ... + ... + + + Kb/s + Кб/с + + + Disable + Отключить + + + connections + соединения + + + to + кому + + + Proxy + Прокси + + + Proxy Settings + Настройки прокси + + + Server IP: + IP сервера: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Порт: + + + Proxy server requires authentication + Прокси-сервер требует аутентификации + + + Authentication + Аутентификация + + + User Name: + Имя пользователя: + + + Password: + Пароль: + + + Enable connection through a proxy server + Включить соединение через прокси-сервер + + + Language + Язык + + + Please choose your preferred language in the following list: + Пожалуйста, выберите подходящий язык из следующего списка: + + + OK + ОК + + + Cancel + Отмена + + + Language settings will take effect after restart. + Языковые настройки вступят в силу после перезапуска. + + + Scanned Dir: + Просканированные папки: + + + Enable directory scan (auto add torrent files inside) + Включить сканирование папки (автоматическое добавление torrent файлов внутрь) + + + Connection Settings + Настройки соединения + + + Share ratio: + Степень разделенности: + + + 1 KB DL = + 1 КБ Скач. = + + + KB UP max. + КБ ЗАГР. макс. + + + Activate IP Filtering + Включить фильтр по IP + + + Filter Settings + Настройки фильтра + + + Start IP + Начальный IP + + + End IP + Конечный IP + + + Origin + Происхождение + + + Comment + Комментарий + + + Apply + Применить + + + IP Filter + Фильтр по IP + + + Add Range + Добавить диапазон + + + Remove Range + Удалить диапазон + + + ipfilter.dat Path: + Путь к ipfilter.dat: + + + Clear finished downloads on exit + Очищать законченные закачки при выходе + + + Ask for confirmation on exit + Просить подтверждения при выходе + + + Go to systray when minimizing window + Сворачивать в системный трей + + + Misc + Разное + + + Localization + Локализация + + + Language: + Язык: + + + Behaviour + Поведение + + + OSD + OSD + + + Always display OSD + Всегда показывать OSD + + + Display OSD only if window is minimized or iconified + Показывать OSD только когда окно минимизировано + + + Never display OSD + Никогда не показывать OSD + + + KiB/s + КиБ/с + + + 1 KiB DL = + 1 КиБ Скач. = + + + KiB UP max. + КиБ Загр. макс. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + qBittorrent + qBittorrent + + + :: By Christophe Dumez :: Copyright (c) 2006 + ::Кристоф Дюме:: Все права защищены (c) 2006 + + + started. + начат. + + + qBittorrent + qBittorrent + + + DL Speed: + Скорость скач.: + + + kb/s + кб/с + + + UP Speed: + Скорость Загр.: + + + Open Torrent Files + Открыть файлы Torrent + + + Torrent Files + Файлы Torrent + + + Couldn't create the directory: + Невозможно создать директорию: + + + already in download list. + <file> already in download list. + уже в списке закачек. + + + kb/s + кб/с + + + Unknown + Неизвестно + + + added to download list. + добавлен в список закачек. + + + resumed. (fast resume) + восстановлен. (быстрое восстановление) + + + Unable to decode torrent file: + Невозможно декодировать torrent файл: + + + This file is either corrupted or this isn't a torrent. + Этот файл либо поврежден, либо не torrent типа. + + + Are you sure? -- qBittorrent + Вы уверены? -- qBittorrent + + + Are you sure you want to delete all files in download list? + Вы уверены что хотите удалить все файлы из списка закачек? + + + &Yes + &Да + + + &No + &Нет + + + Download list cleared. + Список закачек очищен. + + + Are you sure you want to delete the selected item(s) in download list? + Вы уверены что хотите удалить выделенные пункты из списка закачек? + + + removed. + <file> removed. + удален. + + + Listening on port: + Прослушивание порта: + + + paused + приостановлено + + + All Downloads Paused. + Все Закачки приостановлены. + + + started + начато + + + All Downloads Resumed. + Все Закачки Восстановлены. + + + paused. + <file> paused. + приостановлен. + + + resumed. + <file> resumed. + восстановлен. + + + <b>Connection Status:</b><br>Online + <b>Состояние соединения:</b><br>В сети + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Состояние соединения:</b><br>Работает файервол?<br><i>Нет входящих соединений...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Состояние соединения:</b><br>Отключено?<br><i>Пэры не найдены...</i> + + + has finished downloading. + скачивание завершено. + + + Couldn't listen on any of the given ports. + Невозможно прослушать ни один из заданных портов. + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Скорость скач.: + + + /s + <unit>/seconds + + + + Finished + Закончено + + + Checking... + Проверка... + + + Connecting... + Подключение... + + + Downloading... + Скачивание... + + + m + minutes + м + + + h + hours + ч + + + d + days + д + + + None + Нет + + + Empty search pattern + Закончено + + + Please type a search pattern first + Пожалуйста, наберите сначала шаблон поиска + + + No seach engine selected + Не выбрано ни одного поискового двигателя + + + You must select at least one search engine. + Вы должны выбрать по меньшей мере один поисковый двигатель. + + + Could not create search plugin. + Невозможно создать плагин поиска. + + + Searching... + Поиск... + + + Error during search + Ошибка во время поиска + + + KB/s + кб/с + + + KB/s + кб/с + + + I/O Error + Ошибка ввода/вывода + + + Torrent file URL + URL Torrent файла + + + Torrent file URL: + URL Torrent файла: + + + Are you sure you want to quit? -- qBittorrent + Вы уверены, что хотите выйти? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Вы уверены, что хотите выйти из qbittorrent? + + + KiB/s + КиБ/с + + + KiB/s + КиБ/с + + + Stalled + Заглохло + + + Search is finished + Поиск завершен + + + An error occured during search... + Во время поиска произошла ошибка... + + + Search aborted + Поиск прерван + + + Search returned no results + Поиск не дал результатов + + + Search is Finished + Поиск завершен + + + Search plugin update -- qBittorrent + Обновление поискового плагина -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Поиковый плагин может быть обновлен, вы хотите обновить его? + +Список изменений: + + + + Sorry, update server is temporarily unavailable. + Извините, сервер обновлений временно недоступен. + + + Your search plugin is already up to date. + Ваш поисковый плагин не нуждается в обновлении. + + + Results + Результаты + + + Name + Имя + + + Size + Размер + + + Progress + Прогресс + + + DL Speed + Скорость скач + + + UP Speed + Скорость загр + + + Status + Статус + + + ETA + ETA + + + Seeders + + + + Leechers + Личеры + + + Search engine + + + + Stalled + state of a torrent whose DL Speed is 0 + Заглохло + + + Paused + + + + Preview process already running + + + + There is already another preview process running. +Please close the other one first. + + + + Couldn't download + Couldn't download <file> + + + + reason: + Reason why the download failed + + + + Downloading + Example: Downloading www.example.com/test.torrent + Скачивание + + + Please wait... + + + + + MainWindow + + Log: + Лог: + + + Total DL Speed: + Общая скорость скач.: + + + Kb/s + Кб/с + + + Total UP Speed: + Общая скорость загр.: + + + Name + Имя + + + Size + Размер + + + % DL + % Скач + + + DL Speed + Скорость скач + + + UP Speed + Скорость загр + + + Status + Статус + + + ETA + ETA + + + &Options + &Настройки + + + &Edit + &Изменить + + + &File + &Файл + + + &Help + &Помощь + + + Open + Открыть + + + Exit + Выход + + + Preferences + Предпочтения + + + About + О программе + + + Start + Начать + + + Pause + Приостановить + + + Delete + Удалить + + + Pause All + Приостановить Все + + + Start All + Начать Все + + + Documentation + Документация + + + Delete All + Удалить Все + + + Torrent Properties + Свойства Torrent + + + Connection Status + Состояние соединения + + + Downloads + Закачки + + + Search + Поиск + + + Search Pattern: + Шаблон поиска: + + + Stop + Остановить + + + Status: + Состояние: + + + Stopped + Остановлено + + + Search Engines + Поисковики + + + Results: + Результаты: + + + Seeds + Источники + + + Leechers + Личеры + + + Search Engine + Поисковик + + + Download + Закачать + + + Clear + Очистить + + + Download from URL + Закачать из URL + + + KiB/s + КиБ/с + + + Create torrent + Создать torrent + + + Ratio: + Коефициент: + + + Update search plugin + Обновить плагин поиска + + + Session ratio: + + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Нет + + + True + Да + + + + QTextEdit + + Clear + Очистить + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Пожалуйста, свяжитесь со мной если вы хотите перевести qBittorrent на свой язык. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хочу поблагодарить следующих людей, кто вызвался перевести qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <li>Я хочу поблагодарить sourceforge.net за предоставление хостинга проекту qBittorrent.</li></ul> + + + <li>I also like to thank Jeffery Fernandez, our RPM packager, for his great work.</li></ul> + <li>Я также хочу поблагодарить Джеффри Фернандеса (Jeffery Fernandez), нашего RPM упаковщика, за его отличную работу.</li></ul> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>Я также хочу поблагодарить Джеффри Фернандеса (Jeffery Fernandez -developer@jefferyfernandez.id.au), нашего RPM упаковщика, за его отличную работу.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Имя + + + Size + Размер + + + Progress + Прогресс + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Пароль: + + + Log in + + + + Cancel + Отмена + + + + createTorrentDialog + + Create Torrent file + Создать файл Torrent + + + Comment: + Комментарий: + + + ... + ... + + + Create + Создать + + + Cancel + Отмена + + + Directory + Папка + + + Torrent Creation Tool + Инструмент для создания Torrent'ов + + + <center>Destination torrent file:</center> + <center>torrent файл назначения:</center> + + + <center>Input file or directory:</center> + <center>Входной файл или папка:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Анонс-URL:<br>(По одной на строку)</center> + + + <center>Comment:</center> + <center>Комментарий:</center> + + + + createtorrent + + Select destination torrent file + Выберите torrent файл назначения + + + Torrent Files + Файлы Torrent + + + Select input directory or file + Выберите входной файл или папку + + + No destination path set + Не установлен путь назначения + + + Please type a destination path first + Пожалуйста, сначала введите путь назначения + + + No input path set + Не установлен входной путь + + + Please type an input path first + Пожалуйста, сначала введите путь назначения + + + Input path does not exist + Несуществующий входной путь + + + Please type a correct input path first + Пожалуйста, сначала введите правильный входной путь + + + Torrent creation + Создание Torrent'а + + + Torrent was created successfully: + Torrent успешно создан: + + + + 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 + Ошибка ввода/вывода + + + 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 + Свойства Torrent + + + Main Infos + Главная информация + + + File Name + Имя Файла + + + Download state: + Состояние скачивания: + + + Number of Peers: + Число пэров: + + + Tracker + Трэкер + + + Trackers: + Трэкеры: + + + Current Tracker: + Текущий трэкер: + + + Errors: + Ошибки: + + + Current Session + Текущая сессия + + + Total Uploaded: + Всего закачано: + + + Total Downloaded: + Всего скачано: + + + Total Failed: + Всего неудач: + + + Torrent Content + Содержимое Torrent + + + Files contained in current torrent: + Файлы, содержащиеся в текущем torrent-е: + + + Size + Размер + + + Selected + Выбрано + + + Unselect + Отменить выбор + + + Select + Выбрать + + + You can select here precisely which files you want to download in current torrent. + Здесь вы можете выбрать заранее, какие файлы вы хотите скачать из текущего torrent-а. + + + OK + OK + + + Finished + Завершено + + + Queued for checking + В очереди на проверку + + + Checking files + Проверка файлов + + + Connecting to tracker + Подключение к трэкеру + + + Downloading Metadata + Скачивание Метаданных + + + Downloading + Скачивание + + + Seeding + Рассеивание + + + Allocating + Нахождение + + + None - Unreachable? + Нет - Недостигаемо? + + + Unknown + Неизвестно + + + Complete: + Завершено: + + + Partial: + Частично: + + + False + Нет + + + True + Да + + + Progress + Прогресс + + + Main infos + + + + Number of peers: + + + + Current tracker: + + + + Total uploaded: + + + + Total downloaded: + + + + Total failed: + + + + Torrent content + + + + Options + Опции + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_sk.qm b/src/lang/qbittorrent_sk.qm new file mode 100644 index 000000000..2b7f9b4a0 Binary files /dev/null and b/src/lang/qbittorrent_sk.qm differ diff --git a/src/lang/qbittorrent_sk.ts b/src/lang/qbittorrent_sk.ts new file mode 100644 index 000000000..1a90fc5fd --- /dev/null +++ b/src/lang/qbittorrent_sk.ts @@ -0,0 +1,1524 @@ + + + AboutDlg + + About qBittorrent + O aplik�ii qBittorrent + + + About + O + + + Author + Autor + + + Name: + Meno: + + + Country: + Krajina: + + + E-mail: + E-mail: + + + Home page: + Homepage: + + + Christophe Dumez + Christophe Dumez + + + France + Franczsko + + + Thanks To + Po�kovanie + + + Translation + Preklad + + + License + Licencia + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + + + + 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/s + + + + Dialog + + Options -- qBittorrent + Nastavenia -- qBittorrent + + + Options + Nastavenia + + + Main + Hlavn + + + Save Path: + Cesta pre uloenie: + + + Download Limit: + Limit sahovania: + + + Upload Limit: + Limit nahr�ania: + + + Max Connects: + Maximum spojen�: + + + Port range: + Rozsah portov: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Vypn + + + connections + spojenia + + + Proxy + Proxy + + + Proxy Settings + Nastavenia proxy + + + Server IP: + IP servera: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Port: + + + Proxy server requires authentication + Proxy server vyaduje autentfik�iu + + + Authentication + autentifik�ia + + + User Name: + Pou�atesk�meno: + + + Password: + Heslo: + + + Enable connection through a proxy server + Zapn spojenie pomocou proxy servera + + + Language + Jazyk + + + Please choose your preferred language in the following list: + Zvote si preferovan jazyk zo zoznamu: + + + OK + OK + + + Cancel + Storno + + + Language settings will take effect after restart. + Nastavenia jazyka sa prejavia po retarte programu. + + + Scanned Dir: + Prezeran�adres�e: + + + Enable directory scan (auto add torrent files inside) + Zapn prezeranie adres�ov (automatick�prid�anie torrent sborov) + + + Connection Settings + Nastavenia spojenia + + + Share ratio: + Pomer zdieania: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + Aktivuj filtrovanie IP + + + Filter Settings + Nastavenie filtra + + + Start IP + Po�ato��IP + + + End IP + Koncov�IP + + + Origin + Zdroj + + + Comment + Koment� + + + Apply + Poui + + + IP Filter + IP filter + + + Add Range + Prida rozsah + + + Remove Range + Odstr�i rozsah + + + ipfilter.dat Path: + Cesta k ipfilter.dat: + + + Clear finished downloads on exit + Vy�sti dokon�n�sahovania pri skon�n�programu + + + Ask for confirmation on exit + Potvrdenie skon�nia programu + + + Go to systray when minimizing window + Minimalizova medzi ikony (systray) + + + Misc + Rozli + + + Localization + + + + Language: + + + + Behaviour + + + + OSD + + + + Always display OSD + + + + Display OSD only if window is minimized or iconified + + + + Never display OSD + + + + KiB/s + 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 + Otv�a torrent sbory + + + Unknown + Nezn�e + + + This file is either corrupted or this isn't a torrent. + Tento sbor je bu�pokoden alebo nie je torrent. + + + Are you sure you want to delete all files in download list? + Ur�te chcete zmaza vetky sbory v zozname sahovanch? + + + &Yes + &�o + + + &No + &Nie + + + Are you sure you want to delete the selected item(s) in download list? + Ur�te chcete zmaza vybran�poloky v zozname sahovanch? + + + paused + pozastaven + + + started + spusten + + + Finished + skon� + + + Checking... + kontroluje sa... + + + Connecting... + prip�a sa... + + + Downloading... + sahuje sa... + + + Download list cleared. + Zoznam sahovanch vy�sten. + + + All Downloads Paused. + Vetky sahovania pozastaven�. + + + All Downloads Resumed. + Vetky sahovania znovu spusten�. + + + DL Speed: + Rchlos sahovania: + + + started. + za�t�. + + + UP Speed: + Rchlos nahr�ania: + + + Couldn't create the directory: + Nebolo mon�vytvori adres�: + + + Torrent Files + Torrent sbory + + + already in download list. + u sa nach�za v zozname sahovanch. + + + added to download list. + pridan do zoznamu sahovanch. + + + resumed. (fast resume) + znovu spusten. (rchle znovuspustenie) + + + Unable to decode torrent file: + Nemohol som dek�ova torrent sbor: + + + removed. + odstr�en. + + + paused. + pozastaven. + + + resumed. + znovu spusten. + + + Listening on port: + Po�vam na porte: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Ste si ist? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + lt;b>qBittorrent</b><br>DL Speed: + + + <b>Connection Status:</b><br>Online + lt;b>Stav spojenia:</b><br>Online + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + lt;b>Stav spojenia:</b><br>Firewalled?<br><i>iadne prich�zajce spojenia</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + lt;b>Stav spojenia:</b><br>Offline<br><i>Neboli n�den�rovesn�i...</i> + + + has finished downloading. + skon�lo sahovanie. + + + Couldn't listen on any of the given ports. + Nepodarilo sa po�va na iadnom zo zadanch portov. + + + None + iadny + + + Empty search pattern + Pr�dny vyhad�ac�vzor + + + Please type a search pattern first + Pros�, najprv zadajte vyhad�ac�vzor + + + No seach engine selected + Nebol zvolen vyhadva + + + You must select at least one search engine. + Mus�e zvoli aspo�jeden vyhad�a�. + + + Searching... + Had�sa... + + + Could not create search plugin. + Nemohol som vytvori plugin pre vyhad�anie. + + + Stopped + Zastaven + + + Torrent file URL + URL torrent sboru + + + Torrent file URL: + URL torrent sboru: + + + Are you sure you want to quit? -- qBittorrent + Ur�te chcete ukon� program? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Ur�te chcete ukon� qbittorrent? + + + Timed out + as vypral + + + Error during search... + Chyba po�s hadania... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Zastaven + + + removed. + <file> removed. + odstr�en. + + + already in download list. + <file> already in download list. + u sa nach�za v zozname sahovanch. + + + paused. + <file> paused. + pozastaven. + + + resumed. + <file> resumed. + znovu spusten. + + + 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 + N�ov + + + Size + Vekos + + + Progress + + + + DL Speed + rchlos sahovania + + + UP Speed + rchlos nahr�ania + + + Status + Status + + + ETA + Odhadovan �s + + + Seeders + + + + Leechers + Leecheri + + + Search engine + + + + Stalled + state of a torrent whose DL Speed is 0 + Zastaven + + + 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 + Sahujem + + + Please wait... + + + + + MainWindow + + Log: + Log: + + + Total DL Speed: + Celkov�rchlos sahovania: + + + Total UP Speed: + Celkov�rchlos nahr�ania: + + + Name + N�ov + + + Size + Vekos + + + % DL + sahovania + + + DL Speed + rchlos sahovania + + + UP Speed + rchlos nahr�ania + + + Status + Status + + + ETA + Odhadovan �s + + + &Options + &Nastavenia + + + &Edit + &�ravy + + + &File + &Sbor + + + &Help + &Pomocn� + + + Open + Otvori + + + Exit + Ukon� + + + Preferences + Nastavenia + + + About + O aplik�ii + + + Start + Spusti + + + Pause + Pozastavi + + + Delete + Zmaza + + + Pause All + Pozastavi vetky + + + Start All + Spusti vetky + + + Documentation + Dokument�ia + + + Delete All + Zmaza vetky + + + Torrent Properties + Vlastnosti torrentu + + + Connection Status + Stav spojenia + + + Downloads + Sahovania + + + Search + Vyhad�anie + + + Search Pattern: + Vyhad�ac�vzor: + + + Status: + Stav: + + + Stopped + Zastaven + + + Search Engines + Vyhad�a� + + + Results: + Vsledky: + + + Stop + Zastavi + + + Seeds + Seedy + + + Leechers + Leecheri + + + Search Engine + Vyhad� + + + Download from URL + Stiahnu z URL + + + Download + Stiahnu + + + Clear + Vy�sti + + + KiB/s + KiB/s + + + Create torrent + Vytvori torrent + + + Update search plugin + + + + Session ratio: + + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Nie + + + True + no + + + + QTextEdit + + Clear + Vy�sti + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Pros�, kontaktujte ma, ak chcete preloi qBittorrent do vlastn�o jazyka. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + R� by som po�koval nasledovnm dobrovon�om, ktor�preloili qBittorrent: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + lt;ul><li>R� by som po�koval serveru sourceforge.net za hosting projektu qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + lt;li>Tie by som r� po�koval Jefferymu Fernandezovi (developer@jefferyfernandez.id.au), n�u tvorcovi RPM bal�kov, za jeho skvel pr�u.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + N�ov + + + Size + Vekos + + + Progress + + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Heslo: + + + Log in + + + + Cancel + Storno + + + + createTorrentDialog + + Dialog + Dial� + + + Create Torrent file + Vytvori Torrent sbor + + + Destination torrent file: + Cieov torrent sbor: + + + Input file or directory: + Vstupn sbor alebo adres�: + + + Comment: + Koment�: + + + ... + ... + + + Create + Vytvori + + + Cancel + Storno + + + Announce url (Tracker): + Announce url (Tracker): + + + Directory + Adres� + + + 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 + Vybra cieov torrent sbor + + + Torrent Files + Torrent sbory + + + Select input directory or file + Vyberte vstupn adres� alebo sbor + + + No destination path set + Nebola nastaven�cieov�cesta + + + Please type a destination path first + Nap�e pros� najprv cieov cestu + + + No input path set + Nebola zadan�vstupn�cesta + + + Please type an input path first + Nap�e pros� najprv vstupn cestu + + + Input path does not exist + Vstupn�cesta neexistuje + + + Please type a correct input path first + Pros�, nap�e spr�nu vstupn cestu + + + Torrent creation + + + + Torrent was created successfully: + + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Stiahnu + + + Cancel + Storno + + + Download from urls + + + + + misc + + B + B + + + KiB + KiB + + + MiB + MiB + + + GiB + GiB + + + TiB + TiB + + + m + m + + + h + h + + + Unknown + Nezn�y + + + h + h + + + d + d + + + B + bytes + B + + + KiB + kibibytes (1024 bytes) + KiB + + + MiB + mebibytes (1024 kibibytes) + MiB + + + GiB + gibibytes (1024 mibibytes) + GiB + + + TiB + tebibytes (1024 gibibytes) + TiB + + + m + minutes + m + + + h + hours + h + + + d + days + d + + + h + hours + h + + + Unknown + Unknown (size) + + + + + options_imp + + Options saved successfully! + Nastavenia spene uloen�! + + + Choose Scan Directory + Vyberte adres�, ktor sa bude prehliada + + + Choose save Directory + Vyberte adres�, kde sa bude uklada + + + Choose ipfilter.dat file + Vyberte ipfilter.dat sbor + + + I/O Error + V/V Chyba + + + Couldn't open: + Nemohol som otvori: + + + in read mode. + na �tanie. + + + Invalid Line + neplatn riadok + + + Line + riadok + + + is malformed. + je v zlom tvare. + + + Range Start IP + Po�ato��IP rozsahu + + + Start IP: + Po�ato��IP: + + + Incorrect IP + Nespr�na IP + + + This IP is incorrect. + T�o IP je nespr�na. + + + Range End IP + Koncov�IP rozsahu + + + End IP: + Koncov�IP: + + + IP Range Comment + Koment� k IP rozsahu + + + Comment: + Koment�: + + + to + a + + + 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 + Storno + + + + properties + + Torrent Properties + Vlastnosti torrentu + + + Main Infos + Hlavn�info + + + File Name + N�ov sboru + + + Current Session + S�sn�rel�ia + + + Total Uploaded: + Celkovo nahran: + + + Total Downloaded: + Celkovo stiahnut: + + + Download state: + Stav sahovania: + + + Current Tracker: + S�sn tracker: + + + Number of Peers: + Po�t rovesn�ov: + + + Torrent Content + Obsah torrentu + + + OK + OK + + + Total Failed: + Celkov po�t zlyhan: + + + Finished + Skon� + + + Queued for checking + Zaraden�do frontu pre kontrolu + + + Checking files + Kontrolujem sbory + + + Connecting to tracker + Prip�am sa k trackeru + + + Downloading Metadata + Sahujem metad�a + + + Downloading + Sahujem + + + Seeding + Seedujem + + + Allocating + Alokujem + + + Unknown + Nezn�y + + + Complete: + Dokon�n: + + + Partial: + iasto�e: + + + Files contained in current torrent: + Sbory obsiahnut�v s�snom torrente: + + + Size + Vekos + + + Selected + Vybran + + + Unselect + Odober + + + Select + Vyber + + + You can select here precisely which files you want to download in current torrent. + Tu m�te presne vybra, ktor�sbory zo s�sn�o torrentu chcete stiahnu. + + + False + Nie + + + True + no + + + Tracker + Tracker + + + Trackers: + Trackery: + + + None - Unreachable? + iadne - Nedostupn? + + + Errors: + Chyby: + + + Progress + + + + Main infos + + + + Number of peers: + + + + Current tracker: + + + + Total uploaded: + + + + Total downloaded: + + + + Total failed: + + + + Torrent content + + + + Options + Nastavenia + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_sv.qm b/src/lang/qbittorrent_sv.qm new file mode 100644 index 000000000..6205cd124 Binary files /dev/null and b/src/lang/qbittorrent_sv.qm differ diff --git a/src/lang/qbittorrent_sv.ts b/src/lang/qbittorrent_sv.ts new file mode 100644 index 000000000..416bd880b --- /dev/null +++ b/src/lang/qbittorrent_sv.ts @@ -0,0 +1,1331 @@ + + + AboutDlg + + About qBittorrent + Om qBittorrent + + + About + Om + + + Author + Upphovsman + + + Name: + Namn: + + + Country: + Land: + + + E-mail: + E-post: + + + Home page: + Hemsida: + + + Christophe Dumez + Christophe Dumez + + + France + Frankrike + + + Thanks To + Tack till + + + Translation + Översättning + + + License + Licens + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + En bittorrent-klient som använder Qt4 och libtorrent, programmerad i C++.<br> +<br> +Copyright © 2006 Christophe Dumez<br> +<br> <u>Webbplats:</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> + En bittorrent-klient som använder Qt4 och libtorrent, programmerad i C++.<br> +<br> +Copyright © 2006 Christophe Dumez<br> +<br> <u>Webbplats:</u> <i>http://www.qbittorrent.org</i><br> + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + KiB/s + + + + Dialog + + Options -- qBittorrent + Alternativ -- qBittorrent + + + Options + Alternativ + + + Main + Huvud + + + Save Path: + Plats att spara filer i: + + + Download Limit: + Hämtningsgräns: + + + Upload Limit: + Sändningsgräns: + + + Max Connects: + Max anslutningar: + + + Port range: + Portomfång: + + + ... + ... + + + Disable + Inaktivera + + + connections + anslutningar + + + Proxy + Proxy + + + Proxy Settings + Proxyinställningar + + + Server IP: + Server-IP: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Port: + + + Proxy server requires authentication + Proxyserver kräver autentisering + + + Authentication + Autentisering + + + User Name: + Användarnamn: + + + Password: + Lösenord: + + + Enable connection through a proxy server + Aktivera anslutning genom en proxyserver + + + OK + OK + + + Cancel + Avbryt + + + Scanned Dir: + Avsökningskatalog: + + + Enable directory scan (auto add torrent files inside) + Aktivera katalogavsökning (lägg automatiskt till torrent-filer) + + + Connection Settings + Anslutningsinställningar + + + Share ratio: + Utdelningsratio: + + + Activate IP Filtering + Aktivera IP-filtrering + + + Filter Settings + Filterinställningar + + + Start IP + Start-IP + + + End IP + Slut-IP + + + Origin + Ursprung + + + Comment + Kommentar + + + Apply + Verkställ + + + IP Filter + IP-filter + + + Add Range + Lägg till omfång + + + Remove Range + Ta bort omfång + + + ipfilter.dat Path: + ipfilter.dat SÖKVÄG: + + + Clear finished downloads on exit + Rensa ut färdiga hämtningar vid avslut + + + Ask for confirmation on exit + Fråga efter bekräftelse vid avslut + + + Go to systray when minimizing window + Gå till systembricka vid minimering av fönster + + + Misc + Diverse + + + Localization + Lokalisering + + + Language: + Språk: + + + Behaviour + Beteende + + + OSD + OSD + + + Always display OSD + Visa alltid OSD + + + Display OSD only if window is minimized or iconified + Visa endast OSD om fönstret är minimerat eller ikonifierat + + + Never display OSD + Visa aldrig OSD + + + KiB/s + KiB/s + + + 1 KiB DL = + 1 KiB hämtning = + + + KiB UP max. + KiB sändning max. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + Öppna Torrent-filer + + + This file is either corrupted or this isn't a torrent. + Denna fil är antingen skadad eller så är den inte en torrent-fil. + + + Are you sure you want to delete all files in download list? + Är du säker på att du vill ta bort alla filer i hämtningslistan? + + + &Yes + &Ja + + + &No + &Nej + + + Are you sure you want to delete the selected item(s) in download list? + Är du säker på att du vill ta bort de markerade post(erna) i hämtningslistan? + + + Finished + Färdig + + + Checking... + Kontrollerar... + + + Connecting... + Ansluter... + + + Downloading... + Hämtar... + + + Download list cleared. + Hämtningslista tömd. + + + All Downloads Paused. + Alla hämtningar är pausade. + + + All Downloads Resumed. + Alla hämtningar har återupptagits. + + + DL Speed: + Hämtningshastighet: + + + started. + startad. + + + UP Speed: + Sändningshastighet: + + + Couldn't create the directory: + Kunde inte skapa katalogen: + + + Torrent Files + Torrent-filer + + + already in download list. + <file> already in download list. + redan i hämtningslistan. + + + added to download list. + lades till i hämtningslistan. + + + resumed. (fast resume) + återupptagen. (snabbt läge) + + + Unable to decode torrent file: + Kunde inte avkoda torrent-fil: + + + removed. + <file> removed. + borttagen. + + + paused. + <file> paused. + pausad. + + + resumed. + <file> resumed. + återupptagen. + + + Listening on port: + Lyssnar på port: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Är du säker? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>Hämtningshastighet: + + + <b>Connection Status:</b><br>Online + <b>Anslutningsstatus:</b><br>Ansluten + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Anslutningsstatus:</b><br>Bakom brandvägg?<br><i>Inga inkommande anslutningar...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Anslutningsstatus:</b><br>Frånkopplad<br><i>Inga peers hittades...</i> + + + has finished downloading. + har hämtats färdigt. + + + Couldn't listen on any of the given ports. + Kunde inte lyssna på någon av de angivna portarna. + + + None + Ingen + + + Empty search pattern + Tomt sökmönster + + + Please type a search pattern first + Ange ett sökmönster först + + + No seach engine selected + Ingen sökmotor vald + + + You must select at least one search engine. + Du måste välja åtminstone en sökmotor. + + + Searching... + Söker... + + + Torrent file URL + URL för torrent-fil + + + Torrent file URL: + URL för torrent-fil: + + + Are you sure you want to quit? -- qBittorrent + Är du säker på att du vill avsluta? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Är du säker på att du vill avsluta qbittorrent? + + + KiB/s + KiB/s + + + Search is finished + Sökningen är färdig + + + An error occured during search... + Ett fel inträffade under sökningen... + + + Search aborted + Sökningen avbröts + + + Search returned no results + Sökningen resulterade inte i några träffar + + + Search is Finished + Sökningen är färdig + + + Search plugin update -- qBittorrent + Sök efter uppdateringar för insticksmoduler -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Insticksmodul för sökning kan uppdateras, vill du uppdatera den? + +Ändringslogg: + + + Sorry, update server is temporarily unavailable. + Tyvärr, uppdateringsservern är inte tillgänglig för tillfället. + + + Your search plugin is already up to date. + Din insticksmodul för sökning är den senaste. + + + Results + Resultat + + + Name + Namn + + + Size + Storlek + + + Progress + Förlopp + + + DL Speed + Hämtningshastighet + + + UP Speed + Sändningshastighet + + + Status + Status + + + ETA + Klar om + + + Seeders + Distributörer + + + Leechers + Reciprokörer + + + Search engine + Sökmotor + + + Stalled + state of a torrent whose DL Speed is 0 + Försenad + + + Paused + Pausad + + + 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 + Hämtar + + + Please wait... + + + + + MainWindow + + Log: + Logg: + + + Total DL Speed: + Total hämtningshastighet: + + + Total UP Speed: + Total sändningshastighet: + + + &Options + A&lternativ + + + &Edit + R&edigera + + + &File + &Arkiv + + + &Help + &Hjälp + + + Open + Öppna + + + Exit + Avsluta + + + Preferences + Inställningar + + + About + Om + + + Start + Start + + + Pause + Paus + + + Delete + Ta bort + + + Pause All + Pausa alla + + + Start All + Starta alla + + + Documentation + Dokumentation + + + Delete All + Ta bort alla + + + Torrent Properties + Egenskaper för torrent + + + Connection Status + Anslutningsstatus + + + Downloads + Hämtningar + + + Search + Sök + + + Search Pattern: + Sökmönster: + + + Status: + Status: + + + Stopped + Stoppad + + + Search Engines + Sökmotorer + + + Results: + Resultat: + + + Stop + Stopp + + + Download from URL + Hämta från url + + + Download + Hämta + + + Clear + Töm + + + KiB/s + KiB/s + + + Create torrent + Skapa torrent + + + Update search plugin + Uppdatera sökinstick + + + Session ratio: + Sessionsratio: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Falskt + + + True + Sant + + + + QTextEdit + + Clear + Töm + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Kontakta mig om du vill översätta qBittorrent till ditt egna språk. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Jag vill tacka följande personer som bidragit med att översätta qBittorrent: + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Namn + + + Size + Storlek + + + Progress + Förlopp + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Lösenord: + + + Log in + + + + Cancel + Avbryt + + + + createTorrentDialog + + Create Torrent file + Skapa torrent-fil + + + ... + ... + + + Create + Skapa + + + Cancel + Avbryt + + + Directory + Katalog + + + Torrent Creation Tool + Verktyg för att skapa torrent + + + <center>Destination torrent file:</center> + <center>Måltorrentfil:</center> + + + <center>Input file or directory:</center> + <center>Fil eller katalog för inmatning:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Annonserings-url:<br>(en per rad)</center> + + + <center>Comment:</center> + <center>Kommentar:</center> + + + + createtorrent + + Select destination torrent file + Välj mål för torrent-fil + + + Torrent Files + Torrent-filer + + + Select input directory or file + Välj katalog eller fil för indata + + + No destination path set + Ingen målsökväg inställd + + + Please type a destination path first + Ange en målsökväg först + + + No input path set + Ingen sökväg inställd för indata + + + Please type an input path first + Ange en sökväg för indata först + + + Input path does not exist + Sökvägen för indata finns inte + + + Please type a correct input path first + Ange en korrekt sökväg för indata + + + Torrent creation + Skapande av torrent + + + Torrent was created successfully: + Torrent skapades: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Hämta + + + Cancel + Avbryt + + + 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 + + + Unknown + Okänd + + + h + hours + h + + + d + days + d + + + Unknown + Unknown (size) + Okänd + + + + options_imp + + Options saved successfully! + Alternativ sparades! + + + Choose Scan Directory + Välj avsökningskatalog + + + Choose save Directory + Välj katalog att spara i + + + Choose ipfilter.dat file + Välj ipfilter.dat-fil + + + I/O Error + In-/Ut-fel + + + Couldn't open: + Kunde inte öppna: + + + in read mode. + i läsläge. + + + Invalid Line + Ogiltig rad + + + Line + Raden + + + is malformed. + är felaktig. + + + Range Start IP + Omfång start-IP + + + Start IP: + Start-IP: + + + Incorrect IP + Felaktig IP + + + This IP is incorrect. + Denna IP-adress är felaktig. + + + Range End IP + Omfång slut-IP + + + End IP: + Slut-IP: + + + IP Range Comment + Kommentar om IP-omfång + + + Comment: + Kommentar: + + + to + <min port> to <max port> + till + + + Choose your favourite preview program + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + Avbryt + + + + properties + + Torrent Properties + Egenskaper om torrent + + + File Name + Filnamn + + + Current Session + Aktuell session + + + Download state: + Hämtningstillstånd: + + + OK + OK + + + Finished + Färdig + + + Queued for checking + Köad för kontroll + + + Checking files + Kontrollerar filer + + + Connecting to tracker + Ansluter till tracker + + + Downloading Metadata + Hämtar metadata + + + Downloading + Hämtar + + + Seeding + Distribuerar + + + Allocating + Allokerar + + + Unknown + Okänd + + + Complete: + Färdig: + + + Partial: + Delvis: + + + Files contained in current torrent: + Filer i aktuell torrent: + + + Size + Storlek + + + Selected + Markerad + + + Unselect + Avmarkera + + + Select + Markera + + + You can select here precisely which files you want to download in current torrent. + Här kan du välja precis vilka filer du vill hämta i aktuell torrent. + + + False + Falskt + + + True + Sant + + + Tracker + Tracker + + + Trackers: + Trackers: + + + None - Unreachable? + Ingen - Ej nåbar? + + + Errors: + Fel: + + + Progress + Förlopp + + + Main infos + Huvudinformation + + + Number of peers: + Antal peer: + + + Current tracker: + Aktuell tracker: + + + Total uploaded: + Totalt uppskickat: + + + Total downloaded: + Totalt hämtat: + + + Total failed: + Totalt misslyckat: + + + Torrent content + Innehåll i torrent + + + Options + Alternativ + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_tr.qm b/src/lang/qbittorrent_tr.qm new file mode 100644 index 000000000..2dec46b15 Binary files /dev/null and b/src/lang/qbittorrent_tr.qm differ diff --git a/src/lang/qbittorrent_tr.ts b/src/lang/qbittorrent_tr.ts new file mode 100644 index 000000000..8011a9229 --- /dev/null +++ b/src/lang/qbittorrent_tr.ts @@ -0,0 +1,1656 @@ + + + @default + + b + bytes + b + + + KB + KB + + + MB + MB + + + GB + GB + + + KB + kilobytes + KB + + + MB + megabytes + MB + + + GB + gigabytes + GB + + + + AboutDlg + + About qBittorrent + qBittorrent Hakkında + + + About + Hakkında + + + Author + Yazar + + + Name: + İsim: + + + Country: + Ülke: + + + E-mail: + E-posta: + + + Home page: + Anasayfa: + + + Christophe Dumez + Christophe Dumez + + + France + Fransa + + + chris@dchris.eu + chris@dchris.eu + + + http://dchris.eu + http://dchris.eu + + + Thanks To + Teşekkürler + + + Translation + Çeviri + + + License + Lisans + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + Qt4 ve libtorrent kullanan, C++ da derlenmiş bir bittorrent istemcisi.<br> +<br> +Telif Hakkı © 2006 Christophe Dumez<br> +<br> <u>Anasayfa:</u> <i>http://qbittorrent.sourceforge.net</i><br> + + + qBittorrent Author + qBittorrent Yazarı + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Qt4 ve libtorrent kullanan, C++ da derlenmiş bir bittorrent istemcisi.<br> +<br> +Telif Hakkı © 2006 Christophe Dumez<br> +<br> <u>Anasayfa:</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 + Ayarlar -- qBittorrent + + + Options + Ayarlar + + + Main + Ana + + + Save Path: + Kayıt Yeri: + + + Download Limit: + Download Limiti: + + + Upload Limit: + Upload Limiti: + + + Max Connects: + Max Bağlantı: + + + Port range: + Port aralığı: + + + ... + ... + + + Kb/s + Kb/s + + + Disable + Etkisizleştir + + + connections + bağlantı + + + to + buraya + + + Proxy + Proxy + + + Proxy Settings + Proxy Ayarları + + + Server IP: + Sunucu Adresi: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Port: + + + Proxy server requires authentication + Proxy sunucusu kimlik denetimi gerektiriyor + + + Authentication + Kimlik Denetimi + + + User Name: + Kullanıcı Adı: + + + Password: + Şifre: + + + Enable connection through a proxy server + Proxy sunucusu üzerinden bağlantı kurmayı etkinleştir + + + Language + Dil + + + Please choose your preferred language in the following list: + Lütfen aşağıdaki listeden tercih ettiğiniz dili seçin: + + + English + İngilizce + + + French + Fransızca + + + Simplified Chinese + Basitleştirilmiş Çince + + + OK + TAMAM + + + Cancel + İptal + + + Language settings will take effect after restart. + Dil ayarları program yeniden başlatıldıktan sonra devreye girecektir. + + + Scanned Dir: + Taranmış Klasör: + + + Enable directory scan (auto add torrent files inside) + Klasör taramayı etkinleştir (otomatik torrent dosyası ekleme) + + + Korean + Korece + + + Spanish + İspanyolca + + + German + Almanca + + + Connection Settings + Bağlantı Ayarları + + + Share ratio: + Paylaşım oranı: + + + 1 KB DL = + 1 KB DL = + + + KB UP max. + KB UP max. + + + Activate IP Filtering + IP Filtrelemeyi Etkinleştir + + + Filter Settings + Filtre Ayarları + + + ipfilter.dat URL or PATH: + ipfilter.dat URL veya KLASÖR: + + + Start IP + Başlangıç IP + + + End IP + Bitiş IP + + + Origin + Merkez + + + Comment + Yorum + + + Apply + Uygula + + + IP Filter + IP Filtresi + + + Add Range + Aralık Ekle + + + Remove Range + Aralığı Kaldır + + + Catalan + Catalan + + + ipfilter.dat Path: + ipfilter.dat KLASÖR: + + + Clear finished downloads on exit + Çıkarken biten downloadları temizle + + + Ask for confirmation on exit + Çıkarken onaylama sor + + + Go to systray when minimizing window + Pencereyi sistem çubuğuna küçült + + + Misc + Çeşitli + + + Localization + Yerelleştirme + + + Language: + Dil: + + + Behaviour + Davranış + + + OSD + OSD + + + Always display OSD + Her zaman OSD yi göster + + + Display OSD only if window is minimized or iconified + OSD yi sadece pencere küçültülmüşken ya da simge durumundayken göster + + + Never display OSD + OSD yi asla gösterme + + + KiB/s + 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 + Torrent Dosyasını Aç + + + kb/s + kb/s + + + Unknown + Bilinmeyen + + + This file is either corrupted or this isn't a torrent. + Bu dosya bozuk ya da torrent dosyası değil. + + + Are you sure you want to delete all files in download list? + Download listesindeki bütün dosyaları silmek istediğinizden emin misiniz? + + + &Yes + &Evet + + + &No + &Hayır + + + Are you sure you want to delete the selected item(s) in download list? + Download listesindeki seçili öğeleri silmek istediğinize emin misiniz? + + + paused + duraklatıldı + + + started + başlatıldı + + + kb/s + kb/s + + + Finished + Tamamlandı + + + Checking... + Kontrol ediliyor... + + + Connecting... + Bağlanılıyor... + + + Downloading... + Download ediliyor... + + + Download list cleared. + Download listesi temizlendi. + + + All Downloads Paused. + Bütün Downloadlar Duraklatıldı. + + + All Downloads Resumed. + Bütün Downloadlar Devam Ettirildi. + + + DL Speed: + DL Hızı: + + + started. + başlatıldı. + + + UP Speed: + UP Hızı: + + + Couldn't create the directory: + Klasör yaratılamıyor: + + + Torrent Files + Torrent Dosyaları + + + already in download list. + <file> already in download list. + zaten download listesinde bulunuyor. + + + added to download list. + download listesine eklendi. + + + resumed. (fast resume) + devam ettirildi. (fast resume) + + + Unable to decode torrent file: + Torrent dosyası çözülemiyor: + + + removed. + <file> removed. + silindi. + + + paused. + <file> paused. + duraklatıldı. + + + resumed. + <file> resumed. + devam ettirildi. + + + m + minutes + d + + + h + hours + sa + + + d + days + g + + + Listening on port: + Port dinleniyor: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Emin misiniz? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL Hızı: + + + :: By Christophe Dumez :: Copyright (c) 2006 + .: Cristophe Dumez tarafından hazırlanmıştır :: Telif Hakkı (c) 2006 + + + <b>Connection Status:</b><br>Online + <b>Bağlantı Durumu:</b><br> Bağlı + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Bağlantı Durumu:</b><br>Güvenlik Duvarınız mı açık?<br><i>Gelen bağlantı yok...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Bağlantı Durumu:</b><br>Bağlı Değil<br><i>Kullanıcı bulunamadı...</i> + + + /s + <unit>/seconds + /s + + + has finished downloading. + download tamamlandı. + + + Couldn't listen on any of the given ports. + Verilen portların hiçbiri dinlenemedi. + + + None + Yok + + + Empty search pattern + Boş arama sorgusu + + + Please type a search pattern first + Lütfen önce bir arama sorgusu girin + + + No seach engine selected + Arama motoru seçilmedi + + + You must select at least one search engine. + En az bir arama motoru seçmelisiniz. + + + Searching... + Aranıyor... + + + Could not create search plugin. + Arama eklentisi oluşturulamıyor. + + + Stopped + Durdu + + + I/O Error + I/O Hatası + + + Couldn't create temporary file on hard drive. + Sabit diskte geçici klasör oluşturulamıyor. + + + Torrent file URL + Torrent dosya URLsi + + + KB/s + KB/s + + + KB/s + KB/s + + + Downloading using HTTP: + HTTP kullanılarak download ediliyor: + + + Torrent file URL: + Torrent dosyası URLsi: + + + A http download failed... + Bir http download u başarısız... + + + A http download failed, reason: + Bir http download u başarısız, neden: + + + Are you sure you want to quit? -- qBittorrent + Çıkmak istediğinize emin misiniz? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + qBittorrentten çıkmak istediğinize emin misiniz? + + + Timed out + Zaman aşıldı + + + Error during search... + Arama yapılırken hata... + + + KiB/s + KiB/s + + + KiB/s + KiB/s + + + Stalled + Hız kaybetti + + + Search is finished + Arama tamamlandı + + + An error occured during search... + Arama yapılırken bir hata oluştu... + + + Search aborted + Arama iptal edildi + + + Search returned no results + Arama sonuç bulamadı + + + Search is Finished + Arama Tamamlandı + + + Search plugin update -- qBittorrent + Arama plugini güncellemesi -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Arama plugini güncellenebilir, güncellemek ister misiniz? + +Changelog: + + + + Sorry, update server is temporarily unavailable. + Üzgünüz, güncelleme sunucusu geçici olarak servis dışı. + + + Your search plugin is already up to date. + Arama plugini zaten güncel durumda. + + + Results + Sonuçlar + + + Name + İsim + + + Size + Boyut + + + Progress + İlerleme + + + DL Speed + DL Hızı + + + UP Speed + UP Hızı + + + Status + Durum + + + ETA + ETA + + + Seeders + Seeders + + + Leechers + Leechers + + + Search engine + Arama motoru + + + Stalled + state of a torrent whose DL Speed is 0 + Hız kaybetti + + + Paused + Duraklatıldı + + + Preview process already running + + + + 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 + Download ediliyor + + + Please wait... + + + + + MainWindow + + qBittorrent :: By Christophe Dumez + qBittorrent :: By Christophe Dumez + + + Log: + Log: + + + Total DL Speed: + Toplam DL Hızı: + + + Kb/s + Kb/s + + + Total UP Speed: + Toplam UP Hızı: + + + Name + İsim + + + Size + Boyut + + + % DL + % DL + + + DL Speed + DL Hızı + + + UP Speed + UP Hızı + + + Status + Durum + + + ETA + ETA + + + &Options + &Ayarlar + + + &Edit + D&üzen + + + &File + &Dosya + + + &Help + &Yardım + + + Open + + + + Exit + Çıkış + + + Preferences + Seçenekler + + + About + Hakkında + + + Start + Başlat + + + Pause + Duraklat + + + Delete + Sil + + + Pause All + Hepsini Duraklat + + + Start All + Hepsini Duraklat + + + Documentation + Kullanım Kılavuzu + + + Connexion Status + Bağlantı Durumu + + + Delete All + Hepsini Sil + + + Torrent Properties + Torrent Özellikleri + + + Connection Status + Bağlantı Durumu + + + Downloads + Downloadlar + + + Search + Arama + + + Search Pattern: + Arama Sorgusu: + + + Status: + Durum: + + + Stopped + Durdu + + + Search Engines + Arama Motorları + + + Results: + Sonuçlar: + + + Stop + Dur + + + Seeds + Seeds + + + Leechers + Leechers + + + Search Engine + Arama Motoru + + + Download from URL + URL Adresinden Download + + + Download + Download + + + Clear + Temizle + + + KiB/s + KiB/s + + + Create torrent + Torrent oluştur + + + Ratio: + Oran: + + + Update search plugin + Arama pluginini güncelle + + + Session ratio: + Oturum oranı: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Hayır + + + True + Evet + + + + QTextEdit + + Clear + Temizle + + + + Ui + + I would like to thank the following people who volonteered to translate qBittorrent: + qBittorrent için gönüllü olarak çevirmenlik yapanlara teşekkürlerimi sunarım: + + + Please contact me if you would like to translate qBittorrent to your own language. + Eğer qBittorrent i kendi dilinize çevirmek istiyorsanız lütfen benimle iletişim kurun. + + + I would like to thank sourceforge.net for hosting qBittorrent project. + qBittorrent projesini barındırdıkları için sourceforge.net e teşekkürlerimi sunarım. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + qBittorrent için gönüllü olarak çevirmenlik yapanlara teşekkürlerimi sunarım: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>qBittorrent projesini barındırdıkları için sourceforge.net e teşekkürlerimi sunarım.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>RPM paketleyicimiz olan Jeffery Fernandez (developer@jefferyfernandez.id.au) e de ayrıca üstün çalışmalarından dolayı teşekkürlerimi sunarım.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + İsim + + + Size + Boyut + + + Progress + İlerleme + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Şifre: + + + Log in + + + + Cancel + İptal + + + + createTorrentDialog + + Create Torrent file + Torrent dosyası oluştur + + + Destination torrent file: + Kaynak torrent dosyası: + + + Input file or directory: + Girdi dosyası veya klasör: + + + Comment: + Yorum: + + + ... + ... + + + Create + Oluştur + + + Cancel + İptal + + + Announce url (Tracker): + İlan URLsi (Tracker): + + + Directory + Klasör + + + Torrent Creation Tool + Torrent Oluşturma Aracı + + + <center>Destination torrent file:</center> + <center>Kaynak Torrent dosyası:</center> + + + <center>Input file or directory:</center> + <center>Girdi dosyası ya da klasörü:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Announce url:<br>(Satır başına bir tane)</center> + + + <center>Comment:</center> + <center>Yorum:</center> + + + + createtorrent + + Select destination torrent file + Kaynak Torrent dosyasını seç + + + Torrent Files + Torrent Dosyaları + + + Select input directory or file + Girdi klasörü veya dosyası seç + + + No destination path set + Kaynak yolu seçilmemiş + + + Please type a destination path first + Lütfen önce bir kaynak yolu seçin + + + No input path set + Girdi yolu seçilmedi + + + Please type an input path first + Lütfen önce bir girdi yolu seçin + + + Input path does not exist + Girdi yolu bulunamadı + + + Please type a correct input path first + Lütfen önce düzgün bir girdi yolu seçin + + + Torrent creation + Torrent oluşturumu + + + Torrent was created successfully: + Torrent başarıyla oluşturuldu: + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + Download + + + Cancel + İptal + + + 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 + d + + + h + hours + sa + + + d + days + g + + + Unknown + Bilinmeyen + + + h + hours + sa + + + d + days + g + + + Unknown + Unknown (size) + Bilinmeyen + + + + options_imp + + Options saved successfully! + Ayarlar başarıyla kaydedildi! + + + Choose Scan Directory + Taranacak Klasörü Seçin + + + Choose save Directory + Kayıt klasörünü seçin + + + Choose ipfilter.dat file + IPfilter.dat dosyasını seçin + + + I/O Error + I/O Hatası + + + Couldn't open: + Açılamadı: + + + in read mode. + salt okunur durumda. + + + Invalid Line + Geçersiz Satır + + + Line + Satır + + + is malformed. + bozulmuş. + + + Range Start IP + IP Başlangıç Aralığı + + + Start IP: + Başlangıç IP: + + + Incorrect IP + Yanlış IP + + + This IP is incorrect. + Bu IP Adresi yanlıştır. + + + Range End IP + IP Bitiş Aralığı + + + End IP: + Bitiş IP: + + + IP Range Comment + IP Aralığı Yorumu + + + Comment: + Yorum: + + + to + <min port> to <max port> + dan + + + Choose your favourite preview program + + + + + preview + + Preview selection + + + + File preview + + + + The following files support previewing, <br>please select one of them: + + + + Preview + + + + Cancel + İptal + + + + properties + + Torrent Properties + Torrent Özellikleri + + + Main Infos + Ana Bilgiler + + + File Name + Dosya Adı + + + Current Session + Şimdiki Oturum + + + Total Uploaded: + Toplam Upload: + + + Total Downloaded: + Toplam Download: + + + Download state: + Download durumu: + + + Current Tracker: + Şimdiki Tracker: + + + Number of Peers: + Kullanıcı Sayısı: + + + Torrent Content + Torrent İçeriği + + + OK + TAMAM + + + Total Failed: + Toplam Başarısız: + + + Finished + Tamamlandı + + + Queued for checking + Kontrol işlemi için sıralandırıldı + + + Checking files + Dosyalar kontrol ediliyor + + + Connecting to tracker + Tracker a bağlanılıyor + + + Downloading Metadata + Metadata Download Ediliyor + + + Downloading + Download ediliyor + + + Seeding + Oluşturuluyor + + + Allocating + Ayrılıyor + + + Unknown + Bilinmeyen + + + Complete: + Tamamlandı: + + + Partial: + Kısmi: + + + Files contained in current torrent: + Şimdiki torrentteki dosya içeriği: + + + Size + Boyut + + + Selected + Seçildi + + + Unselect + Seçimi kaldır + + + Select + Seç + + + You can select here precisely which files you want to download in current torrent. + Şimdiki torrentte özellikle hangi dosyaları download edeceğinizi buradan seçebilirsiniz. + + + False + Hayır + + + True + Evet + + + Tracker + Tracker + + + Trackers: + Trackerlar: + + + None - Unreachable? + Yok - Erişilemez? + + + Errors: + Hata(lar): + + + Progress + İlerleme + + + Main infos + Genel bilgiler + + + Number of peers: + Kullanıcı sayısı: + + + Current tracker: + Şimdiki tracker: + + + Total uploaded: + Toplam upload: + + + Total downloaded: + Toplam download: + + + Total failed: + Toplam başarısız: + + + Torrent content + Torrent içeriği + + + Options + Ayarlar + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_uk.qm b/src/lang/qbittorrent_uk.qm new file mode 100644 index 000000000..f95527502 Binary files /dev/null and b/src/lang/qbittorrent_uk.qm differ diff --git a/src/lang/qbittorrent_uk.ts b/src/lang/qbittorrent_uk.ts new file mode 100644 index 000000000..6f4d0ea6f --- /dev/null +++ b/src/lang/qbittorrent_uk.ts @@ -0,0 +1,1570 @@ + + + @default + + b + bytes + б + + + KB + КБ + + + MB + МБ + + + GB + ГБ + + + KB + kilobytes + КБ + + + MB + megabytes + МБ + + + GB + gigabytes + ГБ + + + + AboutDlg + + About qBittorrent + Про qBittorrent + + + About + Про програму + + + Author + Автор + + + Name: + Ім'я: + + + Country: + Країна: + + + E-mail: + E-mail: + + + Home page: + Домашня сторінка: + + + Christophe Dumez + Крістоф Думез + + + France + Франція + + + Thanks To + Подяки + + + Translation + Переклад + + + License + Ліцензія + + + <h3><b>qBittorrent</b></h3> + <h3><b>qBittorrent</b></h3> + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + Bittorrent-клієнт на базі Qt4 та libtorrent, написаний на C++.<br> +<br> +Захищено авторським правом © 2006 Крістоф Думез<br> +<br> <u>Домашня сторінка:</u> <i>http://www.qbittorrent.org</i><br> + + + chris@qbittorrent.org + chris@qbittorrent.org + + + http://www.dchris.eu + http://www.dchris.eu + + + Birthday: + + + + Occupation: + + + + 03/05/1985 + 03/05/1985 + + + Student in computer science + + + + + DLListDelegate + + KiB/s + КіБ/с + + + + Dialog + + Options -- qBittorrent + Опції -- qBittorrent + + + Options + Опції + + + Main + Головні + + + Save Path: + Шлях збереження: + + + Download Limit: + Ліміт прийому: + + + Upload Limit: + Ліміт віддачі: + + + Max Connects: + Макс. з'єднань: + + + Port range: + Діапазон портів: + + + ... + ... + + + Kb/s + Кб/с + + + Disable + Заборонити + + + connections + з'єднання + + + Proxy + Проксі + + + Proxy Settings + Налаштування проксі + + + Server IP: + IP сервера: + + + 0.0.0.0 + 0.0.0.0 + + + Port: + Порт: + + + Proxy server requires authentication + Проксі-сервер вимагає аутентифікації + + + Authentication + Аутентифікація + + + User Name: + Ім'я користувача: + + + Password: + Пароль: + + + Enable connection through a proxy server + Дозволити з'єднання через проксі-сервер + + + Language + Мова + + + Please choose your preferred language in the following list: + Будь-ласка виберіть бажану мову з наступного списку: + + + OK + OK + + + Cancel + Відміна + + + Language settings will take effect after restart. + Налаштування мови вступлять у дію після перезапуску. + + + Scanned Dir: + Просканована директорія: + + + Enable directory scan (auto add torrent files inside) + Дозволити сканування директорії (автоматично додавати torrent-файли, що знаходяться всередині) + + + Connection Settings + Налаштування з'єднання + + + Share ratio: + Коефіцієнт розподілу: + + + 1 KB DL = + 1 КБ DL = + + + KB UP max. + КБ UP макс. + + + Activate IP Filtering + Активувати фільтрацію по IP + + + Filter Settings + Налаштування фільтру + + + Start IP + Початковий IP + + + End IP + Кінцевий IP + + + Origin + Джерело + + + Comment + Коментарій + + + Apply + Примінити + + + IP Filter + IP-фільтр + + + Add Range + Додати діапазон + + + Remove Range + Видалити діапазон + + + ipfilter.dat Path: + Шлях до ipfilter.dat: + + + Clear finished downloads on exit + Очищати закінчені завантаження при виході + + + Ask for confirmation on exit + Питати підтвердження при виході + + + Go to systray when minimizing window + Мінімізувати в системний трей + + + Misc + Різне + + + Localization + Локалізація + + + Language: + Мова: + + + Behaviour + Поведінка + + + OSD + OSD + + + Always display OSD + Завжди показувати OSD + + + Display OSD only if window is minimized or iconified + Показувати OSD лише коли вікно мінімізовано + + + Never display OSD + Ніколи не показувати OSD + + + KiB/s + КіБ/с + + + 1 KiB DL = + 1 КіБ DL = + + + KiB UP max. + КіБ UP макс. + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + Відкрити Torrent-файли + + + Unknown + Невідомо + + + This file is either corrupted or this isn't a torrent. + Цей файл пошкоджено, або він не є torrent-файлом. + + + Are you sure you want to delete all files in download list? + Ви впевнені що хочете видалити всі файли зі списку завантажень? + + + &Yes + &Так + + + &No + &Ні + + + Are you sure you want to delete the selected item(s) in download list? + Ви впевнені що хочете видалити вибрані файли зі списку завантажень? + + + paused + зупинено + + + started + почато + + + Finished + Закінчено + + + Checking... + Перевіряю... + + + Connecting... + З'єднуюсь... + + + Downloading... + Завантажую... + + + Download list cleared. + Список завантажень очищено. + + + All Downloads Paused. + Всі завантаження зупинено. + + + All Downloads Resumed. + Всі завантаження відновлено. + + + DL Speed: + DL швидкість: + + + started. + почато. + + + UP Speed: + UP швидкість: + + + Couldn't create the directory: + Неможливо створити директорію: + + + Torrent Files + Torrent файли + + + already in download list. + <file> already in download list. + вже в списку завантажень. + + + added to download list. + додано до списку завантажень. + + + resumed. (fast resume) + відновлено. (швидке відновлення) + + + Unable to decode torrent file: + Неможливо декодувати torrent-файл: + + + removed. + <file> removed. + видалено. + + + paused. + <file> paused. + зупинено. + + + resumed. + <file> resumed. + відновлено. + + + m + minutes + хв + + + h + hours + г + + + d + days + д + + + Listening on port: + Слухаю порт: + + + qBittorrent + qBittorrent + + + qBittorrent + qBittorrent + + + Are you sure? -- qBittorrent + Ви впевнені? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>DL швидкість: + + + <b>Connection Status:</b><br>Online + <b>Статус з'єднання:</b><br>Онлайн + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>Статус з'єднання:</b><br>Заборонено файерволом?<br><i>Немає вхідних з'єднаннь...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>Статус з'єднання:</b><br>Оффлайн<br><i>Не знайдено пірів...</i> + + + /s + <unit>/seconds + + + + has finished downloading. + завантажено. + + + Couldn't listen on any of the given ports. + Не можу слухати по жодному з вказаних портів. + + + None + Немає + + + Empty search pattern + Пустий шаблон пошуку + + + Please type a search pattern first + Будь-ласка спочатку введіть шаблон пошуку + + + No seach engine selected + Не вибрано пошуковика + + + You must select at least one search engine. + Ви повинні вибрати хоча б один пошуковик. + + + Searching... + Шукаю... + + + Could not create search plugin. + Неможливо створити плагін пошуку. + + + Stopped + Зупинено + + + I/O Error + Помилка I/O + + + Couldn't create temporary file on hard drive. + Неможливо створити тимчасовий файл на диску. + + + Torrent file URL + URL torrent-файлу + + + KB/s + КБ/с + + + KB/s + КБ/с + + + Downloading using HTTP: + Завантажую використовуючи HTTP: + + + Torrent file URL: + URL torrent-файлу: + + + A http download failed... + http завантаження невдале... + + + A http download failed, reason: + http завантаження невдале, причина: + + + Are you sure you want to quit? -- qBittorrent + Ви впевнені що хочете вийти? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + Ви впевнені що хочете вийти з qbittorrent? + + + Timed out + Вичерпано час + + + Error during search... + Помилка при пошуку... + + + KiB/s + КіБ/с + + + KiB/s + КіБ/с + + + Stalled + Заглохло + + + Search is finished + Пошук завершено + + + An error occured during search... + Під час пошуку сталася помилка... + + + Search aborted + Пошук скасовано + + + Search returned no results + Пошук не дав результів + + + Search is Finished + Пошук завершено + + + Search plugin update -- qBittorrent + Оновлення пошукового плагіну -- qBittorrent + + + Search plugin can be updated, do you want to update it? + +Changelog: + + Пошуковий плагін може бути оновлений, ви хочете його оновити? + +Список змін: + + + + Sorry, update server is temporarily unavailable. + Пробачте, сервер оновлень тимчасово недоступний. + + + Your search plugin is already up to date. + Ви вже маєте останню версію пошукового плагіну. + + + Results + Результати + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + DL Speed + DL швидкість + + + UP Speed + UP швидкість + + + Status + Статус + + + ETA + ETA + + + Seeders + Сідери + + + Leechers + Лічери + + + Search engine + Пошуковик + + + Stalled + state of a torrent whose DL Speed is 0 + Заглохло + + + Paused + Призупинено + + + Preview process already running + + + + There is already another preview process running. +Please close the other one first. + + + + Couldn't download + Couldn't download <file> + + + + reason: + Reason why the download failed + + + + Downloading + Example: Downloading www.example.com/test.torrent + Завантажую + + + Please wait... + + + + + MainWindow + + Log: + Лог: + + + Total DL Speed: + Загальна DL швидкість: + + + Kb/s + Кб/с + + + Total UP Speed: + Загальна UP швидкість: + + + Name + Ім'я + + + Size + Розмір + + + % DL + % DL + + + DL Speed + DL швидкість + + + UP Speed + UP швидкість + + + Status + Статус + + + ETA + ETA + + + &Options + &Опції + + + &Edit + &Редагувати + + + &File + &Файл + + + &Help + &Допомога + + + Open + Відкрити + + + Exit + Вихід + + + Preferences + Налаштування + + + About + Про програму + + + Start + Почати + + + Pause + Призупинити + + + Delete + Видалити + + + Pause All + Призупинити всі + + + Start All + Почати всі + + + Documentation + Документація + + + Delete All + Видалити всі + + + Torrent Properties + Властивості Torrent + + + Connection Status + Статус з'єднання + + + Downloads + Завантаження + + + Search + Пошук + + + Search Pattern: + Шаблон пошуку: + + + Status: + Статус: + + + Stopped + Зупинено + + + Search Engines + Пошуковики + + + Results: + Результати: + + + Stop + Зупинити + + + Seeds + Роздачі + + + Leechers + Лічери + + + Search Engine + Пошуковик + + + Download from URL + Завантажити з URL + + + Download + Завантажити + + + Clear + Очистити + + + KiB/s + КіБ/с + + + Create torrent + Створити torrent + + + Ratio: + Коефіціент: + + + Update search plugin + Оновити пошуковий плагін + + + Session ratio: + Коефіціент сесії: + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + Ні + + + True + Так + + + + QTextEdit + + Clear + Очистити + + + + Ui + + Please contact me if you would like to translate qBittorrent to your own language. + Бідь-ласка зв'яжіться зі мною якщо ви бажаєте перекласти qBittorrent на вашу мову. + + + qBittorrent + qBittorrent + + + I would like to thank the following people who volunteered to translate qBittorrent: + Я хотів би подякувати наступним людям, які переклали qBittorrent на власні мови: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>Я хотів би подякувати sourceforge.net за розміщення проекту qBittorrent.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>І також я хотів би подякувати Джефрі Фернандезу (developer@jefferyfernandez.id.au), нашому RPM-пакувальнику, за його чудову роботу.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + Ім'я + + + Size + Розмір + + + Progress + Прогрес + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + Пароль: + + + Log in + + + + Cancel + Відміна + + + + createTorrentDialog + + Create Torrent file + Створити torrent-файл + + + Destination torrent file: + Цільовий torrent-файл: + + + Input file or directory: + Вхідний файл чи директорія: + + + Comment: + Коментарій: + + + ... + ... + + + Create + Створити + + + Cancel + Відміна + + + Announce url (Tracker): + url оповіщення (Трекер): + + + Directory + Директорія + + + Torrent Creation Tool + Інструмент для створення Torrent'ів + + + <center>Destination torrent file:</center> + <center>Цільовий torrent-файл:</center> + + + <center>Input file or directory:</center> + <center>Вхідний файл чи директорія:</center> + + + <center>Announce url:<br>(One per line)</center> + <center>Оповістити url:<br>(Одна на лінію)<center> + + + <center>Comment:</center> + <center>Комментарій:</center> + + + + createtorrent + + Select destination torrent file + Виберіть цільовий torrent-файл + + + Torrent Files + Torrent файли + + + Select input directory or file + Виберіть вхідну директорію чи файл + + + No destination path set + Не задано шлях призначення + + + Please type a destination path first + Будь-ласка, спочатку введіть шлях призначення + + + No input path set + Не задано вхідний шлях + + + Please type an input path first + Будь-ласка, спочатку введіть вхідний шлях + + + Input path does not exist + Вхідний шлях не існує + + + Please type a correct input path first + Будь-ласка, спочатку введіть правильний вхідний шлях + + + Torrent creation + Створення торренту + + + Torrent was created successfully: + Торрент було успішно створено: + + + + 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 + Властивості Torrent + + + Main Infos + Головна інформація + + + File Name + Ім'я файлу + + + Current Session + Поточна сесія + + + Total Uploaded: + Загалом віддано: + + + Total Downloaded: + Загалом прийнято: + + + Download state: + Стан завантаження: + + + Current Tracker: + Поточний трекер: + + + Number of Peers: + Кількість пірів: + + + Torrent Content + Вміст Torrent'у + + + OK + OK + + + Total Failed: + Загалом невдалих: + + + Finished + Закінчено + + + Queued for checking + Поставлено в чергу для перевірки + + + Checking files + Перевірка файлів + + + Connecting to tracker + З'єднуюсь з трекером + + + Downloading Metadata + Завантажую метадані + + + Downloading + Завантажую + + + Seeding + Роздаю + + + Allocating + Виділяю + + + Unknown + Невідомо + + + Complete: + Завершено: + + + Partial: + Частково: + + + Files contained in current torrent: + Файли в поточному torrent'і: + + + Size + Розмір + + + Selected + Вибрано + + + Unselect + Відмінити вибір + + + Select + Вибрати + + + You can select here precisely which files you want to download in current torrent. + Тут ви можете вибрати окремі файли для завантаження в поточному torrent'і. + + + False + Ні + + + True + Так + + + Tracker + Трекер + + + Trackers: + Трекери: + + + None - Unreachable? + Немає - Недосяжний? + + + Errors: + Помилки: + + + Progress + Прогрес + + + Main infos + Головна інформація + + + Number of peers: + Кількість пірів: + + + Current tracker: + Поточний трекер: + + + Total uploaded: + Загалом закачано: + + + Total downloaded: + Загалом зкачано: + + + Total failed: + Загалом невдало: + + + Torrent content + Вміст Torrent'у + + + Options + Опції + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_zh.qm b/src/lang/qbittorrent_zh.qm new file mode 100644 index 000000000..28d1de2cb Binary files /dev/null and b/src/lang/qbittorrent_zh.qm differ diff --git a/src/lang/qbittorrent_zh.ts b/src/lang/qbittorrent_zh.ts new file mode 100644 index 000000000..d7e678734 --- /dev/null +++ b/src/lang/qbittorrent_zh.ts @@ -0,0 +1,1547 @@ + + + AboutDlg + + About qBittorrent + 关于 qBittorrent + + + About + 关于 + + + Author + 作者 + + + qBitorrent Author + qBittorrent 作者 + + + Name: + 名称: + + + Country: + 国家: + + + E-mail: + 电子邮件: + + + Home page: + 主页: + + + Christophe Dumez + + + + France + 法国 + + + Thanks To + 感谢 + + + Translation + 翻译 + + + License + 许可证 + + + <h3><b>qBittorrent</b></h3> + + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + bittorrent的用户使用由C++语言编写的Qt4和libtorrent. + +Copyright © 2006 by Christophe Dumez +主页:http://qbittorrent.sourceforge.net + + + qBittorrent Author + qBittorrent 作者 + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + bittorrent的用户使用由C++语言编写的Qt4和libtorrent.<br> +<br> +Copyright © 2006 by 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 + + + + 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: + 端口列: + + + ... + ... + + + Disable + 放弃 + + + connections + 连接 + + + to + + + + Proxy + 代理服务器 + + + Proxy Settings + 代理服务器设置 + + + Server IP: + 服务器IP: + + + 0.0.0.0 + + + + Port: + 端口: + + + Proxy server requires authentication + 代理服务器需要身份验证 + + + Authentication + 验证 + + + User Name: + 用户名: + + + Password: + 密码: + + + Enable connection through a proxy server + 可使用代理服务器连接 + + + Language + 语言 + + + Please choose your preferred language in the following list: + 请选择所需语言: + + + OK + 确认 + + + Cancel + 取消 + + + Language settings will take effect after restart. + 语言设置将在重新启动本软件后生效. + + + Scanned Dir: + 监视目录: + + + Enable directory scan (auto add torrent files inside) + 可使用目录监视功能(自动添加torrent文件) + + + Connection Settings + 连接设置 + + + Share ratio: + 共享比率: + + + 1 KB DL = + 1 KB 下载限 = + + + KB UP max. + KB 上传最大值. + + + Activate IP Filtering + 激活IP过滤器 + + + Filter Settings + 过滤器设置 + + + ipfilter.dat URL or PATH: + ipfilter.dat路径或网址: + + + Start IP + 起始IP + + + End IP + 截止IP + + + Origin + 来源 + + + Comment + 注释 + + + Apply + 应用 + + + IP Filter + IP过滤器 + + + Add Range + 添加IP列 + + + Remove Range + 删除IP列 + + + ipfilter.dat Path: + ipfilter.dat路径: + + + Clear finished downloads on exit + 退出时清空列表中已下载的文件 + + + Ask for confirmation on exit + 确定要退出qBittorrent + + + 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 + 打开Torrent文件 + + + Unknown + 无效 + + + This file is either corrupted or this isn't a torrent. + 该文件不是torrent文件或已经损坏. + + + Are you sure you want to delete all files in download list? + 确定删除下载列表中的所有文件? + + + &Yes + &是 + + + &No + &否 + + + Are you sure you want to delete the selected item(s) in download list? + 确定删除所选中的文件? + + + paused + 暂停 + + + started + 开始 + + + Finished + 完成 + + + Checking... + 检查中... + + + Connecting... + 连接中... + + + Downloading... + 下载中... + + + Download list cleared. + 下载列表已清空. + + + All Downloads Paused. + 暂停所有下载. + + + All Downloads Resumed. + 重新开始所有下载. + + + DL Speed: + 下载速: + + + started. + 已开始. + + + UP Speed: + 上传速: + + + Couldn't create the directory: + 无法创建文档: + + + Torrent Files + Torrent文件 + + + already in download list. + <file> already in download list. + 该文件已存在于下载列表中. + + + added to download list. + 添加到下载列表. + + + resumed. (fast resume) + 重新开始. (快速) + + + Unable to decode torrent file: + 无法解码torrent文件: + + + removed. + <file> removed. + 移除. + + + paused. + <file> paused. + 暂停. + + + resumed. + <file> resumed. + 重新开始. + + + Listening on port: + 使用端口: + + + qBittorrent + + + + Are you sure? -- qBittorrent + 确定? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>下载速度: + + + <b>Connection Status:</b><br>Online + <b>连接状态:</b><br>在线 + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>连接状态:</b><br>有防火墙?<br><i>无incoming连接...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>连接状态:</b><br>离线</br><i>无法找到任何peer...</i> + + + has finished downloading. + 下载完毕. + + + Couldn't listen on any of the given ports. + 所给端口无响应. + + + None + + + + Empty search pattern + 无关键词 + + + Please type a search pattern first + 请先输入关键词 + + + No seach engine selected + 无选中的搜索引擎 + + + You must select at least one search engine. + 至少选择一个搜索引擎. + + + Searching... + 搜索中... + + + Could not create search plugin. + 无法创建搜索插件. + + + Stopped + 停止 + + + I/O Error + 输入/输出错误 + + + Couldn't create temporary file on hard drive. + 无法在硬盘上创建临时文件. + + + Torrent file URL + Torrent文件URL + + + Downloading using HTTP: + 使用HTTP下载: + + + Torrent file URL: + Torrent文件URL: + + + A http download failed... + http下载失败... + + + A http download failed, reason: + http失败原因: + + + Are you sure you want to quit? -- qBittorrent + 确实要退出吗? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + 确实要退出qbittorrent吗? + + + Timed out + 超时 + + + Error during search... + 搜索时出现错误... + + + Failed to download: + 下载失败: + + + 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: + + 搜索插件可以更新,想要更新它吗? + +更改记录: + + + 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: + 总上传速度: + + + Name + 名称 + + + Size + 大小 + + + % DL + % 下载 + + + DL Speed + 下载速度 + + + UP Speed + 上传速度 + + + Status + 状态 + + + &Options + &选项 + + + &Edit + &编辑 + + + &File + &文件 + + + &Help + &帮助 + + + Open + 打开 + + + Exit + 退出 + + + Preferences + 首选项 + + + About + 关于 + + + Start + 开始 + + + Pause + 暂停 + + + Delete + 删除 + + + Pause All + 暂停所有 + + + Start All + 开始所有 + + + Documentation + 参考资料 + + + Connexion Status + 连接状态 + + + Delete All + 删除所有 + + + Torrent Properties + Torrent所有权 + + + Connection Status + 连接状态 + + + Downloads + 下载 + + + Search + 搜索 + + + Search Pattern: + 搜索关键词: + + + Status: + 状态: + + + Stopped + 停止 + + + Search Engines + 搜索引擎 + + + Results: + 结果: + + + Stop + 停止 + + + Seeds + 完整种子 + + + Leechers + 不完整种子 + + + Search Engine + 搜索引擎 + + + Download from URL + 通过网址下载 + + + Download + 下载 + + + Clear + 清除 + + + KiB/s + + + + Create torrent + 创建torrent + + + Ratio: + 比率: + + + Update search plugin + 更新搜索插件 + + + Session ratio: + Session 比率: + + + 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 + + + + I would like to thank the following people who volunteered to translate qBittorrent: + 感谢以下所有qBittorrent的志愿翻译者: + + + <ul><li>I would like to thank sourceforge.net for hosting qBittorrent project.</li> + <ul><li>感谢sourceforge.net对qBittorrent的支持.</li> + + + <li>I also like to thank Jeffery Fernandez (developer@jefferyfernandez.id.au), our RPM packager, for his great work.</li></ul> + <li>同时还要感谢Jeffery Fernandez (developer@jefferyfernandez.id.au), RPM packager, 感谢他的杰出工作.</li></ul> + + + Preview impossible + + + + Sorry, we can't preview this file + + + + Name + 名称 + + + Size + 大小 + + + Progress + 进度 + + + No URL entered + + + + Please type at least one URL. + + + + + authentication + + Tracker authentication + + + + Tracker: + + + + Login + + + + Username: + + + + Password: + 密码: + + + Log in + + + + Cancel + 取消 + + + + createTorrentDialog + + Create Torrent file + 创建Torrent文件 + + + Comment: + 注释: + + + ... + ... + + + Create + 创建 + + + Cancel + 取消 + + + Directory + 目录 + + + Torrent Creation Tool + Torrent创建工具 + + + <center>Destination torrent file:</center> + 目标Torrent文件: + + + <center>Input file or directory:</center> + 输入文件或目录 + + + <center>Announce url:<br>(One per line)</center> + 请指定url:(每行一个) + + + <center>Comment:</center> + 注释: + + + + createtorrent + + Select destination torrent file + 选择torrent文件目的地 + + + Torrent Files + Torrent文件 + + + Select input directory or file + 选择输入目录或文件 + + + No destination path set + 未设置目标路径 + + + Please type a destination path first + 请先给出目标路经 + + + No input path set + 未设置输入路径 + + + Please type an input path first + 请先给出输入路径 + + + Input path does not exist + 输入路径不存在 + + + Please type a correct input path first + 请先给出一个正确的输入路径 + + + Torrent creation + 创建Torrent + + + Torrent was created successfully: + 成功创建Torrent: + + + + 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 + 选择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 + Torrent所有权 + + + Main Infos + 信息 + + + File Name + 文件名 + + + Current Session + 当前Session + + + Total Uploaded: + 总上传: + + + Total Downloaded: + 总下载: + + + upTotal + 总上传 + + + dlTotal + 总下载 + + + Download state: + 下载状态: + + + Current Tracker: + 当前torrent服务器: + + + Number of Peers: + 资源数: + + + dlState + 下载状态 + + + nbPeers + Peers数 + + + (Complete: 0.0%, Partial: 0.0%) + (完成: 0.0%, Partial: 0.0%) + + + Torrent Content + Torrent内容 + + + OK + 确认 + + + Cancel + 取消 + + + Total Failed: + 总失败数: + + + failed + 失败 + + + Finished + 完成 + + + Queued for checking + 等待检查 + + + Checking files + 检查文件 + + + Connecting to tracker + 连接到tracker + + + Downloading Metadata + 文件信息下载中 + + + Downloading + 下载中 + + + Seeding + 共享中 + + + Allocating + 正在创建硬盘空间 + + + Unreachable? + Unreachable? + + + Unknown + 未知 + + + Complete: + 完整: + + + Partial: + 不完整: + + + Files contained in current torrent: + 文件已存在于现有的torrent: + + + Size + 大小 + + + Selected + 选中 + + + Unselect + 不选中 + + + Select + 选中 + + + You can select here precisely which files you want to download in current torrent. + 请在以下torrent文件中选择你想要下载的. + + + False + 错误 + + + True + 正确 + + + Tracker + torrent服务器 + + + Trackers: + torrent服务器: + + + None - Unreachable? + 无-无法连接到服务器? + + + Errors: + 错误: + + + Progress + 进度 + + + Main infos + 主要信息 + + + Number of peers: + peers数量: + + + Current tracker: + 当前torrent服务器: + + + Total uploaded: + 上传总数: + + + Total downloaded: + 下载总数: + + + Total failed: + 错误总数: + + + Torrent content + Torrent内容 + + + Options + 选项 + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/lang/qbittorrent_zh_HK.qm b/src/lang/qbittorrent_zh_HK.qm new file mode 100644 index 000000000..476e3b0f3 Binary files /dev/null and b/src/lang/qbittorrent_zh_HK.qm differ diff --git a/src/lang/qbittorrent_zh_HK.ts b/src/lang/qbittorrent_zh_HK.ts new file mode 100644 index 000000000..673d44591 --- /dev/null +++ b/src/lang/qbittorrent_zh_HK.ts @@ -0,0 +1,1437 @@ + + + AboutDlg + + About qBittorrent + 關於 qBittorrent + + + About + 關於 + + + Author + 作者 + + + qBitorrent Author + qBittorrent 作者 + + + Name: + 名稱: + + + Country: + 國家: + + + E-mail: + 電子郵件: + + + Home page: + 主頁: + + + Christophe Dumez + + + + France + 法國 + + + Thanks To + 感謝 + + + Translation + 翻譯 + + + License + 許可證 + + + <h3><b>qBittorrent</b></h3> + + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://qbittorrent.sourceforge.net</i><br> + bittorrent的用戶使用由C++語言編寫的Qt4和libtorrent. + +Copyright © 2006 by Christophe Dumez +主頁:http://qbittorrent.sourceforge.net + + + qBittorrent Author + qBittorrent 作者 + + + A bittorrent client using Qt4 and libtorrent, programmed in C++.<br> +<br> +Copyright © 2006 by Christophe Dumez<br> +<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br> + bittorrent的用戶使用由C++語言編寫的Qt4和libtorrent.<br> +<br> +Copyright © 2006 by 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 + + + + Student in computer science + + + + + DLListDelegate + + KiB/s + kB/s + + + + Dialog + + Options -- qBittorrent + 選項 -- qBittorrent + + + Options + 選項 + + + Main + 常規 + + + Save Path: + 保存路徑: + + + Download Limit: + 下載限制: + + + Upload Limit: + 上傳限制: + + + Max Connects: + 最大連接數: + + + Port range: + Port範圍: + + + ... + ... + + + Disable + 放棄 + + + connections + 連接 + + + to + + + + Proxy + Proxy + + + Proxy Settings + Proxy設置 + + + Server IP: + 伺服器IP: + + + 0.0.0.0 + + + + Port: + Port: + + + Proxy server requires authentication + 代理伺服器需要身分驗證 + + + Authentication + 驗證 + + + User Name: + 用戶名: + + + Password: + 密碼: + + + Enable connection through a proxy server + 可使用代理伺服器連接 + + + Language + 語言 + + + Please choose your preferred language in the following list: + 請選擇所需語言: + + + OK + 確認 + + + Cancel + 取消 + + + Language settings will take effect after restart. + 語言設置將在重新啟動本軟體後生效. + + + Scanned Dir: + 監視目錄: + + + Enable directory scan (auto add torrent files inside) + 可使用目錄監視功能(自動添加torrent文件) + + + Connection Settings + 連接設置 + + + Share ratio: + 共享比率: + + + 1 KB DL = + 1 KB 下載限 = + + + KB UP max. + KB 上傳最大值. + + + Activate IP Filtering + 啟用IP過濾器 + + + Filter Settings + 過濾器設置 + + + ipfilter.dat URL or PATH: + ipfilter.dat路徑或網址: + + + Start IP + 起始IP + + + End IP + 截止IP + + + Origin + 來源 + + + Comment + 注釋 + + + Apply + 應用 + + + IP Filter + IP過濾器 + + + Add Range + 添加IP列 + + + Remove Range + 刪除IP列 + + + ipfilter.dat Path: + ipfilter.dat路徑: + + + Misc + 其他 + + + Ask for confirmation on exit + 離開時確認 + + + Clear finished downloads on exit + 離開時清除完成的下載 + + + Go to systray when minimizing window + 最小化時移至systray + + + 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/s + + + 1 KiB DL = + 1 KB 下傳 + + + KiB UP max. + 最大上傳KB + + + DHT (Trackerless): + + + + Disable DHT (Trackerless) support + + + + Automatically clear finished downloads + + + + Preview program + + + + Audio/Video player: + + + + + GUI + + Open Torrent Files + 打開Torrent文件 + + + Unknown + 無效 + + + This file is either corrupted or this isn't a torrent. + 該文件不是torrent文件或已經損壞. + + + Are you sure you want to delete all files in download list? + 確定刪除下在列表中的所有文件? + + + &Yes + &是 + + + &No + &否 + + + Are you sure you want to delete the selected item(s) in download list? + 確定刪除所選中的文件? + + + paused + 暫停 + + + started + 開始 + + + Finished + 完成 + + + Checking... + 檢查中... + + + Connecting... + 連接中... + + + Downloading... + 下載中... + + + Download list cleared. + 下載列表以清空. + + + All Downloads Paused. + 暫停所有下載. + + + All Downloads Resumed. + 重新開始所有下載. + + + DL Speed: + 下載速度: + + + started. + 已開始. + + + UP Speed: + 上傳速度: + + + Couldn't create the directory: + 無法建立目錄: + + + Torrent Files + Torrent檔案 + + + already in download list. + <file> already in download list. + 該文件已存在於下載列表中. + + + added to download list. + 增加到下載列表. + + + resumed. (fast resume) + 重新開始. (快速) + + + Unable to decode torrent file: + 無法解碼torrent文件: + + + removed. + <file> removed. + 移除. + + + paused. + <file> paused. + 暫停. + + + resumed. + <file> resumed. + 重新開始. + + + Listening on port: + 使用端口: + + + qBittorrent + + + + Are you sure? -- qBittorrent + 確定? -- qBittorrent + + + <b>qBittorrent</b><br>DL Speed: + <b>qBittorrent</b><br>下載速度: + + + <b>Connection Status:</b><br>Online + <b>連接狀態:</b><br>在線上 + + + <b>Connection Status:</b><br>Firewalled?<br><i>No incoming connections...</i> + <b>連接狀態:</b><br>有防火牆?<br><i>無incoming連接...</i> + + + <b>Connection Status:</b><br>Offline<br><i>No peers found...</i> + <b>連接狀態:</b><br>離線<br><i>無法找到任何資源...</i> + + + has finished downloading. + 下載完畢. + + + Couldn't listen on any of the given ports. + 所給端口無回應. + + + None + + + + Empty search pattern + 無關鍵字 + + + Please type a search pattern first + 請輸入關鍵字 + + + No seach engine selected + 無選中的搜索引擎 + + + You must select at least one search engine. + 至少選擇一個搜索引擎. + + + Searching... + 搜索中... + + + Could not create search plugin. + 無法建立搜索插件. + + + Stopped + 停止 + + + I/O Error + 輸入/輸出錯誤 + + + Couldn't create temporary file on hard drive. + 無法在硬碟上建立臨時文件. + + + Torrent file URL + Torrent文件URL + + + Downloading using HTTP: + 使用HTTP下載: + + + Torrent file URL: + Torrent文件URL: + + + A http download failed... + http下載失敗... + + + A http download failed, reason: + http失敗原因: + + + Are you sure you want to quit? -- qBittorrent + 確定要退出嗎? -- qBittorrent + + + Are you sure you want to quit qbittorrent? + 確定要退出qbittorrent嗎? + + + Timed out + 超時 + + + KiB/s + + + + 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 + 下載速度 + + + UP Speed + 上傳速度 + + + Status + 狀態 + + + ETA + ETA + + + Seeders + 種子 + + + Leechers + 不完整種子 + + + Search engine + 搜尋引擎 + + + Stalled + state of a torrent whose DL Speed is 0 + + + + Paused + 暫停 + + + Preview process already running + + + + There is already another preview process running. +Please close the other one first. + + + + Couldn't download + Couldn't download <file> + + + + reason: + Reason why the download failed + + + + Downloading + Example: Downloading www.example.com/test.torrent + + + + Please wait... + + + + + MainWindow + + Log: + 記錄: + + + Total DL Speed: + 總下載速度: + + + Total UP Speed: + 總上傳速度: + + + Name + 名稱 + + + Size + 大小 + + + % DL + % 下載 + + + DL Speed + 下載速度 + + + UP Speed + 上傳速度 + + + Status + 狀態 + + + &Options + &選項 + + + &Edit + &編輯 + + + &File + &文件 + + + &Help + &幫助 + + + Open + 打開 + + + Exit + 退出 + + + Preferences + 偏好 + + + About + 關於 + + + Start + 開始 + + + Pause + 暫停 + + + Delete + 刪除 + + + Pause All + 暫停全部 + + + Start All + 開始全部 + + + Documentation + 參考資料 + + + Connexion Status + 連接狀態 + + + Delete All + 刪除全部 + + + Torrent Properties + Torrent所有權 + + + Connection Status + 連接狀態 + + + Downloads + 下載 + + + Search + 搜索 + + + Search Pattern: + 搜索關鍵字: + + + Status: + 狀態: + + + Stopped + 停止 + + + Search Engines + 搜索引擎 + + + Results: + 結果: + + + Stop + 停止 + + + Seeds + 完整種子 + + + Leechers + 不完整種子 + + + Search Engine + 搜索引擎 + + + Download from URL + 通過網址下載 + + + Download + 下載 + + + Clear + 清除 + + + KiB/s + + + + Create torrent + 創造 torrent + + + Update search plugin + 更新搜尋plugin + + + Session ratio: + session 比率 + + + Transfers + + + + Preview file + + + + Clear log + + + + + PropListDelegate + + False + + + + True + + + + + QTextEdit + + Clear + 清除 + + + + Ui + + qBittorrent + + + + I would like to thank the following people who volunteered to translate qBittorrent: + + + + Please contact me if you would like to translate qBittorrent to your own language. + + + + 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 + + Torrent Creation Tool + + + + Create Torrent file + + + + <center>Destination torrent file:</center> + + + + <center>Input file or directory:</center> + + + + <center>Announce url:<br>(One per line)</center> + + + + <center>Comment:</center> + + + + ... + ... + + + Directory + + + + Create + + + + Cancel + 取消 + + + + createtorrent + + Select destination torrent file + + + + Torrent Files + Torrent檔案 + + + Select input directory or file + + + + No destination path set + + + + Please type a destination path first + + + + No input path set + + + + Please type an input path first + + + + Input path does not exist + + + + Please type a correct input path first + + + + Torrent creation + + + + Torrent was created successfully: + + + + + downloadFromURL + + Download Torrents from URLs + + + + Only one URL per line + + + + Download + 下載 + + + Cancel + 取消 + + + Download from urls + + + + + misc + + Unknown + Unknown (size) + 無效 + + + B + bytes + + + + KiB + kibibytes (1024 bytes) + + + + MiB + mebibytes (1024 kibibytes) + + + + GiB + gibibytes (1024 mibibytes) + + + + TiB + tebibytes (1024 gibibytes) + + + + Unknown + 無效 + + + m + minutes + + + + h + hours + + + + d + days + + + + h + hours + + + + + options_imp + + to + <min port> to <max port> + + + + Options saved successfully! + + + + Choose Scan Directory + + + + Choose ipfilter.dat file + + + + Choose save Directory + + + + 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: + + + + 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 + Torrent所有權 + + + Main infos + + + + Download state: + + + + Number of peers: + + + + Tracker + + + + Trackers: + + + + Errors: + + + + Current tracker: + + + + Current Session + + + + Total uploaded: + + + + Total downloaded: + + + + Total failed: + + + + Torrent content + + + + Files contained in current torrent: + + + + Unselect + + + + Select + + + + You can select here precisely which files you want to download in current torrent. + + + + OK + 確認 + + + File Name + + + + Size + 大小 + + + Progress + 進度 + + + Selected + + + + Finished + 完成 + + + Queued for checking + + + + Checking files + + + + Connecting to tracker + + + + Downloading Metadata + + + + Downloading + + + + Seeding + + + + Allocating + + + + None - Unreachable? + + + + Unknown + 無效 + + + Complete: + + + + Partial: + + + + Options + 選項 + + + Download in correct order (slower but good for previewing) + + + + diff --git a/src/login.ui b/src/login.ui new file mode 100644 index 000000000..21387387f --- /dev/null +++ b/src/login.ui @@ -0,0 +1,299 @@ + + + + + authentication + + + + 0 + 0 + 311 + 231 + + + + Tracker authentication + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 39 + 39 + + + + + + + + + + + + 16777215 + 39 + + + + + Sans Serif + 13 + 75 + false + true + false + false + + + + Tracker authentication + + + + + + + + + 0 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Tracker: + + + + + + + + 220 + 0 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + + + + + + + + + + Login + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Username: + + + lineUsername + + + + + + + + + + + + 0 + + + 6 + + + + + + 68 + 0 + + + + Password: + + + linePasswd + + + + + + + QLineEdit::Password + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Log in + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + cancelButton + clicked() + authentication + reject() + + + 245 + 195 + + + 179 + 230 + + + + + linePasswd + returnPressed() + loginButton + click() + + + 139 + 158 + + + 122 + 199 + + + + + lineUsername + returnPressed() + linePasswd + setFocus() + + + 199 + 130 + + + 198 + 157 + + + + + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 000000000..843a07815 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,169 @@ +/* + * 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 "GUI.h" +#include "misc.h" + +// Main +int main(int argc, char *argv[]){ + QDomDocument doc("options"); + QDomElement root; + QDomElement tag; + QFile file; + QString locale; + if(argc > 1){ + if(QString(argv[1])=="--version"){ + std::cout << "qBittorrent " << VERSION << '\n'; + return 0; + } + if(QString(argv[1])=="--help"){ + std::cout << "Usage: \n"; + std::cout << '\t' << argv[0] << " --version : displays program version\n"; + std::cout << '\t' << argv[0] << " --help : displays this help message\n"; + std::cout << '\t' << argv[0] << " [files or urls] : starts program and download given parameters (optional)\n"; + return 0; + } + } + // Set environment variable + if(putenv("QBITTORRENT="VERSION)){ + std::cout << "Couldn't set environment variable...\n"; + } + // Buggy with Qt 4.1.2 : should try with another version + //Check if there is another instance running +// QTcpSocket *tcpSocket= new QTcpSocket(); +// tcpSocket->connectToHost(QHostAddress::LocalHost, 1666); +// if (tcpSocket->waitForConnected(1000)){ +// std::cout << "Another qBittorrent instance is already running...\n"; +// // Send parameters +// if(argc > 1){ +// QByteArray block; +// QDataStream out(&block, QIODevice::WriteOnly); +// out.setVersion(QDataStream::Qt_4_0); +// out << (quint16)0; +// std::cout << "deb size: " << block.data() << '\n'; +// for(int i=1;iseek(0); +// std::cout << "size: " << block.size() << '\n'; +// out << (quint16)(block.size() - sizeof(quint16)); +// tcpSocket->write(block); +// std::cout << "written: " << block.data() << '\n'; +// tcpSocket->waitForConnected(5000); +// tcpSocket->disconnectFromHost(); +// std::cout << "disconnected\n"; +// sleep(5); +// } +// tcpSocket->close(); +// delete tcpSocket; +// return 0; +// } + // Check if another instance is running + QTcpSocket tcpSocket; + tcpSocket.connectToHost(QHostAddress::LocalHost, 1666); + if (tcpSocket.waitForConnected(1000)){ + std::cout << "Another qBittorrent instance is already running...\n"; + // Write params to a temporary file + QFile paramsFile(QDir::tempPath()+QDir::separator()+"qBT-params.txt"); + int count = 0; + while(paramsFile.exists() && count <10){ + // If file exists, then the other instance is already reading params + // We wait... + SleeperThread::msleep(1000); + ++count; + } + paramsFile.remove(); + // Write params to the file + if (!paramsFile.open(QIODevice::WriteOnly | QIODevice::Text)){ + std:: cout << "could not pass parameters\n"; + return 1; + } + std:: cout << "Passing parameters\n"; + for(int i=1;ishow(); + bool isLocalized = false; + // Open options file to read locale + QString optionsPath = misc::qBittorrentPath()+"options.xml"; + FILE *f = fopen(optionsPath.toStdString().c_str(), "r"); + if(f){ + if (file.open(f, QIODevice::ReadOnly | QIODevice::Text)){ + if (doc.setContent(&file)) { + root = doc.firstChildElement("options"); + tag = root.firstChildElement("locale"); + if(!tag.isNull()){ + locale = tag.text(); + isLocalized = true; + } + } + } + file.close(); + fclose(f); + } + + QTranslator translator; + if(!isLocalized){ + locale = QLocale::system().name(); + } + if(translator.load(QString(":/lang/qbittorrent_") + locale)){ + std::cout << locale.toStdString() << " locale recognized, using translation.\n"; + }else{ + std::cout << locale.toStdString() << " locale unrecognized, using default (en_GB).\n"; + } + app.installTranslator(&translator); + // Read torrents given on command line + QStringList torrentCmdLine = app.arguments(); + // Remove first argument (program name) + torrentCmdLine.removeFirst(); + GUI window(0, torrentCmdLine); + // Set locale + if(!isLocalized){ + window.setLocale(locale); + } + // Show main window + window.show(); + splash->finish(&window); + delete splash; + return app.exec(); +} + + diff --git a/src/menuicons/128x128/apps/qbittorrent.png b/src/menuicons/128x128/apps/qbittorrent.png new file mode 100644 index 000000000..69c5ab73b Binary files /dev/null and b/src/menuicons/128x128/apps/qbittorrent.png differ diff --git a/src/menuicons/16x16/apps/qbittorrent.png b/src/menuicons/16x16/apps/qbittorrent.png new file mode 100644 index 000000000..cff0194ec Binary files /dev/null and b/src/menuicons/16x16/apps/qbittorrent.png differ diff --git a/src/menuicons/192x192/apps/qbittorrent.png b/src/menuicons/192x192/apps/qbittorrent.png new file mode 100644 index 000000000..7d95a1a2f Binary files /dev/null and b/src/menuicons/192x192/apps/qbittorrent.png differ diff --git a/src/menuicons/22x22/apps/qbittorrent.png b/src/menuicons/22x22/apps/qbittorrent.png new file mode 100644 index 000000000..0f573d05d Binary files /dev/null and b/src/menuicons/22x22/apps/qbittorrent.png differ diff --git a/src/menuicons/24x24/apps/qbittorrent.png b/src/menuicons/24x24/apps/qbittorrent.png new file mode 100644 index 000000000..0f2605234 Binary files /dev/null and b/src/menuicons/24x24/apps/qbittorrent.png differ diff --git a/src/menuicons/32x32/apps/qbittorrent.png b/src/menuicons/32x32/apps/qbittorrent.png new file mode 100644 index 000000000..fd76d5f1e Binary files /dev/null and b/src/menuicons/32x32/apps/qbittorrent.png differ diff --git a/src/menuicons/36x36/apps/qbittorrent.png b/src/menuicons/36x36/apps/qbittorrent.png new file mode 100644 index 000000000..aef62648e Binary files /dev/null and b/src/menuicons/36x36/apps/qbittorrent.png differ diff --git a/src/menuicons/48x48/apps/qbittorrent.png b/src/menuicons/48x48/apps/qbittorrent.png new file mode 100644 index 000000000..e7c94654b Binary files /dev/null and b/src/menuicons/48x48/apps/qbittorrent.png differ diff --git a/src/menuicons/64x64/apps/qbittorrent.png b/src/menuicons/64x64/apps/qbittorrent.png new file mode 100644 index 000000000..e1fdf1ece Binary files /dev/null and b/src/menuicons/64x64/apps/qbittorrent.png differ diff --git a/src/menuicons/72x72/apps/qbittorrent.png b/src/menuicons/72x72/apps/qbittorrent.png new file mode 100644 index 000000000..2b0c1f21f Binary files /dev/null and b/src/menuicons/72x72/apps/qbittorrent.png differ diff --git a/src/menuicons/96x96/apps/qbittorrent.png b/src/menuicons/96x96/apps/qbittorrent.png new file mode 100644 index 000000000..4f07e0088 Binary files /dev/null and b/src/menuicons/96x96/apps/qbittorrent.png differ diff --git a/src/misc.h b/src/misc.h new file mode 100644 index 000000000..6b556c962 --- /dev/null +++ b/src/misc.h @@ -0,0 +1,190 @@ +/* + * 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 MISC_H +#define MISC_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_CHAR_TMP 128 + +/* Miscellaneaous functions that can be useful */ +class misc : public QObject{ + Q_OBJECT + + public: + // Convert any type of variable to C++ String + template static std::string toString(const T& x){ + std::ostringstream o; + if(!(o< static T fromString(const std::string& s){ + T x; + std::istringstream i(s); + if(!(i>>x)){ + throw std::runtime_error("::fromString()"); + } + return x; + } + + // return best userfriendly storage unit (B, KiB, MiB, GiB, TiB) + // use Binary prefix standards from IEC 60027-2 + // see http://en.wikipedia.org/wiki/Kilobyte + // value must be given in bytes + template static QString friendlyUnit(const T& value){ + char tmp[MAX_CHAR_TMP]; + float val = value; + if(val <= 0){ + return QString(tr("Unknown", "Unknown (size)")); + } + QString units[] = {tr("B", "bytes"), tr("KiB", "kibibytes (1024 bytes)"), tr("MiB", "mebibytes (1024 kibibytes)"), tr("GiB", "gibibytes (1024 mibibytes)")}; + for(int i=0; i<5; ++i){ + if (val < 1024.){ + snprintf(tmp, MAX_CHAR_TMP, "%.1f", (float)val); + return QString(tmp) + " " + units[i]; + } + val /= 1024.; + } + snprintf(tmp, MAX_CHAR_TMP, "%.1f", (float)val); + return QString(tmp) + " " + tr("TiB", "tebibytes (1024 gibibytes)"); + } + + // return qBittorrent config path + static QString qBittorrentPath() { + QString qBtPath = QDir::homePath(); + if(qBtPath.isNull()){ + return QString(); + } + if(qBtPath[qBtPath.length()-1] == QDir::separator()){ + qBtPath = qBtPath + ".qbittorrent" + QDir::separator(); + }else{ + qBtPath = qBtPath + QDir::separator() + ".qbittorrent" + QDir::separator(); + } + // Create dir if it does not exist + QDir dir(qBtPath); + if(!dir.exists()){ + dir.mkpath(qBtPath); + } + return qBtPath; + } + + // Function called by curl to write the data to the file + static int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream){ + return fwrite(buffer, size, nmemb, (FILE*)stream); + } + + static QString findFileInDir(const QString& dir_path, const QString& fileName){ + QDir dir(dir_path); + if(dir.exists(fileName)){ + return dir.filePath(fileName); + } + QStringList subDirs = dir.entryList(QDir::Dirs); + QString subdir_name; + foreach(subdir_name, subDirs){ + QString result = findFileInDir(dir.path()+QDir::separator()+subdir_name, fileName); + if(!result.isNull()){ + return result; + } + } + return QString(); + } + + // Insertion sort, used instead of bubble sort because it is + // approx. 5 times faster. + template static void insertSort(QList > &list, const QPair& value, Qt::SortOrder sortOrder){ + int i = 0; + if(sortOrder == Qt::AscendingOrder){ + while(i < list.size() and value.second > list.at(i).second){ + ++i; + } + }else{ + while(i < list.size() and value.second < list.at(i).second){ + ++i; + } + } + list.insert(i, value); + } + + // Can't use template class for QString because >,< use unicode code for sorting + // which is not what a human would expect when sorting strings. + static void insertSortString(QList > &list, QPair value, Qt::SortOrder sortOrder){ + int i = 0; + if(sortOrder == Qt::AscendingOrder){ + while(i < list.size() and QString::localeAwareCompare(value.second, list.at(i).second) > 0){ + ++i; + } + }else{ + while(i < list.size() and QString::localeAwareCompare(value.second, list.at(i).second) < 0){ + ++i; + } + } + list.insert(i, value); + } + + // Take a number of seconds and return an user-friendly + // time duration like "1d 2h 10m". + static QString userFriendlyDuration(const long int seconds){ + if(seconds <= 0){ + return QString::QString(tr("Unknown")); + } + if(seconds < 60){ + return QString::QString("< 1"+tr("m", "minutes")); + } + int minutes = seconds / 60; + if(minutes < 60){ + return QString::QString(misc::toString(minutes).c_str())+tr("m", "minutes"); + } + int hours = minutes / 60; + minutes = minutes - hours*60; + if(hours < 24){ + return QString::QString(misc::toString(hours).c_str())+tr("h", "hours")+" "+QString::QString(misc::toString(minutes).c_str())+tr("m", "minutes"); + } + int days = hours / 24; + hours = hours - days * 24; + if(days < 100){ + return QString::QString(misc::toString(days).c_str())+tr("d", "days")+" "+QString::QString(misc::toString(hours).c_str())+tr("h ", "hours")+QString::QString(misc::toString(minutes).c_str())+tr("m", "minutes"); + } + return QString::QString(tr("Unknown")); + } +}; + +// Trick to get a portable sleep() function +class SleeperThread : public QThread{ + public: + static void msleep(unsigned long msecs) + { + QThread::msleep(msecs); + } +}; + +#endif diff --git a/src/options.ui b/src/options.ui new file mode 100644 index 000000000..b54cb87bb --- /dev/null +++ b/src/options.ui @@ -0,0 +1,1305 @@ + + + + + Dialog + + + + 0 + 0 + 506 + 490 + + + + + 463 + 389 + + + + Options -- qBittorrent + + + + 9 + + + 6 + + + + + + Sans Serif + 12 + 75 + false + true + false + false + + + + Options + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + + + + QTabWidget::North + + + QTabWidget::Rounded + + + 0 + + + + Main + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + Save Path: + + + proxy_username + + + + + + + 0 + + + 6 + + + + + + + + + + + + ... + + + + + + + + + + + + + 0 + 191 + + + + Connection Settings + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Download Limit: + + + spin_download + + + + + + + Upload Limit: + + + enableScan_checkBox + + + + + + + Max Connects: + + + spin_port_min + + + + + + + Port range: + + + spin_port_min + + + + + + + Share ratio: + + + + + + + DHT (Trackerless): + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + false + + + + + + 1000000 + + + 1 + + + 200 + + + + + + + + 64 + 0 + + + + KiB/s + + + + + + + Disable + + + true + + + + + + + Qt::Horizontal + + + + 61 + 25 + + + + + + + + + + 0 + + + 6 + + + + + false + + + + + + 1000000 + + + 1 + + + 10 + + + + + + + + 64 + 0 + + + + KiB/s + + + + + + + Disable + + + true + + + + + + + Qt::Horizontal + + + + 61 + 25 + + + + + + + + + + 0 + + + 6 + + + + + false + + + 1000 + + + 1 + + + 600 + + + + + + + + 88 + 0 + + + + connections + + + + + + + true + + + Disable + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + 60000 + + + 1000 + + + 6881 + + + + + + + + + + Qt::AlignCenter + + + + + + + 65525 + + + 1000 + + + 6889 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + 1 KiB DL = + + + + + + + false + + + Qt::AlignHCenter + + + 1 + + + 99.9 + + + 1 + + + 0.1 + + + 1 + + + + + + + + 82 + 0 + + + + KiB UP max. + + + + + + + Disable + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Disable DHT (Trackerless) support + + + + + + + + + + + + + + + Enable directory scan (auto add torrent files inside) + + + + + + + + 0 + + + 6 + + + + + false + + + Scanned Dir: + + + proxy_username + + + + + + + 0 + + + 6 + + + + + false + + + + + + + false + + + ... + + + + + + + + + + + + + IP Filter + + + + 9 + + + 6 + + + + + Activate IP Filtering + + + + + + + false + + + Filter Settings + + + + 9 + + + 6 + + + + + + 0 + 171 + + + + + Sans Serif + 8 + 50 + false + false + false + false + + + + QAbstractItemView::ExtendedSelection + + + false + + + + Start IP + + + + + End IP + + + + + Origin + + + + + Comment + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add Range + + + + + + + Remove Range + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + + + 6 + + + + + ipfilter.dat Path: + + + + + + + + + + ... + + + + + + + + + + + + + + Proxy + + + + 9 + + + 6 + + + + + Enable connection through a proxy server + + + + + + + false + + + Proxy Settings + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + Server IP: + + + + + + + 0.0.0.0 + + + 15 + + + QLineEdit::Normal + + + + + + + Qt::Horizontal + + + + 21 + 20 + + + + + + + + Port: + + + + + + + 65525 + + + 8080 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Proxy server requires authentication + + + + + + + false + + + Authentication + + + + 9 + + + 6 + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + User Name: + + + + + + + Password: + + + + + + + + + 0 + + + 6 + + + + + + + + 1000 + + + QLineEdit::Normal + + + + + + + + + + 1000 + + + QLineEdit::Password + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 21 + + + + + + + + + + + + Misc + + + + Localization + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + + + + Language: + + + + + + + + 300 + 25 + + + + QComboBox::AdjustToContents + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 9 + 81 + 466 + 95 + + + + Behaviour + + + + 9 + + + 6 + + + + + Ask for confirmation on exit + + + true + + + + + + + Automatically clear finished downloads + + + true + + + + + + + Go to systray when minimizing window + + + true + + + + + + + + + 10 + 180 + 461 + 67 + + + + Preview program + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Audio/Video player: + + + + + + + + + + ... + + + + + + + + + + + 10 + 250 + 466 + 100 + + + + OSD + + + + 9 + + + 6 + + + + + Always display OSD + + + true + + + + + + + Display OSD only if window is minimized or iconified + + + + + + + Never display OSD + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 81 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + false + + + Apply + + + + + + + Qt::Horizontal + + + + 81 + 31 + + + + + + + + + + + + diff --git a/src/options_imp.cpp b/src/options_imp.cpp new file mode 100644 index 000000000..1ce424255 --- /dev/null +++ b/src/options_imp.cpp @@ -0,0 +1,942 @@ +/* + * 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 "options_imp.h" +#include "misc.h" + +// Constructor +options_imp::options_imp(QWidget *parent):QDialog(parent){ + QString savePath; + setupUi(this); + // Setting icons + tabWidget->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/systemtray.png"))); + tabWidget->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/filter.png"))); + tabWidget->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/proxy.png"))); + tabWidget->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/style.png"))); + lbl_icon_i18n->setPixmap(QPixmap(QString::fromUtf8(":/Icons/locale.png"))); + addFilterRange->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); + delFilterRange->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); + enableProxyAuth_checkBox->setIcon(QIcon(QString::fromUtf8(":/Icons/encrypted.png"))); + to_range->setText(tr("to", " to ")); + // Languages supported + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/united_kingdom.png"))), QString::fromUtf8(" English")); + locales << "en_GB"; + combo_i18n->setCurrentIndex(0); + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/france.png"))), QString::fromUtf8(" Français")); + locales << "fr_FR"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/germany.png"))), QString::fromUtf8(" Deutsch")); + locales << "de_DE"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/italy.png"))), QString::fromUtf8(" Italiano")); + locales << "it_IT"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/netherlands.png"))), QString::fromUtf8(" Nederlands")); + locales << "nl_NL"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/spain.png"))), QString::fromUtf8(" Español")); + locales << "es_ES"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/spain_catalunya.png"))), QString::fromUtf8(" Català")); + locales << "ca_ES"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/portugal.png"))), QString::fromUtf8(" Português")); + locales << "pt_PT"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/poland.png"))), QString::fromUtf8(" Polski")); + locales << "pl_PL"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/slovakia.png"))), QString::fromUtf8(" Slovenčina")); + locales << "sk_SK"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/romania.png"))), QString::fromUtf8(" Română")); + locales << "ro_RO"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/turkey.png"))), QString::fromUtf8(" Türkçe")); + locales << "tr_TR"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/greece.png"))), QString::fromUtf8(" Ελληνικά")); + locales << "el_GR"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/sweden.png"))), QString::fromUtf8(" Svenska")); + locales << "sv_SE"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/bulgaria.png"))), QString::fromUtf8(" Български")); + locales << "bg_BG"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/ukraine.png"))), QString::fromUtf8(" Українська")); + locales << "uk_UA"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/russia.png"))), QString::fromUtf8(" Русский")); + locales << "ru_RU"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/china.png"))), QString::fromUtf8(" 中文 (简体)")); + locales << "zh_CN"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/china_hong_kong.png"))), QString::fromUtf8(" 中文 (繁體)")); + locales << "zh_HK"; + combo_i18n->addItem((QIcon(QString::fromUtf8(":/Icons/flags/south_korea.png"))), QString::fromUtf8(" 한글")); + locales << "ko_KR"; + + QString home = QDir::homePath(); + if(home[home.length()-1] != QDir::separator()){ + home += QDir::separator(); + } + txt_savePath->setText(home+"qBT_dir"); + // Save Options if options.xml does not exist yet + savePath = misc::qBittorrentPath() + "options.xml"; + if(! QFile::exists(savePath)){ + saveOptions(); + } + if(!loadOptions()){ + std::cout << "Warning: Couldn't load options" << '\n'; + } + // Connect signals / slots + connect(disableUPLimit, SIGNAL(stateChanged(int)), this, SLOT(disableUpload(int))); + connect(disableDLLimit, SIGNAL(stateChanged(int)), this, SLOT(disableDownload(int))); + connect(disableRatio, SIGNAL(stateChanged(int)), this, SLOT(disableShareRatio(int))); + connect(activateFilter, SIGNAL(stateChanged(int)), this, SLOT(enableFilter(int))); + connect(enableProxy_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableProxy(int))); + connect(enableProxyAuth_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableProxyAuth(int))); + connect(enableScan_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableDirScan(int))); + connect(disableMaxConnec, SIGNAL(stateChanged(int)), this, SLOT(disableMaxConnecLimit(int))); + // Apply button is activated when a value is changed + // Main + connect(txt_savePath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_download, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_upload, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_port_min, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_port_max, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_max_connec, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(spin_ratio, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(disableUPLimit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(disableDLLimit, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(disableRatio, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(scanDir, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(enableScan_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(disableMaxConnec, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(disableDHT, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + // IPFilter + connect(activateFilter, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(filterFile, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + // Proxy + connect(enableProxyAuth_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(enableProxy_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(proxy_port, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(proxy_ip, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(proxy_username, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(proxy_password, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + // Misc Settings + connect(combo_i18n, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(check_goToSysTray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(clearFinished_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(confirmExit_checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(preview_program, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(alwaysOSD, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(someOSD, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(neverOSD, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + // Disable apply Button + applyButton->setEnabled(false); +} + +// save options to options.xml file +bool options_imp::saveOptions(){ + QString savePath; + QDomDocument doc("options"); + QDomElement root; + QDomElement tag, tag2; + QDomText optionValue; + QString xml; + FILE *f; + QFile file; + // Getting HOME evironment variable + savePath = misc::qBittorrentPath() + "options.xml"; + // Check if min port < max port + checkPortsLogic(); + // Generate XML + root = doc.createElement("options"); + doc.appendChild(root); + // Main Options + tag = doc.createElement("save_path"); + root.appendChild(tag); + optionValue = doc.createTextNode(txt_savePath->text()); + tag.appendChild(optionValue); + tag = doc.createElement("dl_limit"); + root.appendChild(tag); + if(spin_download->isEnabled()){ + optionValue = doc.createTextNode(misc::toString(spin_download->value()).c_str()); + }else{ + optionValue = doc.createTextNode(misc::toString(-1).c_str()); + } + tag.appendChild(optionValue); + tag = doc.createElement("up_limit"); + root.appendChild(tag); + if(spin_upload->isEnabled()){ + optionValue = doc.createTextNode(misc::toString(spin_upload->value()).c_str()); + }else{ + optionValue = doc.createTextNode(misc::toString(-1).c_str()); + } + tag.appendChild(optionValue); + tag = doc.createElement("max_connec"); + root.appendChild(tag); + if(spin_max_connec->isEnabled()){ + optionValue = doc.createTextNode(misc::toString(spin_max_connec->value()).c_str()); + }else{ + optionValue = doc.createTextNode(misc::toString(-1).c_str()); + } + tag.appendChild(optionValue); + tag = doc.createElement("port_range"); + root.appendChild(tag); + tag2 = doc.createElement("port_min"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(misc::toString(spin_port_min->value()).c_str()); + tag2.appendChild(optionValue); + tag2 = doc.createElement("port_max"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(misc::toString(spin_port_max->value()).c_str()); + tag2.appendChild(optionValue); + tag = doc.createElement("ratio"); + root.appendChild(tag); + if(spin_ratio->isEnabled()){ + optionValue = doc.createTextNode(misc::toString(spin_ratio->value()).c_str()); + }else{ + optionValue = doc.createTextNode("0"); + } + tag.appendChild(optionValue); + tag = doc.createElement("DHT"); + root.appendChild(tag); + if(disableDHT->isChecked()){ + optionValue = doc.createTextNode("0"); + }else{ + optionValue = doc.createTextNode("1"); + } + tag.appendChild(optionValue); + if(scanDir->isEnabled()){ + tag = doc.createElement("scan_dir"); + root.appendChild(tag); + optionValue = doc.createTextNode(scanDir->text()); + tag.appendChild(optionValue); + } + // IPFilter Settings + if(filterGroup->isEnabled()){ + tag = doc.createElement("ipFilter_File"); + root.appendChild(tag); + optionValue = doc.createTextNode(filterFile->text()); + tag.appendChild(optionValue); + } + // Proxy Settings + if(groupProxy->isEnabled()){ + tag = doc.createElement("proxy_settings"); + root.appendChild(tag); + tag2 = doc.createElement("proxy_ip"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(proxy_ip->text()); + tag2.appendChild(optionValue); + tag2 = doc.createElement("proxy_port"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(proxy_port->text()); + tag2.appendChild(optionValue); + // Proxy Authentication + if(groupProxyAuth->isEnabled()){ + tag2 = doc.createElement("proxy_username"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(proxy_username->text()); + tag2.appendChild(optionValue); + tag2 = doc.createElement("proxy_password"); + tag.appendChild(tag2); + optionValue = doc.createTextNode(proxy_password->text()); + tag2.appendChild(optionValue); + } + } + // GUI stuff + tag = doc.createElement("gui_settings"); + root.appendChild(tag); + tag2 = doc.createElement("goToSysTrayOnMinimizing"); + if(check_goToSysTray->isChecked()){ + optionValue = doc.createTextNode("true"); + }else{ + optionValue = doc.createTextNode("false"); + } + tag2.appendChild(optionValue); + tag.appendChild(tag2); + tag2 = doc.createElement("clearFinishedOnExit"); + if(clearFinished_checkBox->isChecked()){ + optionValue = doc.createTextNode("true"); + }else{ + optionValue = doc.createTextNode("false"); + } + tag2.appendChild(optionValue); + tag.appendChild(tag2); + tag2 = doc.createElement("confirmOnExit"); + if(confirmExit_checkBox->isChecked()){ + optionValue = doc.createTextNode("true"); + }else{ + optionValue = doc.createTextNode("false"); + } + tag2.appendChild(optionValue); + tag.appendChild(tag2); + tag2 = doc.createElement("previewing"); + optionValue = doc.createTextNode(preview_program->text()); + tag2.appendChild(optionValue); + tag.appendChild(tag2); + tag2 = doc.createElement("displayOSD"); + if(alwaysOSD->isChecked()){ + optionValue = doc.createTextNode("true"); + }else{ + if(someOSD->isChecked()){ + optionValue = doc.createTextNode("partial"); + }else{ + optionValue = doc.createTextNode("false"); + } + } + tag2.appendChild(optionValue); + tag.appendChild(tag2); + // Language Settings + tag = doc.createElement("locale"); + root.appendChild(tag); + optionValue = doc.createTextNode(getLocale()); + tag.appendChild(optionValue); + xml = doc.toString(); + // Write XML file to HD + f = fopen(savePath.toStdString().c_str(), "w"); + if (!f){ + std::cout << "Error: Couldn't create file " << savePath.toStdString() << " for saving!" << '\n'; + return false; + } + if (!file.open(f, QIODevice::WriteOnly | QIODevice::Text)){ + std::cout << "Error: Couldn't open file " << savePath.toStdString() << " for saving!" << '\n'; + return false; + } + file.write(xml.toStdString().c_str(), xml.length()); + file.close(); + if(fclose(f) == EOF){ + std::cout << "Error: Couldn't close file " << savePath.toStdString() << " after saving!" << '\n'; + return false; + } + // set infobar text + emit status_changed(tr("Options saved successfully!")); + // Disable apply Button + applyButton->setEnabled(false); + return true; +} + +bool options_imp::isFilteringEnabled() const{ + return activateFilter->isChecked(); +} + +// Load options from options.xml file +bool options_imp::loadOptions(){ + QString savePath; + QDomDocument doc("options"); + QDomElement root; + QDomElement tag, tag2; + QDomText optionValue; + QString xml; + FILE *f; + QFile file; + int tmp; + float tmpFloat; + // Getting savepath for options.xml + savePath = misc::qBittorrentPath() + "options.xml"; + // Read XML file on HD + f = fopen(savePath.toStdString().c_str(), "r"); + if (!f){ + return false; + } + if (!file.open(f, QIODevice::ReadOnly | QIODevice::Text)){ + return false; + } + if (!doc.setContent(&file)) { + file.close(); + return false; + } + file.close(); + if(fclose(f) == EOF){ + std::cout << "Error: Couldn't close file " << savePath.toStdString() << " after reading!" << '\n'; + return false; + } + // Loading option from XML + root = doc.firstChildElement("options"); + this->txt_savePath->setText(root.firstChildElement("save_path").text()); + tmp = root.firstChildElement("dl_limit").text().toInt(); + if(tmp == -1){ + disableDLLimit->setChecked(true); + spin_download->setEnabled(false); + }else{ + disableDLLimit->setChecked(false); + spin_download->setEnabled(true); + this->spin_download->setValue(tmp); + } + tmp = root.firstChildElement("up_limit").text().toInt(); + if(tmp == -1){ + disableUPLimit->setChecked(true); + spin_upload->setEnabled(false); + }else{ + disableUPLimit->setChecked(false); + spin_upload->setEnabled(true); + this->spin_upload->setValue(tmp); + } + tmpFloat = root.firstChildElement("ratio").text().toFloat(); + if(tmpFloat == 0){ + disableRatio->setChecked(true); + spin_ratio->setEnabled(false); + }else{ + disableRatio->setChecked(false); + spin_ratio->setEnabled(true); + this->spin_ratio->setValue(tmpFloat); + } + tag = root.firstChildElement("DHT"); + if(!tag.isNull()){ + if(tag.text().toInt() == 0){ + disableDHT->setChecked(true); + }else{ + disableDHT->setChecked(false); + } + } + tmp = root.firstChildElement("max_connec").text().toInt(); + if(tmp == -1){ + disableMaxConnec->setChecked(true); + spin_max_connec->setEnabled(false); + }else{ + disableMaxConnec->setChecked(false); + spin_max_connec->setEnabled(true); + this->spin_max_connec->setValue(tmp); + } + tag = root.firstChildElement("port_range"); + this->spin_port_min->setValue(tag.firstChildElement("port_min").text().toInt()); + this->spin_port_max->setValue(tag.firstChildElement("port_max").text().toInt()); + tag = root.firstChildElement("scan_dir"); + if(!tag.isNull()){ + enableScan_checkBox->setChecked(true); + scanDir->setEnabled(true); + scanDir->setText(tag.text()); + }else{ + enableScan_checkBox->setChecked(false); + scanDir->setEnabled(false); + } + // Load IPFilter Settings + tag = root.firstChildElement("ipFilter_File"); + if(!tag.isNull()){ + activateFilter->setChecked(true); + filterGroup->setEnabled(true); + filterFile->setText(tag.text()); + processFilterFile(tag.text()); + }else{ + activateFilter->setChecked(false); + filterGroup->setEnabled(false); + } + // Load proxy settings + tag = root.firstChildElement("proxy_settings"); + if(!tag.isNull()){ + enableProxy_checkBox->setChecked(true); + groupProxy->setEnabled(true); + proxy_ip->setText(tag.firstChildElement("proxy_ip").text()); + proxy_port->setValue(tag.firstChildElement("proxy_port").text().toInt()); + tag2 = tag.firstChildElement("proxy_username"); + if(!tag2.isNull()){ + enableProxyAuth_checkBox->setChecked(true); + groupProxyAuth->setEnabled(true); + proxy_username->setText(tag2.text()); + proxy_password->setText(tag.firstChildElement("proxy_password").text()); + }else{ + enableProxyAuth_checkBox->setChecked(false); + groupProxyAuth->setEnabled(false); + } + }else{ + enableProxyAuth_checkBox->setChecked(false); + enableProxy_checkBox->setChecked(false); + groupProxyAuth->setEnabled(false); + groupProxy->setEnabled(false); + } + // Locale Settings + tag = root.firstChildElement("locale"); + if(!tag.isNull()){ + setLocale(tag.text()); + } + // Gui Settings + tag = root.firstChildElement("gui_settings"); + if(!tag.isNull()){ + if(tag.firstChildElement("goToSysTrayOnMinimizing").text() == "false"){ + check_goToSysTray->setChecked(false); + }else{ + check_goToSysTray->setChecked(true); + } + if(tag.firstChildElement("clearFinishedOnExit").text() == "false"){ + clearFinished_checkBox->setChecked(false); + }else{ + clearFinished_checkBox->setChecked(true); + } + if(tag.firstChildElement("confirmOnExit").text() == "false"){ + confirmExit_checkBox->setChecked(false); + }else{ + confirmExit_checkBox->setChecked(true); + } + preview_program->setText(tag.firstChildElement("previewing").text()); + QString OSDValue = tag.firstChildElement("displayOSD").text(); + if(OSDValue == "false"){ + neverOSD->setChecked(true); + }else{ + if(OSDValue == "partial"){ + someOSD->setChecked(true); + }else{ + alwaysOSD->setChecked(true); + } + } + } + // Disable apply Button + applyButton->setEnabled(false); + return true; +} + +// return min & max ports +// [min, max] +std::pair options_imp::getPorts() const{ + return std::make_pair(this->spin_port_min->value(), this->spin_port_min->value()); +} + +QString options_imp::getPreviewProgram() const{ + QString preview_txt = preview_program->text(); + preview_txt.trimmed(); + return preview_txt; +} + +bool options_imp::getGoToSysTrayOnMinimizingWindow() const{ + return check_goToSysTray->isChecked(); +} + +bool options_imp::getConfirmOnExit() const{ + return confirmExit_checkBox->isChecked(); +} + +bool options_imp::isDHTEnabled() const{ + return !disableDHT->isChecked(); +} + +// Return Download & Upload limits +// [download,upload] +QPair options_imp::getLimits() const{ + int DL = -1, UP = -1; + if(!disableDLLimit->isChecked()){ + DL = this->spin_download->value(); + } + if(!disableUPLimit->isChecked()){ + UP = this->spin_upload->value(); + } + return qMakePair(DL, UP); +} + +// Should the program use OSD? +bool options_imp::getUseOSDAlways() const{ + return alwaysOSD->isChecked(); +} + +// Should the program use OSD when the window is hidden only? +bool options_imp::getUseOSDWhenHiddenOnly() const{ + return someOSD->isChecked(); +} + +// Return Share ratio +float options_imp::getRatio() const{ + if(!disableRatio->isChecked()){ + return spin_ratio->value(); + } + return 0; +} + +// Return Save Path +QString options_imp::getSavePath() const{ + return txt_savePath->text(); +} + +// Return max connections number +int options_imp::getMaxConnec() const{ + if(disableMaxConnec->isChecked()){ + return -1; + }else{ + return spin_max_connec->value(); + } +} + +void options_imp::showLoad(){ + if(!loadOptions()){ + std::cout << "Warning: Couldn't load options" << '\n'; + } + this->show(); +} + +void options_imp::on_okButton_clicked(){ + if(applyButton->isEnabled()){ + saveOptions(); + applyButton->setEnabled(false); + } + this->hide(); +} + +bool options_imp::getClearFinishedOnExit() const{ + return clearFinished_checkBox->isChecked(); +} + +void options_imp::on_applyButton_clicked(){ + saveOptions(); +} + +void options_imp::on_cancelButton_clicked(){ + this->hide(); +} + +void options_imp::disableDownload(int checkBoxValue){ + if(checkBoxValue==2){ + //Disable + spin_download->setEnabled(false); + }else{ + //enable + spin_download->setEnabled(true); + } +} + +void options_imp::disableMaxConnecLimit(int checkBoxValue){ + if(checkBoxValue==2){ + //Disable + spin_max_connec->setEnabled(false); + }else{ + //enable + spin_max_connec->setEnabled(true); + } +} + +void options_imp::enableFilter(int checkBoxValue){ + if(checkBoxValue!=2){ + //Disable + filterGroup->setEnabled(false); + }else{ + //enable + filterGroup->setEnabled(true); + } +} + +void options_imp::disableUpload(int checkBoxValue){ + if(checkBoxValue==2){ + //Disable + spin_upload->setEnabled(false); + }else{ + //enable + spin_upload->setEnabled(true); + } +} + +void options_imp::enableApplyButton(){ + if(!applyButton->isEnabled()){ + applyButton->setEnabled(true); + } +} + +void options_imp::disableShareRatio(int checkBoxValue){ + if(checkBoxValue==2){ + //Disable + spin_ratio->setEnabled(false); + }else{ + //enable + spin_ratio->setEnabled(true); + } +} + +void options_imp::enableProxy(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + groupProxy->setEnabled(true); + }else{ + //disable + groupProxy->setEnabled(false); + } +} + +void options_imp::enableProxyAuth(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + groupProxyAuth->setEnabled(true); + }else{ + //disable + groupProxyAuth->setEnabled(false); + } +} + +void options_imp::enableDirScan(int checkBoxValue){ + if(checkBoxValue==2){ + //enable + lbl_scanDir->setEnabled(true); + scanDir->setEnabled(true); + browse_button_scan->setEnabled(true); + }else{ + //disable + lbl_scanDir->setEnabled(false); + scanDir->setEnabled(false); + browse_button_scan->setEnabled(false); + } +} + +// Proxy settings +bool options_imp::isProxyEnabled() const{ + return groupProxy->isEnabled(); +} + +bool options_imp::isProxyAuthEnabled() const{ + return groupProxyAuth->isEnabled(); +} + +QString options_imp::getProxyIp() const{ + return proxy_ip->text(); +} + +unsigned short options_imp::getProxyPort() const{ + return proxy_port->value(); +} + +QString options_imp::getProxyUsername() const{ + return proxy_username->text(); +} + +QString options_imp::getProxyPassword() const{ + return proxy_password->text(); +} + +// Locale Settings +QString options_imp::getLocale() const{ + return locales.at(combo_i18n->currentIndex()); +} + +void options_imp::setLocale(QString locale){ + int indexLocales=locales.indexOf(QRegExp(locale)); + if(indexLocales != -1){ + combo_i18n->setCurrentIndex(indexLocales); + } +} + +// Is called before saving to check if minPort < maxPort +void options_imp::checkPortsLogic(){ + int maxValue = spin_port_max->value(); + if(spin_port_min->value() > spin_port_max->value()){ + spin_port_max->setValue(spin_port_min->value()); + spin_port_min->setValue(maxValue); + } +} + +// Return scan dir set in options +QString options_imp::getScanDir() const{ + if(scanDir->isEnabled()){ + return scanDir->text(); + }else{ + return QString(); + } +} + +// Display dialog to choose scan dir +void options_imp::on_browse_button_scan_clicked(){ + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose Scan Directory"), QDir::homePath()); + if(!dir.isNull()){ + scanDir->setText(dir); + } +} + +void options_imp::on_filterBrowse_clicked(){ + QString ipfilter = QFileDialog::getOpenFileName(this, tr("Choose ipfilter.dat file"), QDir::homePath()); + if(!ipfilter.isNull()){ + filterFile->setText(ipfilter); + processFilterFile(ipfilter); + } +} + +void options_imp::on_browsePreview_clicked(){ + QString program_txt = QFileDialog::getOpenFileName(this, tr("Choose your favourite preview program"), QDir::homePath()); + if(!program_txt.isNull()){ + preview_program->setText(program_txt); + } +} + +// Display dialog to choose save dir +void options_imp::on_browse_button_clicked(){ + QString dir = QFileDialog::getExistingDirectory(this, tr("Choose save Directory"), QDir::homePath()); + if(!dir.isNull()){ + txt_savePath->setText(dir); + } +} + +// look for ipfilter.dat file +// reads emule ipfilter files. +// with the following format: +// +// - , , +// +// first-ip is an ip address that defines the first +// address of the range +// last-ip is the last ip address in the range +// access is a number specifying the access control +// for this ip-range. Right now values > 127 = allowed +// and numbers <= 127 = blocked +// the rest of the line is ignored +// +// Lines may be commented using '#' or '//' +void options_imp::processFilterFile(const QString& filePath){ + filtersList->clear(); + QString manualFilters= misc::qBittorrentPath() + "ipfilter.dat"; + QStringList filterFiles(manualFilters); + filterFiles.append(filePath); + for(int i=0; i<2; ++i){ + QFile file(filterFiles.at(i)); + QStringList IP; + if (file.exists()){ + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QMessageBox::critical(0, tr("I/O Error"), tr("Couldn't open:")+" "+filePath+" "+tr("in read mode.")); + return; + } + unsigned int nbLine = 0; + while (!file.atEnd()) { + ++nbLine; + QByteArray line = file.readLine(); + QString strLine = QString(line.data()); + if(!strLine.startsWith('#') && !strLine.startsWith("//")){ + // Line is not commented + QStringList partsList = strLine.split(','); + unsigned int nbElem = partsList.size(); + if(nbElem != 2 && nbElem != 3){ + QMessageBox::critical(0, tr("Invalid Line"), tr("Line")+" "+QString(misc::toString(nbLine).c_str())+" "+tr("is malformed.")); + return; + } + int nbAccess = partsList.at(1).trimmed().toInt(); + if(nbAccess <= 127){ + QString strComment; + QString strStartIP = partsList.at(0).split('-').at(0).trimmed(); + QString strEndIP = partsList.at(0).split('-').at(1).trimmed(); + if(partsList.size() == 3){ + strComment = partsList.at(2).trimmed(); + }else{ + strComment = QString(); + } + // Split IP + IP = strStartIP.split('.'); + if(IP.size() != 4){ + continue; + } + address start(address::from_string(strStartIP.toStdString())); + IP = strEndIP.split('.'); + if(IP.size() != 4){ + continue; + } + address last(address::from_string(strEndIP.toStdString())); + // add it to list + QStringList item(strStartIP); + item.append(strEndIP); + if(!i){ + item.append("Manual"); + }else{ + item.append("ipfilter.dat"); + } + item.append(strComment); + new QTreeWidgetItem(filtersList, item); + // Apply to bittorrent session + filter.add_rule(start, last, ip_filter::blocked); + } + } + } + file.close(); + } + } +} + +// Return Filter object to apply to BT session +ip_filter options_imp::getFilter() const{ + return filter; +} + +// Add an IP Range to ipFilter +void options_imp::on_addFilterRange_clicked(){ + bool ok; + // Ask user for start ip + QString startIP = QInputDialog::getText(this, tr("Range Start IP"), + tr("Start IP:"), QLineEdit::Normal, + "0.0.0.0", &ok); + QStringList IP1 = startIP.split('.'); + // Check IP + if (!ok || startIP.isEmpty() || IP1.size() != 4){ + QMessageBox::critical(0, tr("Incorrect IP"), tr("This IP is incorrect.")); + return; + } + for(int i=0; i<4; ++i){ + QString part = IP1.at(i).trimmed(); + if(part.isEmpty() || part.toInt() < 0 || part.toInt() > 255){ + QMessageBox::critical(0, tr("Incorrect IP"), tr("This IP is incorrect.")); + return; + } + } + // Ask user for last ip + QString lastIP = QInputDialog::getText(this, tr("Range End IP"), + tr("End IP:"), QLineEdit::Normal, + startIP, &ok); + QStringList IP2 = lastIP.split('.'); + // check IP + if (!ok || lastIP.isEmpty() || IP2.size() != 4){ + QMessageBox::critical(0, tr("Incorrect IP"), tr("This IP is incorrect.")); + return; + } + for(int i=0; i<4; ++i){ + QString part = IP2.at(i).trimmed(); + if(part.isEmpty() || part.toInt() < 0 || part.toInt() > 255){ + QMessageBox::critical(0, tr("Incorrect IP"), tr("This IP is incorrect.")); + return; + } + } + // Ask user for Comment + QString comment = QInputDialog::getText(this, tr("IP Range Comment"), + tr("Comment:"), QLineEdit::Normal, + "", &ok); + if (!ok){ + comment = QString(""); + } + QFile ipfilter(misc::qBittorrentPath() + "ipfilter.dat"); + if (!ipfilter.open(QIODevice::Append | QIODevice::WriteOnly | QIODevice::Text)){ + std::cout << "Error: Couldn't write in ipfilter.dat"; + return; + } + QTextStream out(&ipfilter); + out << startIP << " - " << lastIP << ", 0, " << comment << "\n"; + ipfilter.close(); + processFilterFile(filterFile->text()); + enableApplyButton(); +} + +// Delete selected IP range in list and ipfilter.dat file +// User can only delete IP added manually +void options_imp::on_delFilterRange_clicked(){ + bool changed = false; + QList selectedItems = filtersList->selectedItems(); + // Delete from list + for(int i=0;itext(2) == "Manual"){ + delete item; + changed = true; + } + if(changed){ + enableApplyButton(); + } + } + // Update ipfilter.dat + QFile ipfilter(misc::qBittorrentPath() + "ipfilter.dat"); + if (!ipfilter.open(QIODevice::WriteOnly | QIODevice::Text)){ + std::cout << "Error: Couldn't write in ipfilter.dat"; + return; + } + QTextStream out(&ipfilter); + for(int i=0; itopLevelItemCount();++i){ + QTreeWidgetItem *item = filtersList->topLevelItem(i); + if(item->text(2) == "Manual"){ + out << item->text(0) << " - " << item->text(1) << ", 0, " << item->text(3) << "\n"; + } + } + ipfilter.close(); +} diff --git a/src/options_imp.h b/src/options_imp.h new file mode 100644 index 000000000..f5684f3df --- /dev/null +++ b/src/options_imp.h @@ -0,0 +1,106 @@ +/* + * 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 OPTIONS_IMP_H +#define OPTIONS_IMP_H + +#include +#include "ui_options.h" +#include "libtorrent/session.hpp" +using namespace libtorrent; + +class options_imp : public QDialog, private Ui::Dialog{ + Q_OBJECT + + private: + QButtonGroup choiceLanguage; + ip_filter filter; + QStringList locales; + + public: + // Contructor + options_imp(QWidget *parent=0); + + // Methods + bool saveOptions(); + bool loadOptions(); + // Main options + std::pair getPorts() const; + QString getSavePath() const; + QPair getLimits() const; + float getRatio() const; + int getMaxConnec() const; + QString getScanDir() const; + bool isDHTEnabled() const; + // Filter Settings + bool isFilteringEnabled() const; + ip_filter getFilter() const; + // Proxy settings + bool isProxyEnabled() const; + bool isProxyAuthEnabled() const; + QString getProxyIp() const; + unsigned short getProxyPort() const; + QString getProxyUsername() const; + QString getProxyPassword() const; + // Language Settings + QString getLocale() const; + QTranslator translator; + // Misc Settings + bool getClearFinishedOnExit() const; + bool getGoToSysTrayOnMinimizingWindow() const; + bool getConfirmOnExit() const; + QString getPreviewProgram() const; + bool getUseOSDAlways() const; + bool getUseOSDWhenHiddenOnly() const; + // Other + void showLoad(); + + + protected slots: + void on_okButton_clicked(); + void on_cancelButton_clicked(); + void on_applyButton_clicked(); + void on_addFilterRange_clicked(); + void on_delFilterRange_clicked(); + void on_browse_button_scan_clicked(); + void on_browsePreview_clicked(); + void on_filterBrowse_clicked(); + void disableDownload(int checkBoxValue); + void disableMaxConnecLimit(int); + void enableFilter(int checkBoxValue); + void disableUpload(int checkBoxValue); + void disableShareRatio(int checkBoxValue); + void enableProxy(int checkBoxValue); + void enableProxyAuth(int checkBoxValue); + void enableDirScan(int checkBoxValue); + void on_browse_button_clicked(); + void processFilterFile(const QString& filePath=QString()); + void enableApplyButton(); + void checkPortsLogic(); + + public slots: + void setLocale(QString locale); + + signals: + void status_changed(const QString&) const; +}; + +#endif diff --git a/src/preview.ui b/src/preview.ui new file mode 100644 index 000000000..92bca6266 --- /dev/null +++ b/src/preview.ui @@ -0,0 +1,149 @@ + + + + + preview + + + + 0 + 0 + 414 + 256 + + + + Preview selection + + + + 9 + + + 6 + + + + + + 0 + 37 + + + + + 16777215 + 37 + + + + + Sans Serif + 14 + 75 + false + true + false + false + + + + File preview + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + + 16777215 + 42 + + + + The following files support previewing, <br>please select one of them: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Preview + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + cancelButton + clicked() + preview + reject() + + + 296 + 245 + + + 179 + 282 + + + + + diff --git a/src/previewSelect.h b/src/previewSelect.h new file mode 100644 index 000000000..552063c91 --- /dev/null +++ b/src/previewSelect.h @@ -0,0 +1,144 @@ +/* + * 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 PREVIEWSELECT_H +#define PREVIEWSELECT_H + +#include +#include +#include +#include +#include +#include "ui_preview.h" +#include "PreviewListDelegate.h" +#include "misc.h" + +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 + +using namespace libtorrent; + +class previewSelect: public QDialog, private Ui::preview { + Q_OBJECT + + private: + QStandardItemModel *previewListModel; + PreviewListDelegate *listDelegate; + QStringList supported_preview_extensions; + torrent_handle h; + + signals: + void readyToPreviewFile(const QString&) const; + + protected slots: + void on_previewButton_clicked(){ + QModelIndex index; + bool found = false; + QModelIndexList selectedIndexes = previewList->selectionModel()->selectedIndexes(); + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + QString root_path = QString(h.save_path().string().c_str()); + if(root_path.at(root_path.length()-1) != QDir::separator()){ + root_path += '/'; + } + // Get the file name + QString fileName = index.data().toString(); + // File + if(QFile::exists(root_path+fileName)){ + emit readyToPreviewFile(root_path+fileName); + found = true; + }else{ + // Folder + QString folder_name = QString(h.get_torrent_info().name().c_str()); + // Will find the file even if it is in a sub directory + QString result = misc::findFileInDir(root_path+folder_name, fileName); + if(!result.isNull()){ + emit readyToPreviewFile(result); + found = true; + } + } + break; + } + } + if(!found){ + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + } + close(); + } + + void on_cancelButton_clicked(){ + close(); + } + + public: + previewSelect(QWidget* parent, torrent_handle h): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + // Preview list + previewListModel = new QStandardItemModel(0, 3); + previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); + previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + previewList->setModel(previewListModel); + listDelegate = new PreviewListDelegate(this); + previewList->setItemDelegate(listDelegate); + supported_preview_extensions<<"AVI"<<"DIVX"<<"MPG"<<"MPEG"<<"MP3"<<"OGG"<<"WMV"<<"WMA"<<"RMV"<<"RMVB"<<"ASF"<<"MOV"<<"WAV"<<"MP2"<<"SWF"<<"AC3"; + previewList->header()->resizeSection(0, 200); + // Fill list in + this->h = h; + torrent_info torrentInfo = h.get_torrent_info(); + std::vector fp; + h.file_progress(fp); + for(int i=0; i= 0){ + int row = previewListModel->rowCount(); + previewListModel->insertRow(row); + previewListModel->setData(previewListModel->index(row, NAME), QVariant(fileName)); + previewListModel->setData(previewListModel->index(row, SIZE), QVariant((qlonglong)torrentInfo.file_at(i).size)); + previewListModel->setData(previewListModel->index(row, PROGRESS), QVariant((double)fp[i])); + } + } + previewList->selectionModel()->select(previewListModel->index(0, NAME), QItemSelectionModel::Select); + previewList->selectionModel()->select(previewListModel->index(0, SIZE), QItemSelectionModel::Select); + previewList->selectionModel()->select(previewListModel->index(0, PROGRESS), QItemSelectionModel::Select); + if(!previewListModel->rowCount()){ + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + close(); + } + connect(this, SIGNAL(readyToPreviewFile(const QString&)), parent, SLOT(previewFile(const QString&))); + if(previewListModel->rowCount() == 1){ + // Only one file : no choice + on_previewButton_clicked(); + }else{ + show(); + } + } + + ~previewSelect(){ + delete previewListModel; + delete listDelegate; + } +}; + +#endif diff --git a/src/properties.ui b/src/properties.ui new file mode 100644 index 000000000..90f17be84 --- /dev/null +++ b/src/properties.ui @@ -0,0 +1,780 @@ + + + + + properties + + + + 0 + 0 + 538 + 547 + + + + Torrent Properties + + + + 9 + + + 6 + + + + + 0 + + + + Main infos + + + + 9 + + + 6 + + + + + + 16777215 + 20 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Download state: + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Number of peers: + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + + + + Qt::Horizontal + + + + 111 + 20 + + + + + + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + 0 + 193 + + + + Tracker + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Trackers: + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Errors: + + + + + + + + 16777215 + 16 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Current tracker: + + + + + + + + + 0 + + + 6 + + + + + + 7 + 7 + 0 + 0 + + + + + + + + QTextEdit::NoWrap + + + + + + + + 16777215 + 16 + + + + + + + + + + + + + + + + + + + 5 + 5 + 0 + 0 + + + + + 0 + 97 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Current Session + + + + 9 + + + 6 + + + + + + 7 + 7 + 0 + 0 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Total uploaded: + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Total downloaded: + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Share Ratio: + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Total failed: + + + + + + + + + 4 + + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 181 + 20 + + + + + + + + + + + + + + + 43 + 52 + + + + + 16777215 + 52 + + + + Options + + + + 9 + + + 6 + + + + + Download in correct order (slower but good for previewing) + + + + + + + + + + + Torrent content + + + + 9 + + + 6 + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Files contained in current torrent: + + + + + + + + 0 + 301 + + + + QAbstractItemView::ExtendedSelection + + + 1 + + + false + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Unselect + + + + + + + Select + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Sans Serif + 8 + 50 + false + false + false + false + + + + You can select here precisely which files you want to download in current torrent. + + + Qt::AlignCenter + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + okButton + clicked() + properties + accept() + + + 278 + 253 + + + 96 + 254 + + + + + diff --git a/src/properties_imp.cpp b/src/properties_imp.cpp new file mode 100644 index 000000000..22254ac76 --- /dev/null +++ b/src/properties_imp.cpp @@ -0,0 +1,229 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contact : chris@qbittorrent.org + */ + +#include "properties_imp.h" +#include "misc.h" +#include "PropListDelegate.h" + +// Constructor +properties::properties(QWidget *parent, torrent_handle h, QStringList trackerErrors): QDialog(parent){ + setupUi(this); + // set icons + unselect->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png"))); + select->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png"))); + + setAttribute(Qt::WA_DeleteOnClose); + this->h = h; + // Set Properties list model + PropListModel = new QStandardItemModel(0,4); + PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File Name")); + PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + PropListModel->setHeaderData(SELECTED, Qt::Horizontal, tr("Selected")); + filesList->setModel(PropListModel); + PropDelegate = new PropListDelegate(); + filesList->setItemDelegate(PropDelegate); + connect(filesList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(toggleSelectedState(const QModelIndex&))); + // get Infos from torrent handle + torrent_status torrentStatus = h.status(); + torrent_info torrentInfo = h.get_torrent_info(); + fileName->setText(torrentInfo.name().c_str()); + torrent_status::state_t state = torrentStatus.state; + switch(state){ + case torrent_status::finished: + dlState->setText(tr("Finished")); + break; + case torrent_status::queued_for_checking: + dlState->setText(tr("Queued for checking")); + break; + case torrent_status::checking_files: + dlState->setText(tr("Checking files")); + break; + case torrent_status::connecting_to_tracker: + dlState->setText(tr("Connecting to tracker")); + break; + case torrent_status::downloading_metadata: + dlState->setText(tr("Downloading Metadata")); + break; + case torrent_status::downloading: + dlState->setText(tr("Downloading")); + break; + case torrent_status::seeding: + dlState->setText(tr("Seeding")); + break; + case torrent_status::allocating: + dlState->setText(tr("Allocating")); + } + QString tracker = QString(torrentStatus.current_tracker.c_str()).trimmed(); + if(!tracker.isEmpty()){ + trackerURL->setText(tracker); + }else{ + trackerURL->setText(tr("None - Unreachable?")); + } + std::vector trackers = torrentInfo.trackers(); + for(unsigned int i=0; iaddItem(QString(trackers[i].url.c_str())); + } + float peers = torrentStatus.num_peers; + nbPeers->setText(misc::toString(peers).c_str()); + char tmp[MAX_CHAR_TMP]; + failed->setText(misc::friendlyUnit(torrentStatus.total_failed_bytes)); + upTotal->setText(misc::friendlyUnit(torrentStatus.total_payload_upload)); + dlTotal->setText(misc::friendlyUnit(torrentStatus.total_payload_download)); + // Update ratio info + if(torrentStatus.total_payload_download <= 0 || torrentStatus.total_payload_upload <= 0){ + shareRatio->setText(tr("Unknown")); + }else{ + float ratio = 1.; + ratio = (float)torrentStatus.total_payload_upload/(float)torrentStatus.total_payload_download; + if(ratio > 10.){ + ratio = 10.; + } + snprintf(tmp, MAX_CHAR_TMP, "%.1f", ratio); + shareRatio->setText(tmp); + } + + float complete, partial; + QString completeStr, partialStr; + complete = torrentStatus.num_complete; + if(complete == -1){ + completeStr = tr("Unknown"); + }else{ + snprintf(tmp, MAX_CHAR_TMP, "%.1f%%", complete/peers*100.); + completeStr = QString(tmp); + } + partial = torrentStatus.num_incomplete; + if(partial == -1){ + partialStr = tr("Unknown"); + }else{ + snprintf(tmp, MAX_CHAR_TMP, "%.1f%%", partial/peers*100.); + partialStr = QString(tmp); + } + complete_partial->setText("("+tr("Complete: ")+completeStr+", "+tr("Partial: ")+partialStr+")"); + // Tracker Errors + for(int i=0; i < trackerErrors.size(); ++i){ + this->trackerErrors->append(trackerErrors.at(i)); + } + std::vector fp; + h.file_progress(fp); + // List files in torrent + for(int i=0; irowCount(); + PropListModel->insertRow(row); + PropListModel->setData(PropListModel->index(row, NAME), QVariant(torrentInfo.file_at(i).path.leaf().c_str())); + PropListModel->setData(PropListModel->index(row, SIZE), QVariant((qlonglong)torrentInfo.file_at(i).size)); + PropListModel->setData(PropListModel->index(row, PROGRESS), QVariant((double)fp[i])); + if(h.is_piece_filtered(i)){ + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(false)); + setRowColor(row, "red"); + }else{ + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(true)); + setRowColor(row, "green"); + } + } + // Incremental download + if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(torrentInfo.name().c_str())+".incremental")){ + incrementalDownload->setChecked(true); + }else{ + incrementalDownload->setChecked(false); + } +} + +// Set the color of a row in data model +void properties::setRowColor(int row, QString color){ + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(row, i), QVariant(QColor(color)), Qt::TextColorRole); + } +} + +// Toggle the selected state of a file within the torrent when we +// double click on it. +void properties::toggleSelectedState(const QModelIndex& index){ + int row = index.row(); + if(h.is_piece_filtered(row)){ + // File is selected + h.filter_piece(row, false); + // Update list infos + setRowColor(row, "green"); + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(true)); + }else{ + // File is not selected + h.filter_piece(row, true); + // Update list infos + setRowColor(row, "red"); + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(false)); + } +} + +void properties::on_incrementalDownload_stateChanged(int){ + qDebug("Incremental download toggled"); + torrent_info torrentInfo = h.get_torrent_info(); + if(incrementalDownload->isChecked()){ + // Create .incremental file + QFile incremental_file(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(torrentInfo.name().c_str())+".incremental"); + incremental_file.open(QIODevice::WriteOnly | QIODevice::Text); + incremental_file.close(); + h.set_sequenced_download_threshold(1); + }else{ + QFile::remove(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+QString(torrentInfo.name().c_str())+".incremental"); + h.set_sequenced_download_threshold(100); + } +} + +// Resume download of specified files of torrent +void properties::on_select_clicked(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + int row = index.row(); + if(h.is_piece_filtered(row)){ + // File is selected + h.filter_piece(row, false); + // Update list infos + setRowColor(row, "green"); + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(true)); + } + } + } +} + +void properties::on_okButton_clicked(){ + close(); +} + +// Cancel download of specified files of torrent +void properties::on_unselect_clicked(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + QModelIndex index; + foreach(index, selectedIndexes){ + if(index.column() == NAME){ + int row = index.row(); + if(!h.is_piece_filtered(row)){ + // File is selected + h.filter_piece(row, true); + // Update list infos + setRowColor(row, "red"); + PropListModel->setData(PropListModel->index(row, SELECTED), QVariant(false)); + } + } + } +} diff --git a/src/properties_imp.h b/src/properties_imp.h new file mode 100644 index 000000000..46bce511d --- /dev/null +++ b/src/properties_imp.h @@ -0,0 +1,53 @@ +/* + * 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 PROPERTIES_H +#define PROPERTIES_H + +#include "ui_properties.h" +#include +#include + +class PropListDelegate; + +using namespace libtorrent; + +class properties : public QDialog, private Ui::properties{ + Q_OBJECT + private: + torrent_handle h; + PropListDelegate *PropDelegate; + QStandardItemModel *PropListModel; + + protected slots: + void on_select_clicked(); + void on_unselect_clicked(); + void on_okButton_clicked(); + void on_incrementalDownload_stateChanged(int); + void setRowColor(int row, QString color); + void toggleSelectedState(const QModelIndex& index); + + public: + // Constructor + properties(QWidget *parent = 0, torrent_handle h = torrent_handle(), QStringList trackerErrors = QStringList()); +}; + +#endif diff --git a/src/search.qrc b/src/search.qrc new file mode 100644 index 000000000..7599c0b99 --- /dev/null +++ b/src/search.qrc @@ -0,0 +1,5 @@ + + + search_engine/nova.py + + \ No newline at end of file diff --git a/src/search_engine/nova.py b/src/search_engine/nova.py new file mode 100755 index 000000000..1a7cc5cbc --- /dev/null +++ b/src/search_engine/nova.py @@ -0,0 +1,432 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Version: 1.7 +# Changelog: +# - merged with qbittorrent branch (code cleanup, indentation mistakes) +# - separate standalone and slave mode +# - added btjunkie +# - added meganova +# - added multithreaded mode + +# Version: 1.6 +# Changelog: +# - size is now always returned in bytes +# - seeders/leechers are now always returned as integers +# - cleaned up code +# - results are now displayed in real time +# - fixed piratebay, torrentreactor + +# Author: +# Fabien Devaux +# Contributors: +# Christophe Dumez (qbittorrent integration) +# Thanks to gab #gcu @ irc.freenode.net (multipage support on PirateBay) +# Thanks to Elias (torrentreactor and isohunt search engines) +# +# Licence: BSD + +import sys +import urllib +import sgmllib +from xml.dom import minidom +import re +import os +import cgi +import traceback +import threading + +STANDALONE = True +THREADED = True + +if os.environ.has_key('QBITTORRENT'): + STANDALONE = False + THREADED = False + +def prettyPrinter(dictionnary): + print "%(link)s|%(name)s|%(size)s|%(seeds)s|%(leech)s|%(engine_url)s"%dictionnary + +if STANDALONE: + def termPrettyPrinter(dictionnary): + dictionnary['size'] = bytesToHuman(dictionnary['size']) + print "%(seeds)5s/%(leech)5s | %(size)10s | %(name)s "%dictionnary + print "wget '%s'"%dictionnary['link'].replace("'","\\'") + + globals()['prettyPrinter'] = termPrettyPrinter + +def bytesToHuman(filesize): + """ + Convert float (size in bytes) to readable string + """ + decimators = ('k','M','G','T') + unit = '' + for n in range(len(decimators)): + if filesize > 1100.0: + filesize /= 1024.0 + unit = decimators[n] + return '%.1f%sB'%(filesize, unit) + +def anySizeToBytes(size_string): + """ + Convert a string like '1 KB' to '1024' (bytes) + """ + # separate integer from unit + try: + size, unit = size_string.split() + except (ValueError, TypeError): + try: + size = size_string.strip() + unit = ''.join([c for c in size if c.isalpha()]) + size = size[:-len(unit)] + except(ValueError, TypeError): + return -1 + + size = float(size) + short_unit = unit.upper()[0] + + # convert + units_dict = { 'T': 40, 'G': 30, 'M': 20, 'K': 10 } + if units_dict.has_key( short_unit ): + size = size * 2**units_dict[short_unit] + return int(size) + +################################################################################ +# Every engine should have a "search" method taking +# a space-free string as parameter (ex. "family+guy") +# it should call prettyPrinter() with a dict as parameter +# see above for dict keys +# As a convention, try to list results by decrasing number of seeds or similar +################################################################################ + +class PirateBay(object): + url = 'http://thepiratebay.org' + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + class SimpleSGMLParser(sgmllib.SGMLParser): + def __init__(self, results, url, *args): + sgmllib.SGMLParser.__init__(self) + self.td_counter = None + self.current_item = None + self.results = results + self.url = url + + def start_a(self, attr): + params = dict(attr) + if params['href'].startswith('/browse'): + self.current_item = {} + self.td_counter = 0 + elif params['href'].startswith('http://torrents.thepiratebay.org/hashtorrent'): + self.current_item['link']=params['href'].strip() + self.td_counter = self.td_counter+1 + + def handle_data(self, data): + if self.td_counter == 1: + if not self.current_item.has_key('name'): + self.current_item['name'] = '' + self.current_item['name']+= data.strip() + if self.td_counter == 5: + if not self.current_item.has_key('size'): + self.current_item['size'] = '' + self.current_item['size']+= data.strip() + elif self.td_counter == 6: + if not self.current_item.has_key('seeds'): + self.current_item['seeds'] = '' + self.current_item['seeds']+= data.strip() + elif self.td_counter == 7: + if not self.current_item.has_key('leech'): + self.current_item['leech'] = '' + self.current_item['leech']+= data.strip() + + def start_td(self,attr): + if isinstance(self.td_counter,int): + self.td_counter += 1 + if self.td_counter > 7: + self.td_counter = None + # Display item + if self.current_item: + self.current_item['engine_url'] = self.url + self.current_item['size']= anySizeToBytes(self.current_item['size']) + if not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.results.append('a') + def search(self, what): + ret = [] + i = 0 + order = 'se' + while True: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + dat = urllib.urlopen(self.url+'/search.php?q=%s&orderby=%s&what=search&page=%u' % (what, order, i)).read() + parser.feed(dat) + parser.close() + if len(results) <= 0: + break + i += 1 + +class Mininova(object): + url = 'http://www.mininova.org' + table_items = 'added cat name size seeds leech'.split() + + def search(self, what): + order = 'seeds' # must be one in self.table_items + + def get_link(lnk): + lnk = lnk.getElementsByTagName('a').item(0) + return self.url+lnk.attributes.get('href').value + + def get_text(txt): + if txt.nodeType == txt.TEXT_NODE: + return txt.toxml() + else: + return ''.join([ get_text(n) for n in txt.childNodes]) + dat = urllib.urlopen(self.url+'/search/%s/%s'%(what,order)).read().decode('utf-8', 'replace') + x = minidom.parseString(dat.encode('utf-8', 'replace')) + table = x.getElementsByTagName('table').item(0) + if not table: return + for tr in table.getElementsByTagName('tr'): + tds = tr.getElementsByTagName('td') + if tds: + i = 0 + vals = {} + for td in tds: + if self.table_items[i] == 'name': + vals['link'] = get_link(td).strip() + vals[self.table_items[i]] = get_text(td).strip() + i += 1 + vals['engine_url'] = self.url + vals['size']= anySizeToBytes(vals['size']) + if not vals['seeds'].isdigit(): + vals['seeds'] = 0 + if not vals['leech'].isdigit(): + vals['leech'] = 0 + prettyPrinter(vals) + +# TODO: add multipage +class BtJunkie(object): + url = 'http://btjunkie.org' + + def search(self, what): + dat = urllib.urlopen(self.url+'/search?q=%s'%what).read().decode('utf8', 'replace') + # I know it's not very readable, but the SGML parser feels in pain + section_re = re.compile('(?s)href="/torrent\?do=download.*?') + torrent_re = re.compile('(?s)href="(?P.*?do=download[^"]+).*?' + '(?P.*?).*?' + '>(?P\d+MB).*?' + '>(?P\d+).*?' + '>(?P\d+)') + for match in section_re.finditer(dat): + txt = match.group(0) + m = torrent_re.search(txt) + if m: + torrent_infos = m.groupdict() + torrent_infos['engine_url'] = self.url + torrent_infos['size'] = anySizeToBytes(torrent_infos['size']) + torrent_infos['link'] = self.url+torrent_infos['link'] + prettyPrinter(torrent_infos) + +class MegaNova(object): + url = 'http://www.meganova.org' + + def search(self, what): + dat = urllib.urlopen(self.url+'/search.php?order=5&search=%s'%what).read().decode('utf8', 'replace') + # I know it's not very readable, but the SGML parser feels in pain + + section_re = re.compile('(?s)/torrent/.*?)".*?' + '(?P.*?).*?' + '>(?P[0-9.]+\s+.B).*?' + '>(?P\d+)<.*?' + '>(?P\d+)<') + + for match in section_re.finditer(dat): + txt = match.group(0) + m = torrent_re.search(txt) + if m: + torrent_infos = m.groupdict() + torrent_infos['engine_url'] = self.url + torrent_infos['size'] = anySizeToBytes(torrent_infos['size']) + torrent_infos['link'] = self.url+torrent_infos['link'] + prettyPrinter(torrent_infos) + +class Reactor(object): + url = 'http://tr.searching.com' + + class SimpleSGMLParser(sgmllib.SGMLParser): + def __init__(self, results, url, *args): + sgmllib.SGMLParser.__init__(self) + self.td_counter = None + self.current_item = None + self.results = results + self.id = None + self.url = url + + def start_a(self, attr): + params = dict(attr) + if params['href'].startswith('view.php'): + self.current_item = {} + self.td_counter = 0 + # extract the torrent id + #I save it in a global variable for after create the link string + equal = params['href'].find("=") + self.id = str(int(params['href'][equal+1:])) + + def handle_data(self, data): + if self.td_counter == 0: + if not self.current_item.has_key('name'): + self.current_item['name'] = '' + self.current_item['name']+= data.strip() + if self.td_counter == 1: + if not self.current_item.has_key('size'): + self.current_item['size'] = '' + self.current_item['size']+= data.strip() + elif self.td_counter == 2: + if not self.current_item.has_key('seeds'): + self.current_item['seeds'] = '' + self.current_item['seeds']+= data.strip() + elif self.td_counter == 3: + if not self.current_item.has_key('leech'): + self.current_item['leech'] = '' + self.current_item['leech']+= data.strip() + + def start_td(self,attr): + if isinstance(self.td_counter,int): + self.td_counter += 1 + if self.td_counter > 7: + self.td_counter = None + # add item to results + if self.current_item: + self.current_item['link']='http://download.torrentreactor.net/download.php?name=%s&id=%s'%(cgi.escape(self.current_item['name']),self.id) + self.current_item['engine_url'] = self.url + self.current_item['size']= anySizeToBytes(self.current_item['size']) + if not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.has_results = True + self.results.append('a') + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + def search(self, what): + i = 0 + while True: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + dat = urllib.urlopen(self.url+'/search.php?search=&words=%s&skip=%s'%(what,(i*50))).read().decode('utf-8', 'replace') + parser.feed(dat) + parser.close() + if len(results) <= 0: + break + i += 1 + +class Isohunt(object): + url = 'http://isohunt.com' + + class SimpleSGMLParser(sgmllib.SGMLParser): + def __init__(self, results, url, *args): + sgmllib.SGMLParser.__init__(self) + self.td_counter = None + self.current_item = None + self.results = results + self.url = url + + def start_tr(self, attr): + params = dict(attr) + if 'onclick' in params: + Durl='http://isohunt.com/dl.php?id=' + self.current_item = {} + self.td_counter = 0 + begin_id = params['onclick'].find("id=")+3 + end_id = params['onclick'][begin_id:].find("'") + self.current_item['link'] = '%s%s'%(Durl,str(params['onclick'][begin_id:begin_id+end_id])) + + def handle_data(self, data): + if self.td_counter == 3: + if not self.current_item.has_key('name'): + self.current_item['name'] = '' + self.current_item['name']+= data.strip() + if self.td_counter == 4: + if not self.current_item.has_key('size'): + self.current_item['size'] = '' + self.current_item['size']+= data.strip() + if self.td_counter == 5: + if not self.current_item.has_key('seeds'): + self.current_item['seeds'] = '' + self.current_item['seeds']+= data.strip() + if self.td_counter == 6: + if not self.current_item.has_key('leech'): + self.current_item['leech'] = '' + self.current_item['leech']+= data.strip() + + def start_td(self,attr): + if isinstance(self.td_counter,int): + self.td_counter += 1 + if self.td_counter > 7: + self.td_counter = None + # add item to results + if self.current_item: + self.current_item['engine_url'] = self.url + self.current_item['size']= anySizeToBytes(self.current_item['size']) + if not self.current_item.has_key('seeds') or not self.current_item['seeds'].isdigit(): + self.current_item['seeds'] = 0 + if not self.current_item.has_key('leech') or not self.current_item['leech'].isdigit(): + self.current_item['leech'] = 0 + prettyPrinter(self.current_item) + self.results.append('a') + + def __init__(self): + self.results = [] + self.parser = self.SimpleSGMLParser(self.results, self.url) + + def search(self, what): + i = 1 + while True: + results = [] + parser = self.SimpleSGMLParser(results, self.url) + dat = urllib.urlopen(self.url+'/torrents.php?ihq=%s&ihp=%s'%(what,i)).read().decode('utf-8', 'replace') + parser.feed(dat) + parser.close() + if len(results) <= 0: + break + i += 1 + +class EngineLauncher(threading.Thread): + def __init__(self, engine, what): + threading.Thread.__init__(self) + self.engine = engine + self.what = what + def run(self): + self.engine.search(self.what) + +if __name__ == '__main__': + available_engines_list = BtJunkie, MegaNova, Mininova, PirateBay, Reactor, Isohunt + + if len(sys.argv) < 3: + raise SystemExit('./nova.py \navailable engines: %s'% + (','.join(e.__name__ for e in available_engines_list))) + + engines_list = [e.lower() for e in sys.argv[1].strip().split(',')] + what = '+'.join(sys.argv[2:]) + + if 'all' in engines_list: + engines_list = [e.__name__.lower() for e in available_engines_list] + + selected_engines = set(e for e in available_engines_list if e.__name__.lower() in engines_list) + + for engine in selected_engines: + try: + if THREADED: + EngineLauncher( engine(), what ).start() + else: + engine().search(what) + except: + if STANDALONE: + traceback.print_exc() diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 000000000..cfda3ece4 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,102 @@ +# Vars +LANG_PATH = lang +ICONS_PATH = Icons +TRAYICON_CPP = trayicon + +#Set the following variable to 1 to enable debug +DEBUG_MODE = 1 + +# Global +TEMPLATE = app +TARGET = qbittorrent +DEPENDPATH += . trayicon +INCLUDEPATH += $$TRAYICON_CPP +CONFIG += qt x11 + +contains(DEBUG_MODE, 1){ + CONFIG += debug + message(Debug build!) +} +contains(DEBUG_MODE, 0){ + CONFIG -= debug + message(Release build!) +} + +LIBS += -lcurl +CONFIG += link_pkgconfig +PKGCONFIG += libtorrent +QT += xml network + +contains(DEBUG_MODE, 0){ + DEFINES += QT_NO_DEBUG_OUTPUT + CONFIG += release +} + +# Includes +include($$TRAYICON_CPP/trayicon.pri) +exists(../conf.pri) { + include(../conf.pri) +} + +# Install +unix { + # Man page + man.files = doc/qbittorrent.1.gz + man.path = $$PREFIX/share/man/man1/ + INSTALLS += man + + # Menu Icon + menuicon.files = Icons/qBittorrent.desktop + menuicon.path = $$PREFIX/share/applications/ + INSTALLS += menuicon + logos.files = menuicons/* + logos.path = $$PREFIX/share/icons/hicolor/ + INSTALLS += logos +} + +target.path = $$PREFIX/bin/ +INSTALLS += target + +RESOURCES = icons.qrc \ + lang.qrc \ + search.qrc + +# Translations +TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \ + $$LANG_PATH/qbittorrent_zh.ts \ + $$LANG_PATH/qbittorrent_en.ts \ + $$LANG_PATH/qbittorrent_ca.ts \ + $$LANG_PATH/qbittorrent_es.ts \ + $$LANG_PATH/qbittorrent_pl.ts \ + $$LANG_PATH/qbittorrent_ko.ts \ + $$LANG_PATH/qbittorrent_de.ts \ + $$LANG_PATH/qbittorrent_nl.ts \ + $$LANG_PATH/qbittorrent_tr.ts \ + $$LANG_PATH/qbittorrent_sv.ts \ + $$LANG_PATH/qbittorrent_el.ts \ + $$LANG_PATH/qbittorrent_ru.ts \ + $$LANG_PATH/qbittorrent_uk.ts \ + $$LANG_PATH/qbittorrent_bg.ts \ + $$LANG_PATH/qbittorrent_it.ts \ + $$LANG_PATH/qbittorrent_zh_HK.ts \ + $$LANG_PATH/qbittorrent_sk.ts \ + $$LANG_PATH/qbittorrent_ro.ts \ + $$LANG_PATH/qbittorrent_pt.ts + +# Source code +HEADERS += GUI.h misc.h options_imp.h about_imp.h \ + properties_imp.h createtorrent_imp.h OSD.h \ + DLListDelegate.h SearchListDelegate.h \ + PropListDelegate.h previewSelect.h \ + PreviewListDelegate.h trackerLogin.h \ + downloadThread.h downloadFromURLImp.h +FORMS += MainWindow.ui options.ui about.ui \ + properties.ui createtorrent.ui preview.ui \ + login.ui downloadFromURL.ui +SOURCES += GUI.cpp \ + main.cpp \ + options_imp.cpp \ + properties_imp.cpp \ + createtorrent_imp.cpp \ + OSD.cpp + diff --git a/src/trackerLogin.h b/src/trackerLogin.h new file mode 100644 index 000000000..256acc34c --- /dev/null +++ b/src/trackerLogin.h @@ -0,0 +1,68 @@ +/* + * 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 TRACKERLOGIN_H +#define TRACKERLOGIN_H + +#include +#include +#include +#include "ui_login.h" + +using namespace libtorrent; + +class trackerLogin : public QDialog, private Ui::authentication{ + Q_OBJECT + + private: + torrent_handle h; + + public: + trackerLogin(QWidget *parent, torrent_handle h): QDialog(parent){ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + login_logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/encrypted.png"))); + this->h = h; + tracker_url->setText(QString(h.status().current_tracker.c_str())); + connect(this, SIGNAL(trackerLoginCancelled(QPair)), parent, SLOT(addUnauthenticatedTracker(QPair))); + show(); + } + + ~trackerLogin(){} + + signals: + void trackerLoginCancelled(QPair tracker); + + public slots: + void on_loginButton_clicked(){ + // login + h.set_tracker_login(lineUsername->text().toStdString(), linePasswd->text().toStdString()); + close(); + } + + void on_cancelButton_clicked(){ + // Emit a signal to GUI to stop asking for authentication + emit trackerLoginCancelled(QPair(h, h.status().current_tracker)); + close(); + } +}; + +#endif diff --git a/src/trayicon/trayicon.cpp b/src/trayicon/trayicon.cpp new file mode 100644 index 000000000..27636f24d --- /dev/null +++ b/src/trayicon/trayicon.cpp @@ -0,0 +1,292 @@ +/* + * trayicon.cpp - system-independent trayicon class (adapted from Qt example) + * Copyright (C) 2003 Justin Karneges + * Qt4 port: Stefan Gehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "trayicon.h" + +/*! + \class TrayIcon qtrayicon.h + \brief The TrayIcon class implements an entry in the system tray. +*/ + +/*! + Creates a TrayIcon object. \a parent and \a name are propagated + to the QObject constructor. The icon is initially invisible. + + \sa show +*/ +TrayIcon::TrayIcon( QObject *parent) +: QObject(parent), pop(0), d(0) +{ + v_isWMDock = FALSE; +} + +/*! + Creates a TrayIcon object displaying \a icon and \a tooltip, and opening + \a popup when clicked with the right mousebutton. \a parent and \a name are + propagated to the QObject constructor. The icon is initially invisible. + + \sa show +*/ +TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QMenu *popup, QObject *parent ) +: QObject(parent), pop(popup), pm(icon), tip(tooltip), d(0) +{ + v_isWMDock = FALSE; + + if ( !pm.width() || !pm.height() ) + pm = QPixmap( 16, 16 ); +} + +/*! + Removes the icon from the system tray and frees all allocated resources. +*/ +TrayIcon::~TrayIcon() +{ + sysRemove(); +} + +/*! + Informs the trayicon that the notification owner has probably been changed; + and that it should attempt to register or re-register. +*/ +void TrayIcon::newTrayOwner() +{ + // detach ourself from any existing notification area. + hide(); + // show ourself on the new notification area + show(); +} + + +/*! + Sets the context menu to \a popup. The context menu will pop up when the + user clicks the system tray entry with the right mouse button. +*/ +void TrayIcon::setPopup( QMenu* popup ) +{ + pop = popup; +} + +/*! + Returns the current popup menu. + + \sa setPopup +*/ +QMenu* TrayIcon::popup() const +{ + return pop; +} + +/*! + \property TrayIcon::icon + \brief the system tray icon. +*/ +void TrayIcon::setIcon( const QPixmap &icon ) +{ + //if(!popup()) { + // tip = ""; + //} + + pm = icon; + sysUpdateIcon(); +} + +QPixmap TrayIcon::icon() const +{ + return pm; +} + +/*! + \property TrayIcon::toolTip + \brief the tooltip for the system tray entry + + On some systems, the tooltip's length is limited and will be truncated as necessary. +*/ +void TrayIcon::setToolTip( const QString &tooltip ) +{ + tip = tooltip; + sysUpdateToolTip(); +} + +QString TrayIcon::toolTip() const +{ + return tip; +} + +/*! + Shows the icon in the system tray. + + \sa hide +*/ +void TrayIcon::show() +{ + sysInstall(); +} + +/*! + Hides the system tray entry. +*/ +void TrayIcon::hide() +{ + sysRemove(); +} + +/*! + \reimp +*/ +bool TrayIcon::event( QEvent *e ) +{ + switch ( e->type() ) { + case QEvent::MouseMove: + mouseMoveEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonPress: + mousePressEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonRelease: + mouseReleaseEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonDblClick: + mouseDoubleClickEvent( (QMouseEvent*)e ); + break; + default: + return QObject::event( e ); + } + + return TRUE; +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse move events for the system tray entry. + + \sa mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), QMouseEvent +*/ +void TrayIcon::mouseMoveEvent( QMouseEvent *e ) +{ + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse press events for the system tray entry. + + \sa mouseReleaseEvent(), mouseDoubleClickEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mousePressEvent( QMouseEvent *e ) +{ +#ifndef Q_WS_WIN +// This is for X11, menus appear on mouse press +// I'm not sure whether Mac should be here or below.. Somebody check? + switch ( e->button() ) { + case Qt::RightButton: + if ( pop ) { + pop->popup( e->globalPos() ); + e->accept(); + } + break; + case Qt::LeftButton: + case Qt::MidButton: + emit clicked( e->globalPos(), e->button() ); + break; + default: + break; + } +#endif + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse release events for the system tray entry. + + The default implementations opens the context menu when the entry + has been clicked with the right mouse button. + + \sa setPopup(), mousePressEvent(), mouseDoubleClickEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mouseReleaseEvent( QMouseEvent *e ) +{ +#ifdef Q_WS_WIN +// This is for Windows, where menus appear on mouse release + switch ( e->button() ) { + case Qt::RightButton: + if ( pop ) { + // Necessary to make keyboard focus + // and menu closing work on Windows. + pop->activateWindow(); + pop->popup( e->globalPos() ); + pop->activateWindow(); + e->accept(); + } + break; + case Qt::LeftButton: + case Qt::MidButton: + emit clicked( e->globalPos(), e->button() ); + break; + default: + break; + } +#endif + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse double click events for the system tray entry. + + Note that the system tray entry gets a mousePressEvent() and a + mouseReleaseEvent() before the mouseDoubleClickEvent(). + + \sa mousePressEvent(), mouseReleaseEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mouseDoubleClickEvent( QMouseEvent *e ) +{ + if ( e->button() == Qt::LeftButton ) + emit doubleClicked( e->globalPos() ); + e->accept(); +} + +/*! + \fn void TrayIcon::clicked( const QPoint &p ) + + This signal is emitted when the user clicks the system tray icon + with the left mouse button, with \a p being the global mouse position + at that moment. +*/ + +/*! + \fn void TrayIcon::doubleClicked( const QPoint &p ) + + This signal is emitted when the user double clicks the system tray + icon with the left mouse button, with \a p being the global mouse position + at that moment. +*/ + +void TrayIcon::gotCloseEvent() +{ + closed(); +} diff --git a/src/trayicon/trayicon.h b/src/trayicon/trayicon.h new file mode 100644 index 000000000..a51874a38 --- /dev/null +++ b/src/trayicon/trayicon.h @@ -0,0 +1,98 @@ +/* + * trayicon.h - system-independent trayicon class (adapted from Qt example) + * Copyright (C) 2003 Justin Karneges + * Qt4 port: Stefan Gehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_TRAYICON_H +#define CS_TRAYICON_H + +#include +#include +#include +#include +#include + +class QPopupMenu; + +class TrayIcon : public QObject +{ + Q_OBJECT + + Q_PROPERTY( QString toolTip READ toolTip WRITE setToolTip ) + Q_PROPERTY( QPixmap icon READ icon WRITE setIcon ) + +public: + TrayIcon( QObject *parent = 0 ); + TrayIcon( const QPixmap &, const QString &, QMenu *popup = 0, QObject *parent = 0); + ~TrayIcon(); + + // use WindowMaker dock mode. ignored on non-X11 platforms + void setWMDock(bool use) { v_isWMDock = use; } + bool isWMDock() { return v_isWMDock; } + + // Set a popup menu to handle RMB + void setPopup( QMenu * ); + QMenu* popup() const; + + QPixmap icon() const; + QString toolTip() const; + + void gotCloseEvent(); + +public slots: + void setIcon( const QPixmap &icon ); + void setToolTip( const QString &tip ); + + void show(); + void hide(); + + void newTrayOwner(); + +signals: + void clicked( const QPoint&, int); + void doubleClicked( const QPoint& ); + void closed(); + +protected: + bool event( QEvent * ); + virtual void mouseMoveEvent( QMouseEvent *e ); + virtual void mousePressEvent( QMouseEvent *e ); + virtual void mouseReleaseEvent( QMouseEvent *e ); + virtual void mouseDoubleClickEvent( QMouseEvent *e ); + +private: + QMenu *pop; + QPixmap pm; + QString tip; + bool v_isWMDock; + + // system-dependant part +public: + class TrayIconPrivate; +private: + TrayIconPrivate *d; + void sysInstall(); + void sysRemove(); + void sysUpdateIcon(); + void sysUpdateToolTip(); + + friend class TrayIconPrivate; +}; + +#endif // CS_TRAYICON_H diff --git a/src/trayicon/trayicon.pri b/src/trayicon/trayicon.pri new file mode 100644 index 000000000..ac2ec6f17 --- /dev/null +++ b/src/trayicon/trayicon.pri @@ -0,0 +1,21 @@ +HEADERS += $$TRAYICON_CPP/trayicon.h +SOURCES += $$TRAYICON_CPP/trayicon.cpp +QT += xml + +unix:!mac { + SOURCES += $$TRAYICON_CPP/trayicon_x11.cpp +} +win32: { + SOURCES += $$TRAYICON_CPP/trayicon_win.cpp + win32-g++: { + # Probably MinGW + LIBS += libgdi32 libuser32 libshell32 + } + else { + # Assume msvc compiler + LIBS += Gdi32.lib User32.lib shell32.lib + } +} +mac: { + SOURCES += $$TRAYICON_CPP/trayicon_mac.cpp +} diff --git a/src/trayicon/trayicon_mac.cpp b/src/trayicon/trayicon_mac.cpp new file mode 100644 index 000000000..23bf1640d --- /dev/null +++ b/src/trayicon/trayicon_mac.cpp @@ -0,0 +1,17 @@ +#include "trayicon.h" + +void TrayIcon::sysInstall() +{ +} + +void TrayIcon::sysRemove() +{ +} + +void TrayIcon::sysUpdateIcon() +{ +} + +void TrayIcon::sysUpdateToolTip() +{ +} diff --git a/src/trayicon/trayicon_win.cpp b/src/trayicon/trayicon_win.cpp new file mode 100644 index 000000000..04f26d90e --- /dev/null +++ b/src/trayicon/trayicon_win.cpp @@ -0,0 +1,243 @@ +/* + * trayicon_win.cpp - Windows trayicon, adapted from Qt example + * Copyright (C) 2003 Justin Karneges + * Qt4 port: Stefan Gehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "trayicon.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static uint WM_TASKBARCREATED = 0; +#define WM_NOTIFYICON (WM_APP+101) + +typedef BOOL (WINAPI *PtrShell_NotifyIcon)(DWORD,PNOTIFYICONDATA); +static PtrShell_NotifyIcon ptrShell_NotifyIcon = 0; + +static void resolveLibs() +{ + QLibrary lib("shell32"); + //lib.setAutoUnload( FALSE ); + static bool triedResolve = FALSE; + if ( !ptrShell_NotifyIcon && !triedResolve ) + { + triedResolve = TRUE; + ptrShell_NotifyIcon = (PtrShell_NotifyIcon) lib.resolve( "Shell_NotifyIconW" ); + } +} + + +class TrayIcon::TrayIconPrivate : public QWidget +{ +public: + HICON hIcon; + TrayIcon *iconObject; + + TrayIconPrivate( TrayIcon *object ) : QWidget( 0 ), + hIcon( 0 ), iconObject( object ) + { + if ( !WM_TASKBARCREATED ) + WM_TASKBARCREATED = RegisterWindowMessage( TEXT("TaskbarCreated") ); + } + + ~TrayIconPrivate() + { + if ( hIcon ) + { + DestroyIcon( hIcon ); + hIcon = 0; + } + } + + // the unavoidable A/W versions. Don't forget to keep them in sync! + bool trayMessageA( DWORD msg ) + { + NOTIFYICONDATAA tnd; + ZeroMemory( &tnd, sizeof(NOTIFYICONDATAA) ); + tnd.cbSize = sizeof(NOTIFYICONDATAA); + tnd.hWnd = winId(); + tnd.uID = 1; + + if ( msg != NIM_DELETE ) + { + tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; + tnd.uCallbackMessage = WM_NOTIFYICON; + tnd.hIcon = hIcon; + + if ( !iconObject->toolTip().isNull() ) + { + // Tip is limited to 63 + NULL; lstrcpyn appends a NULL terminator. + QString tip = iconObject->toolTip().left( 63 ) + QChar(); + lstrcpynA(tnd.szTip, (const char*)tip.toLocal8Bit(), qMin( tip.length()+1, 64 ) ); + } + } + return Shell_NotifyIconA(msg, &tnd); + } // trayMessageA + +#ifdef UNICODE + bool trayMessageW( DWORD msg ) + { + resolveLibs(); + if ( ! (ptrShell_NotifyIcon && QSysInfo::WindowsVersion & QSysInfo::WV_NT_based) ) + return trayMessageA( msg ); + + NOTIFYICONDATAW tnd; + ZeroMemory( &tnd, sizeof(NOTIFYICONDATAW) ); + tnd.cbSize = sizeof(NOTIFYICONDATAW); + tnd.hWnd = winId(); + tnd.uID = 1; + + if ( msg != NIM_DELETE ) + { + tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; + tnd.uCallbackMessage = WM_NOTIFYICON; + tnd.hIcon = hIcon; + + if ( !iconObject->toolTip().isNull() ) + { + // Tip is limited to 63 + NULL; lstrcpyn appends a NULL terminator. + QString tip = iconObject->toolTip().left( 63 ) + QChar(); + lstrcpynW(tnd.szTip, (TCHAR*)tip.unicode(), qMin( tip.length()+1, 64 ) ); + } + } + return ptrShell_NotifyIcon(msg, &tnd); + } // trayMessageW +#endif + + bool trayMessage( DWORD msg ) + { + QT_WA(return trayMessageW(msg);, return trayMessageA(msg);) + } + + bool iconDrawItem(LPDRAWITEMSTRUCT lpdi) + { + if (!hIcon) + return FALSE; + + DrawIconEx(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon, 0, 0, 0, NULL, DI_NORMAL ); + return TRUE; + } + + bool winEvent( MSG * m, long * result ) + { + switch(m->message) + { + case WM_DRAWITEM: + return iconDrawItem( (LPDRAWITEMSTRUCT)m->lParam ); + case WM_NOTIFYICON: + { + QMouseEvent *e = 0; + QPoint gpos = QCursor::pos(); + switch (m->lParam) { + case WM_MOUSEMOVE: e = new QMouseEvent( QEvent::MouseMove, mapFromGlobal( gpos ), gpos, Qt::NoButton, Qt::NoButton, QApplication::keyboardModifiers() ); break; + case WM_LBUTTONDOWN: e = new QMouseEvent( QEvent::MouseButtonPress, mapFromGlobal( gpos ), gpos, Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers() ); break; + case WM_LBUTTONUP: e = new QMouseEvent( QEvent::MouseButtonRelease, mapFromGlobal( gpos ), gpos, Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers() ); break; + case WM_LBUTTONDBLCLK: e = new QMouseEvent( QEvent::MouseButtonDblClick, mapFromGlobal( gpos ), gpos, Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers() ); break; + case WM_RBUTTONDOWN: e = new QMouseEvent( QEvent::MouseButtonPress, mapFromGlobal( gpos ), gpos, Qt::RightButton, Qt::RightButton, QApplication::keyboardModifiers() ); break; + case WM_RBUTTONUP: e = new QMouseEvent( QEvent::MouseButtonRelease, mapFromGlobal( gpos ), gpos, Qt::RightButton, Qt::RightButton, QApplication::keyboardModifiers() ); break; + case WM_RBUTTONDBLCLK: e = new QMouseEvent( QEvent::MouseButtonDblClick, mapFromGlobal( gpos ), gpos, Qt::RightButton, Qt::RightButton, QApplication::keyboardModifiers() ); break; + case WM_MBUTTONDOWN: e = new QMouseEvent( QEvent::MouseButtonPress, mapFromGlobal( gpos ), gpos, Qt::MidButton, Qt::MidButton, QApplication::keyboardModifiers() ); break; + case WM_MBUTTONUP: e = new QMouseEvent( QEvent::MouseButtonRelease, mapFromGlobal( gpos ), gpos, Qt::MidButton, Qt::MidButton, QApplication::keyboardModifiers() ); break; + case WM_MBUTTONDBLCLK: e = new QMouseEvent( QEvent::MouseButtonDblClick, mapFromGlobal( gpos ), gpos, Qt::MidButton, Qt::MidButton, QApplication::keyboardModifiers() ); break; + case WM_CONTEXTMENU: e = new QMouseEvent( QEvent::MouseButtonRelease, mapFromGlobal( gpos ), gpos, Qt::RightButton, Qt::RightButton, QApplication::keyboardModifiers() ); break; + } + + if ( e ) + { + bool res = QApplication::sendEvent( iconObject, e ); + delete e; + return res; + } + } + break; + + default: + if ( m->message == WM_TASKBARCREATED ) + trayMessage( NIM_ADD ); + } + return QWidget::winEvent( m, result ); + } // winEvent +}; // class TrayIcon::TrayIconPrivate + + +static HICON createIcon( const QPixmap &pm ) +{ + ICONINFO iconInfo; + iconInfo.fIcon = true; + iconInfo.hbmMask = pm.createMaskFromColor(Qt::black).toWinHBITMAP(); + iconInfo.hbmColor = pm.toWinHBITMAP(QPixmap::PremultipliedAlpha); + + HICON icon = CreateIconIndirect( &iconInfo ); + + DeleteObject(iconInfo.hbmMask); + iconInfo.hbmMask = 0; + + DeleteObject(iconInfo.hbmColor); + iconInfo.hbmColor = 0; + + return icon; +} + +void TrayIcon::sysInstall() +{ + if ( !d ) + { + d = new TrayIconPrivate( this ); + d->hIcon = createIcon( pm ); + d->trayMessage( NIM_ADD ); + } +} + +void TrayIcon::sysRemove() +{ + if ( d ) + { + d->trayMessage( NIM_DELETE ); + delete d; + d = 0; + } +} + +void TrayIcon::sysUpdateIcon() +{ + if ( d ) + { + if ( d->hIcon ) + { + DestroyIcon( d->hIcon ); + d->hIcon = 0; + } + d->hIcon = createIcon( pm ); + d->trayMessage( NIM_MODIFY ); + } +} + +void TrayIcon::sysUpdateToolTip() +{ + if ( d ) + d->trayMessage( NIM_MODIFY ); +} diff --git a/src/trayicon/trayicon_x11.cpp b/src/trayicon/trayicon_x11.cpp new file mode 100644 index 000000000..09940b5c4 --- /dev/null +++ b/src/trayicon/trayicon_x11.cpp @@ -0,0 +1,458 @@ +/* + * trayicon_x11.cpp - X11 trayicon (for use with KDE and GNOME) + * Copyright (C) 2003 Justin Karneges + * GNOME2 Notification Area support: Tomasz Sterna + * Qt4 port: Stefan Gehn + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "trayicon.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//---------------------------------------------------------------------------- +// common stuff +//---------------------------------------------------------------------------- + +// for Gnome2 Notification Area +static XErrorHandler old_handler = 0; +static int dock_xerror = 0; +extern "C" int dock_xerrhandler(Display* dpy, XErrorEvent* err) +{ + dock_xerror = err->error_code; + return old_handler(dpy, err); +} + +static void trap_errors() +{ + dock_xerror = 0; + old_handler = XSetErrorHandler(dock_xerrhandler); +} + +static bool untrap_errors() +{ + XSetErrorHandler(old_handler); + return (dock_xerror == 0); +} + +static bool send_message( + Display* dpy, /* display */ + Window w, /* sender (tray icon window) */ + long message, /* message opcode */ + long data1, /* message data 1 */ + long data2, /* message data 2 */ + long data3 /* message data 3 */ +) +{ + XEvent ev; + + memset(&ev, 0, sizeof(ev)); + ev.xclient.type = ClientMessage; + ev.xclient.window = w; + ev.xclient.message_type = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + ev.xclient.format = 32; + ev.xclient.data.l[0] = CurrentTime; + ev.xclient.data.l[1] = message; + ev.xclient.data.l[2] = data1; + ev.xclient.data.l[3] = data2; + ev.xclient.data.l[4] = data3; + + trap_errors(); + XSendEvent(dpy, w, False, NoEventMask, &ev); + XSync(dpy, False); + return untrap_errors(); +} + +#define SYSTEM_TRAY_REQUEST_DOCK 0 +//#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +//#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +//---------------------------------------------------------------------------- +// TrayIcon::TrayIconPrivate +//---------------------------------------------------------------------------- + +class TrayIcon::TrayIconPrivate : public QWidget +{ +public: + TrayIconPrivate(TrayIcon *object, int size); + ~TrayIconPrivate() { } + + virtual void initWM(WId icon); + virtual void setPixmap(const QPixmap &pm); + virtual void paintEvent(QPaintEvent *); + virtual void enterEvent(QEvent *); + virtual void mouseMoveEvent(QMouseEvent *e); + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + virtual void mouseDoubleClickEvent(QMouseEvent *e); + virtual void closeEvent(QCloseEvent *e); + + void updateMask(); + +private: + TrayIcon *iconObject; + QPixmap pix; + int size; +}; + +TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size) + : QWidget(0/*, Qt::WRepaintNoErase*/) +{ + setObjectName(QCoreApplication::instance()->applicationName() + "dock"); + iconObject = object; + size = _size; + + setFocusPolicy(Qt::NoFocus); + +// setBackgroundMode(Qt::X11ParentRelative); + setAttribute(Qt::WA_NoSystemBackground); + setBackgroundRole(QPalette::NoRole); + + // This resize will not work as expected, + // we will get resized inside the tray later on. +// resize(size, size); + setMinimumSize(size, size); + setMaximumSize(size, size); +} + +// This base stuff is required by both FreeDesktop specification and WindowMaker +void TrayIcon::TrayIconPrivate::initWM(WId icon) +{ + Display *dsp = QX11Info::display(); + WId leader = winId(); + char *resName = objectName().toLocal8Bit().data(); + char *resClass = QCoreApplication::instance()->applicationName().toLocal8Bit().data(); + + // set the class hint + XClassHint classhint; + classhint.res_name = resName; + classhint.res_class = resClass; + XSetClassHint(dsp, leader, &classhint); + + // set the Window Manager hints + XWMHints *hints; + hints = XGetWMHints(dsp, leader); // init hints + hints->flags = WindowGroupHint | IconWindowHint | StateHint; + hints->window_group = leader; + hints->initial_state = WithdrawnState; + hints->icon_window = icon; // in WM, this should be winId() of separate widget + hints->icon_x = 0; + hints->icon_y = 0; + XSetWMHints(dsp, leader, hints); // set the window hints for WM to use. + XFree(hints); +} + +void TrayIcon::TrayIconPrivate::setPixmap(const QPixmap &pm) +{ + QBitmap mask( QWidget::size() ); + + if( pm.size() != QWidget::size() ) { + // let's make a new mask + mask.fill(Qt::color0); + QPainter maskPainter(&mask); + + // draw the old mask in the center + maskPainter.drawPixmap((width() - pm.width() ) / 2, + (height() - pm.height()) / 2, pm.mask()); + + QPixmap newPix(QWidget::size()); + QPainter pixPainter( &newPix ); + + // draw the old pixmap in the center + pixPainter.drawPixmap((width() - pm.width())/2, + (height() - pm.height())/2, pm); + newPix.setMask(mask); + pix = newPix; + } else { + pix = pm; + mask = pm.mask(); + } + + setMask(mask); + setWindowIcon(pix); + repaint(); +} + +void TrayIcon::TrayIconPrivate::updateMask() +{ + if (!pix.isNull()) + { + QBitmap mask(width(), height()); + mask.clear(); + QPainter mp(&mask); + mp.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix.mask()); + mp.end(); + setMask(mask); + } +} + +void TrayIcon::TrayIconPrivate::paintEvent(QPaintEvent *) +{ + QPainter p(this); +// p.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix); + p.drawPixmap(0, 0, pix); +} + +void TrayIcon::TrayIconPrivate::enterEvent(QEvent *e) +{ + // Taken from KSystemTray.. +/*#if QT_VERSION < 0x030200 + if ( !qApp->focusWidget() ) + {*/ + XEvent ev; + memset(&ev, 0, sizeof(ev)); + ev.xfocus.display = QX11Info::display(); + ev.xfocus.type = FocusIn; + ev.xfocus.window = winId(); + ev.xfocus.mode = NotifyNormal; + ev.xfocus.detail = NotifyAncestor; + + unsigned long oldTime = QX11Info::appTime(); + QX11Info::setAppTime(1); + qApp->x11ProcessEvent( &ev ); + QX11Info::setAppTime(oldTime); + + /*} +#endif*/ + + QWidget::enterEvent(e); +} + +void TrayIcon::TrayIconPrivate::mouseMoveEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mousePressEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mouseReleaseEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mouseDoubleClickEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::closeEvent(QCloseEvent *e) +{ + iconObject->gotCloseEvent(); + e->accept(); +} + +//---------------------------------------------------------------------------- +// TrayIconFreeDesktop +//---------------------------------------------------------------------------- + +class TrayIconFreeDesktop : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm); +protected: + virtual bool x11Event(XEvent*); +}; + +TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 22) +{ + initWM( winId() ); + + // initialize NetWM + Display *dsp = QX11Info::display(); + + // dock the widget (adapted from SIM-ICQ) + Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen + int screen_id = XScreenNumberOfScreen(screen); // and it's number + + // tell X that we want to see ClientMessage and Deleted events, which + // are picked up by QApplication::x11EventFilter + Window root_window = QApplication::desktop()->winId(); + XWindowAttributes attr; + + XGetWindowAttributes(dsp, root_window, &attr); + XSelectInput(dsp, root_window, attr.your_event_mask | StructureNotifyMask); + + char buf[32]; + snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); + Atom selection_atom = XInternAtom(dsp, buf, false); + XGrabServer(dsp); + Window manager_window = XGetSelectionOwner(dsp, selection_atom); + if ( manager_window != None ) + XSelectInput(dsp, manager_window, StructureNotifyMask); + XUngrabServer(dsp); + XFlush(dsp); + + if ( manager_window != None ) + { + send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0); + } + else + { + object->hide(); + return; + } + + // some KDE mumbo-jumbo... why is it there? anybody? + Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false); + Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); + + long data = 0; + XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1); + XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1); + + setPixmap(pm); +} + +bool TrayIconFreeDesktop::x11Event(XEvent *ev) +{ + switch(ev->type) + { + case ReparentNotify: + setUpdatesEnabled(false); + show(); + updateMask(); + setUpdatesEnabled(true); + } + return false; +} + +//---------------------------------------------------------------------------- +// TrayIconWindowMaker +//---------------------------------------------------------------------------- + +class TrayIconWharf : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconWharf(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 44) + { + char *resName = QString(objectName() + "-wharf").toLocal8Bit().data(); + char *resClass = QCoreApplication::instance()->applicationName().toLocal8Bit().data(); + + // set the class hint + XClassHint classhint; + classhint.res_name = resName; + classhint.res_class = resClass; + XSetClassHint(QX11Info::display(), winId(), &classhint); + + setPixmap(pm); + } + + void setPixmap(const QPixmap &_pm){ + QPixmap pm; + QImage i = _pm.toImage(); + i = i.scaled(i.width() * 2, i.height() * 2); + pm.fromImage(i); + + TrayIconPrivate::setPixmap(pm); + + // thanks to Robert Spier for this: + // for some reason the repaint() isn't being honored, or isn't for + // the icon. So force one on the widget behind the icon +// erase(); + QPaintEvent pe( rect() ); + paintEvent(&pe); + } +}; + +class TrayIconWindowMaker : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm); + ~TrayIconWindowMaker(); + + void setPixmap(const QPixmap &pm); + +private: + TrayIconWharf *wharf; +}; + +TrayIconWindowMaker::TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 32) +{ + wharf = new TrayIconWharf(object, pm); + initWM( wharf->winId() ); +} + +TrayIconWindowMaker::~TrayIconWindowMaker() +{ + delete wharf; +} + +void TrayIconWindowMaker::setPixmap(const QPixmap &pm) +{ + wharf->setPixmap(pm); +} + +//---------------------------------------------------------------------------- +// TrayIcon +//---------------------------------------------------------------------------- + +void TrayIcon::sysInstall() +{ + if ( d ) + return; + if ( v_isWMDock ) + d = (TrayIconPrivate *)(new TrayIconWindowMaker(this, pm)); + else + d = (TrayIconPrivate *)(new TrayIconFreeDesktop(this, pm)); + + sysUpdateToolTip(); + + if ( v_isWMDock ) + d->show(); +} + +void TrayIcon::sysRemove() +{ + if ( !d ) + return; + delete d; + d = 0; +} + +void TrayIcon::sysUpdateIcon() +{ + if ( !d ) + return; + QPixmap pix = pm; + d->setPixmap(pix); +} + +void TrayIcon::sysUpdateToolTip() +{ + if ( !d ) + return; + if ( tip.isEmpty() ) + d->setToolTip(QString::null); + else + d->setToolTip(tip); +} diff --git a/src/update_qrc_files.py b/src/update_qrc_files.py new file mode 100755 index 000000000..03e6dcc2c --- /dev/null +++ b/src/update_qrc_files.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Small script to update qrc files (lang.qrc, icons.qrc) +# by Christophe Dumez + +import os +from os.path import splitext, join + +# update languages files directory +languages_list = [x for x in os.listdir('lang') if x.endswith('.qm')] +output = ''' + +''' +for language in languages_list: + output += ' %s'%('lang'+os.sep+language) + output += os.linesep +output += ''' +''' +lang_file = open('lang.qrc', 'w') +lang_file.write(output) +lang_file.close() + +# update icons files directory +icons_list = [] +for root, dirs, files in os.walk('Icons'): + if 'skin_unused' in dirs: + dirs.remove('skin_unused') + for file in files: + if splitext(file)[-1] in ('.png', '.jpg'): + icons_list.append(join(root, file)) + +output = ''' + +''' +for icon in icons_list: + output += ' %s'%(icon) + output += os.linesep +output += ''' +''' +icons_file = open('icons.qrc', 'w') +icons_file.write(output) +icons_file.close() + diff --git a/testpython.py b/testpython.py new file mode 100755 index 000000000..0c6e3297e --- /dev/null +++ b/testpython.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +# Test imports needed by our python search engine nova.py +# Christophe Dumez - chris@qbittorrent.org + +import sys +import urllib +import sgmllib +from xml.dom import minidom + +if __name__ == '__main__': + pass